4.4 Query operator $text

The query operator $text performs a text search on the content of the fields indexed with a text index. A $text expression has the following syntax:

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

where $search is a string of terms that MongoDB parses and uses to query the text index; $language, optional, is the language that determines the list of stop words for the search and the rules for the stemmer and tokenizer; $caseSensitive, optional, is a boolean flag to enable or disable case sensitive search (defaults to false, i.e., case insensitivity); $diacriticSensitive, optional, is a boolean flag to enable or disable diacritic sensitive search (defaults to false; i.e., diacritic insensitivity).

The index is created using the createIndex() method, , which has the following definition:

db.collection.createIndex(keys, options)

where keys is a document that contains the field and value pairs where the field is the index key and the value describes the type of index for that field (the value is 1 for ascending and -1 descending index); options, opcional, is a document that contains a set of options that controls the creation of the index.

To create the text index for the titlecontent and slug fields, was used the method:

> db.pages.createIndex( { title: "text", content: "text", slug: "text" } );
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}
>

To display the existing indexes was used the method:

> db.pages.getIndexes();
[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "reficio.pages"
        },
        {
                "v" : 2,
                "key" : {
                        "_fts" : "text",
                        "_ftsx" : 1
                },
                "name" : "title_text_content_text_slug_text",
                "ns" : "reficio.pages",
                "weights" : {
                        "content" : 1,
                        "slug" : 1,
                        "title" : 1
                },
                "default_language" : "english",
                "language_override" : "language",
                "textIndexVersion" : 3
        }
]
>

4.4.1 – Display the titles of all documents containing the words Pão or Açúcar

> db.pages.find( { $text: { $search: "Pão Açúcar" } } , { title: 1} );
{ "_id" : ObjectId("5afc06e526b24ab3365073a4"), "title" : "Pão de Açúcar" }
{ "_id" : ObjectId("5afc06e526b24ab336507355"), "title" : "O Pão de Açúcar" }
{ "_id" : ObjectId("5afc06e526b24ab3365073da"), "title" : "Caminho do Pão de Açúcar" }
{ "_id" : ObjectId("5afc06e526b24ab336507353"), "title" : "Caminho Aéreo do Pão de Açúcar" }
{ "_id" : ObjectId("5afc06e526b24ab336507294"), "title" : "Primeiras Escaladas do Pão de Açúcar" }
{ "_id" : ObjectId("5afc06e526b24ab33650742a"), "title" : "Morro da Urca e Pão de Açúcar" }
{ "_id" : ObjectId("5afc06e526b24ab33650742b"), "title" : "Imagens da Praia Vermelha, Urca, Morro da Urca e Pão de Açúcar" }
{ "_id" : ObjectId("5afc06e526b24ab3365073cd"), "title" : "20 de agosto de 1823, Cavalgada até Santa Cruz" }
{ "_id" : ObjectId("5afc06e526b24ab3365072a7"), "title" : "Excursão Presidencial ao Morro da Urca" }
{ "_id" : ObjectId("5afc06e526b24ab3365072fb"), "title" : "Viagem de Niterói a Nova Friburgo" }
{ "_id" : ObjectId("5afc06e526b24ab3365073ac"), "title" : "Salvador" }
{ "_id" : ObjectId("5afc06e526b24ab336507311"), "title" : "Escola Militar" }
{ "_id" : ObjectId("5afc06e526b24ab3365072bf"), "title" : "Copacabana" }
{ "_id" : ObjectId("5afc06e526b24ab336507260"), "title" : "Santa Teresa – A Nova Linha" }
{ "_id" : ObjectId("5afc06e526b24ab336507331"), "title" : "São Roque" }
{ "_id" : ObjectId("5afc06e526b24ab3365073d5"), "title" : "Descrição do Rio de Janeiro" }
{ "_id" : ObjectId("5afc06e526b24ab3365073d4"), "title" : "São João del Rei" }
{ "_id" : ObjectId("5afc06e526b24ab3365073d6"), "title" : "Ouro Preto" }
{ "_id" : ObjectId("5afc06e526b24ab3365073d3"), "title" : "Viagem a Vila Rica e Mariana" }
{ "_id" : ObjectId("5afc06e526b24ab336507481"), "title" : "Zona Sul da Cidade do Rio de Janeiro" }
Type "it" for more
>

Note that the search was done on all three indexed fields, not just the title of the document.

4.4.2 – Displays the titles of all documents that contain the exact text Morro da Viúva

