MongoDB Text Search

MongoDB Text Search technique finds a piece of text or a specified word from the string fields. It enables users to search for specific words or phrases within text fields efficiently.

The text index and $text operator perform text search in MongoDB, providing a powerful way to search for textual data in MongoDB collections.

Text index

Text indexes in MongoDB are to find the specified text from the string content. Text indexes should be either a string or an array of string elements.

When you perform a text search query always remember that your collection must contain a text index and a collection can only contain one text index but this single text index covers multiple fields.

To create a text index in MongoDB use the createIndex() method. 

Syntax

The syntax to use the MongoDB createIndex() method is:

db.collectionName.createIndex( { field: “text” } )

$text Operator

$text operator in MongoDB is used to search the text index. This operator performs text search operations on the collection with a text index.

This operator tokenizes each search string with whitespace and treats most punctuations as delimiters except – and \”. After tokenizing the search string it performs a logical OR operation on the tokens. If you want to sort the resultant documents then use the $meta query operator.

Syntax:

The syntax to use $text operator in MongoDB is:

$text:
{
     $search: <string>,
     $language: <string>,
     $caseSensitive: <boolean>,
     $diacriticSensitive: <boolean>
}

How to Perform Text Search MongoDB

MongoDB Text Search operation is very important operation :

Step 1: First, we create a collection and add some documents to the collection:  

In the following example, we are working with:

Database: gfg
Collection: content
Document: The content collection contains the three documents.

Step 2: Create index

Now we create a string index on the name and pet field with the help of the createIndex() method. So we can search text over the name and line fields:

Query:

db.content.createIndex({name:"text",line:"text"})

Output:

Step 3: Search Text

Now we are ready to search text. For example, we are going to search all the document which contain text love.

Query:

db.content.find({$text:{$search:"love"}})  

Note: $text is a query operator that performs text searches on a collection with a text index.

Output:

MongoDB Text Search Example

One more example in which we are going to search all the document which contain dog text:

Query:

db.content.find({$text:{$search:"dog"}})

Output:

Phrase Search in MongoDB

Instead of searching a single word you are also allowed to search for a phrase by wrapping the phrase in double quotes(“”). Generally, the phrase search performs OR operation in between the specified keywords.

For example, the phrase is “I like Mango”, then phase search looks for all the documents that contain keywords either I, like, or Mango. And if you want to perform an exact phrase search then wrap the phase in between escaped double quotes(\”).

MongoDB Phrase search Syntax:

db.collectionName.find({$text:{$search:”Phrase”}})

MongoDB Exact Phrase Search Syntax:

db.collectionName.find({$text:{$search:”\”Phrase”\”}})

MongoDB Phrase Search Example

Let’s look at some examples of phrase search in MongoDB, to understand this concept better.

In the following examples, we are working with:

Database: gfg
Collection: content
Document: The content collection contains the three documents.

Find the Phrase Example

In this example, we search for the phrase “I love dogs”. So, in the result, we get all the documents that contain keywords I, love, or dogs.

Query:

db.content.find({$text:{$search:"I love dogs"}})

Output:

Find Exact Phrase Example

In this example, we search for the exact phrase by wrapping the phase in between escaped double quotes(\”).i.e., “\”I love dogs\””. So, in the result, we only get those documents that contain the specified exact phrase

Query:

db.content.find({$text:{$search:"\"I love dogs\""}})

Output:

How to Exclude a Term From the Text Search?

Exclusion of term means when you perform search operation and do not want to display the document that contains the specified term, so you can exclude the term by prefixing a search keyword with the minus sign(-).

Using minus sign(-) you can exclude all the documents that contain excluded term. For example, you want to display all the documents that contain the keyword “Car” but not the “Cycle” keyword so you can use the following query:

dn.collectionName.find({$text:{$search:"Car -Cycle"}})

Exclude a Term From the Text Search Example

Let’s look at some examples of excluding a term from text search in MongoDB to understand the concept better.

In the following example, we are working with:

Database: gfg
Collection: content
Document: The content collection contains the three documents.

In this example, we only display those documents that contain dog not cow

Query:

db.content.find({$text:{$search:"dog -cow"}})

Output:

MongoDB Text Search In Aggregation Pipeline

We can search text using the aggregation pipeline with the help of the $text query operator in the $match stage. But there are some restrictions for using the $text operator:

  • The first stage in the pipeline must be the $match stage that contains the $text operator.
  • Only once in the stage will a text operator occur.
  • The expression of the text operator cannot appear in expressions of $or or $not.
  • By default, the text search does not return matching documents in the order of the matched scores. If you want to sort in descending score, then use the $meta aggregation expression in the $sort stage.

Note: Text score is a score that is assigned to each document that holds the search term in the index field by the $text operator. The score reflects a document’s importance to a given text search query.

Text Search in Aggregation Pipeline Example

In the following example, we are working with:

Database: gfg
Collection: people
Document: The people collection contains the five documents.

Example 1

In this example, we count the number of the document in which pet value is a cat:

Query:

db.people.aggregate([{$match:{$text:{$search:"Cat"}}},
{$group:{_id:null,total:{$sum:1}}}])

Output:

Example 2

In this example, we count the number of the document in which pet value is a dog:

Query:

db.people.aggregate([{$match:{$text:{$search:"Dog"}}},
{$group:{_id:null,total:{$sum:1}}}])

Output:

Example 3

In this example, we return the Sorted result by using text score. We return the result(all the documents that contain the specified text,i.e., “Dog”) in the sorted form using textScore

Query:

db.people.aggregate([{$match:{$text:{$search:"Dog"}}},
{$sort:{score:{$meta:"textScore"}}},
{$project:{_id:0,name:1}}])

Output:

Conclusion

In this guide, we have covered various techniques for text search in MongoDB. We have explained methods like text index & text operator to search text and phrases. We also checked text search using aggregation pipelines.

These methods are very easy to use, and we have explained them in a very easy way with their examples. Using these methods, you can search text and phrases in MongoDB.