4.4 Operador $text

O operador $text do MongoDB realiza uma pesquisa de texto no conteúdo de campos indexados com um índice de texto. Uma expressão $text possui a seguinte sintaxe:

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

onde $search é uma cadeia de caracteres que o MongoDB analisa e usa para consultar o índice; $language é opcional determina as regras para o analizador; $caseSensitive indica se haverá diferenciação entre letras minúsculas e maiúsculas (o padrão é falso); $diacriticSensitive indica se haverá diferenciação entre letras acentuadas e sem acento, (o padrão é falso).

Para criação de índices o MongoDB utiliza o método createIndex(), que possui a seguinte sintaxe:

db.coleção.createIndex(chaves, opções)

onde chaves é um documento contendo pares de campo e valor, em que campo é a chave do índice, e valor descreve o tipo de índice para esse campo; opções, opcional, é um documento contendo um conjunto de opções para controlar a criação do índice.

Para criar índice de texto para os campos titlecontent e slug é utilizado o comando:

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

Para exibir os índices existentes é utilizado o comando:

> 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 – Exibir os títulos de todos os documentos contendo as palavras Pão ou Açúcar

> db.pages.find( { $text: { $search: "Pão Açúcar" } } , { title: 1} );
{ "_id" : ObjectId("5aee02d792b10001bd097c66"), "title" : "Pão de Açúcar" }
{ "_id" : ObjectId("5aee02d792b10001bd097c18"), "title" : "O Pão de Açúcar" }
{ "_id" : ObjectId("5aee02d792b10001bd097c9d"), "title" : "Caminho do Pão de Açúcar" }
{ "_id" : ObjectId("5aee02d792b10001bd097c15"), "title" : "Caminho Aéreo do Pão de Açúcar" }
{ "_id" : ObjectId("5aee02d792b10001bd097b55"), "title" : "Primeiras Escaladas do Pão de Açúcar" }
{ "_id" : ObjectId("5aee02d792b10001bd097cec"), "title" : "Morro da Urca e Pão de Açúcar" }
{ "_id" : ObjectId("5aee02d792b10001bd097cef"), "title" : "Imagens da Praia Vermelha, Urca, Morro da Urca e Pão de Açúcar" }
{ "_id" : ObjectId("5aee02d792b10001bd097c90"), "title" : "20 de agosto de 1823, Cavalgada até Santa Cruz" }
{ "_id" : ObjectId("5aee02d792b10001bd097b6b"), "title" : "Excursão Presidencial ao Morro da Urca" }
{ "_id" : ObjectId("5aee02d792b10001bd097bbe"), "title" : "Viagem de Niterói a Nova Friburgo" }
{ "_id" : ObjectId("5aee02d792b10001bd097c6e"), "title" : "Salvador" }
{ "_id" : ObjectId("5aee02d792b10001bd097bd4"), "title" : "Escola Militar" }
{ "_id" : ObjectId("5aee02d792b10001bd097b83"), "title" : "Copacabana" }
{ "_id" : ObjectId("5aee02d792b10001bd097b20"), "title" : "Santa Teresa &#8211; A Nova Linha" }
{ "_id" : ObjectId("5aee02d792b10001bd097bf4"), "title" : "São Roque" }
{ "_id" : ObjectId("5aee02d792b10001bd097c97"), "title" : "Descrição do Rio de Janeiro" }
{ "_id" : ObjectId("5aee02d792b10001bd097c96"), "title" : "São João del Rei" }
{ "_id" : ObjectId("5aee02d792b10001bd097c98"), "title" : "Ouro Preto" }
{ "_id" : ObjectId("5aee02d792b10001bd097c95"), "title" : "Viagem a Vila Rica e Mariana" }
{ "_id" : ObjectId("5aee02d792b10001bd097d3d"), "title" : "Zona Sul da Cidade do Rio de Janeiro" }
Type "it" for more
>

Note que a procura foi feita em todos os três campo indexados, e não apenas no título do documento.

4.4.2 – Exibir os títulos de todos os documentos contendo texto exato Morro da Viúva

> db.pages.find( { $text: { $search: "\"Morro da Viúva\"" } } , { title: 1} )
{ "_id" : ObjectId("5aee02d792b10001bd097aff"), "title" : "Morro da Viúva" }
{ "_id" : ObjectId("5aee02d792b10001bd097afe"), "title" : "Morro da Viúva" }
{ "_id" : ObjectId("5aee02d792b10001bd097cec"), "title" : "Morro da Urca e Pão de Açúcar" }
{ "_id" : ObjectId("5aee02d792b10001bd097b39"), "title" : "Os Fundadores da Glória, O Ermitão Caminha" }
{ "_id" : ObjectId("5aee02d792b10001bd097cbf"), "title" : "Segunda medição começada em 16 de Outubro de 1753, e concluida em 2 de Setembro de 1754" }
{ "_id" : ObjectId("5aee02d792b10001bd097b83"), "title" : "Copacabana" }
{ "_id" : ObjectId("5aee02d792b10001bd097c0e"), "title" : "O Centenário" }
{ "_id" : ObjectId("5aee02d792b10001bd097c66"), "title" : "Pão de Açúcar" }
{ "_id" : ObjectId("5aee02d792b10001bd097d3a"), "title" : "Índice Atualizado dos Logradouros (1929)" }
{ "_id" : ObjectId("5aee02d792b10001bd097d4e"), "title" : "Cidade" }
{ "_id" : ObjectId("5aee02d792b10001bd097bf8"), "title" : "Equipamentos de Ginástica na Praia de Botafogo e no Parque do Flamengo" }
>

4.4.3 – Exibir os títulos de todos os documentos contendo os textos exatos Pão de Açúcar e Lagoa Rodrigo de Freitas

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

4.4.4 – Exibir os títulos de todos os documentos que contenham o texto exato Pão de Açúcar, mas não contenham o texto exato Morro da Urca, omitindo o _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 &#8211; 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 – Execução da mesma consulta do item anterior (4.4.4), mas usando o método forEach() no cursor retornado por find() para exibir o título da página

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

4.4.6 – Exibir o título da página e sua relevância no resultado da pesquisa pelo texto exato Praia de Copacabana, ordenado por relevância, usando o método forEach() no cursor retornado por find()

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

4. Consultas ao texto