> db.pages.find( { $text: { $search: "\"Morro da Viúva\"" } } , { title: 1} )
{ "_id" : ObjectId("5afc06e526b24ab33650723d"), "title" : "Morro da Viúva" }
{ "_id" : ObjectId("5afc06e526b24ab33650723c"), "title" : "Morro da Viúva" }
{ "_id" : ObjectId("5afc06e526b24ab33650742a"), "title" : "Morro da Urca e Pão de Açúcar" }
{ "_id" : ObjectId("5afc06e526b24ab336507278"), "title" : "Os Fundadores da Glória, O Ermitão Caminha" }
{ "_id" : ObjectId("5afc06e526b24ab3365073fd"), "title" : "Segunda medição começada em 16 de Outubro de 1753, e concluida em 2 de Setembro de 1754" }
{ "_id" : ObjectId("5afc06e526b24ab3365072bf"), "title" : "Copacabana" }
{ "_id" : ObjectId("5afc06e526b24ab33650734e"), "title" : "O Centenário" }
{ "_id" : ObjectId("5afc06e526b24ab3365073a4"), "title" : "Pão de Açúcar" }
{ "_id" : ObjectId("5afc06e526b24ab336507478"), "title" : "Índice Atualizado dos Logradouros (1929)" }
{ "_id" : ObjectId("5afc06e526b24ab33650748c"), "title" : "Cidade" }
{ "_id" : ObjectId("5afc06e526b24ab33650733c"), "title" : "Equipamentos de Ginástica na Praia de Botafogo e no Parque do Flamengo" }
>

4.4.3 – Displays the titles of all documents that contain the exact texts Pão de Açúcar and Lagoa Rodrigo de Freitas

> db.pages.find(
...     { $text: { $search: "\"Pão de Açúcar\" \"Lagoa Rodrigo de Freitas\"" } },
...     { title: 1 }
... );
{ "_id" : ObjectId("5afc06e526b24ab3365072bf"), "title" : "Copacabana" }
{ "_id" : ObjectId("5afc06e526b24ab336507302"), "title" : "Academias da Terceira Idade na Cidade do Rio de Janeiro" }
>

4.4.4 – Displays the titles of all documents that contain the exact text Pão de Açúcar, but do not contain the exact text Morro da Urca, omitting _id

> db.pages.find(
...     { $text: { $search: "\"Pão de Açúcar\" -\"Morro da Urca\"" } },
...     { title: 1, _id: 0 } );
{ "title" : "Escola Militar" }
{ "title" : "Copacabana" }
{ "title" : "Santa Teresa – A Nova Linha" }
{ "title" : "São Roque" }
{ "title" : "Zona Sul da Cidade do Rio de Janeiro" }
{ "title" : "Praia e Ermida de Copacabana" }
{ "title" : "Ilha de Paquetá" }
{ "title" : "Legislativo Municipal" }
{ "title" : "Charita" }
{ "title" : "Academias da Terceira Idade na Cidade do Rio de Janeiro" }
{ "title" : "A Lage" }
{ "title" : "Monumento ao Cristo Redentor" }
{ "title" : "Viagem, Rio de Janeiro e Praia Grande" }
{ "title" : "Palácio Imperial (IV)" }
>

4.4.5 – Execution of the same query as the previous item (4.4.4), but using the method forEach() on the cursor returned by find() to display the title

> db.pages.find(
...     { $text:
...         { $search: "\"Pão de Açúcar\" -\"Morro da Urca\"" }
...     }
... ).forEach( function(p) { print( "Title: " + p.title ); } );
Title: Escola Militar
Title: Copacabana
Title: Santa Teresa – A Nova Linha
Title: São Roque
Title: Zona Sul da Cidade do Rio de Janeiro
Title: Praia e Ermida de Copacabana
Title: Ilha de Paquetá
Title: Legislativo Municipal
Title: Charita
Title: Academias da Terceira Idade na Cidade do Rio de Janeiro
Title: A Lage
Title: Monumento ao Cristo Redentor
Title: Viagem, Rio de Janeiro e Praia Grande
Title: Palácio Imperial (IV)
>

4.4.6 – Displays the titles and scores of all documents that contain the exact text Praia de Copacabana, ordered by score, using the method forEach() on the cursor returned by find()

> db.pages.find (
...     { $text: { $search: "\"Praia de Copacabana\"" } },
...     { score: { $meta: "textScore" } }
... ).sort (
...     { score: { $meta: "textScore" } }
... ).forEach (
...     function(p) { print( "Title: " + p.title + "; Score: " + p.score ); }
... );
Title: Praia e Ermida de Copacabana; Score: 6.685345153808594
Title: Copacabana; Score: 5.27799552416435
Title: Copacabana; Score: 5.263052056759729
Title: Região de Copacabana; Score: 5.164772727272727
Title: Praias da Cidade do Rio de Janeiro; Score: 5.15771647129557
Title: Copacabana no Século Passado (Século XIX); Score: 4.2108025455548965
Title: A Pesca no Rio de Janeiro da Primeira República; Score: 3.924685023365399
Title: Copacabana no Começo do Século (XX); Score: 3.8152667857982494
Title: Índice Atualizado dos Logradouros (1929); Score: 3.013675886553118
>

4. Text Search