Operador $text

Consultas ao texto

MongoDB Compass - Banco de Dados reficio, coleção pages, documentos contendo o texto Morro da Viúva nos campos indexados
MongoDB Compass - Banco de Dados reficio, coleção pages, documentos contendo o texto Morro da Viúva nos campos indexados

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 definição:

{
  $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 definição:

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
	}
]
Exemplos
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("5f69ecd4d3a133b7d4bdd6c7"), "title" : "Pão de Açúcar" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd678"), "title" : "O Pão de Açúcar" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd6fd"), "title" : "Caminho do Pão de Açúcar" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd675"), "title" : "Caminho Aéreo do Pão de Açúcar" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd5b5"), "title" : "Primeiras Escaladas do Pão de Açúcar" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd74b"), "title" : "Morro da Urca e Pão de Açúcar" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd74e"), "title" : "Imagens da Praia Vermelha, Urca, Morro da Urca e Pão de Açúcar" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd53d"), "title" : "4.4 Query operator $text" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd554"), "title" : "4.4 Operador $text" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd54b"), "title" : "4.1 Collection method find()" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd556"), "title" : "4.1 Método find()" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd6f0"), "title" : "20 de agosto de 1823, Cavalgada até Santa Cruz" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd54a"), "title" : "4.2 Collection method distinct()" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd55e"), "title" : "4.2 Método distinct()" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd507"), "title" : "Da descoberta do Brasil, reconhecimento da sua costa até o Rio da Prata" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd4c8"), "title" : "O Brasil sob o Domínio Espanhol" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd5cb"), "title" : "Excursão Presidencial ao Morro da Urca" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd4bf"), "title" : "Invasão do Rio de Janeiro, por Duguay-Trouin" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd51e"), "title" : "Engenho da Pedra" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd617"), "title" : "Viagem de Niterói a Nova Friburgo" }
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.

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("5f69ecd4d3a133b7d4bdd560"), "title" : "Morro da Viúva" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd55f"), "title" : "Morro da Viúva" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd74b"), "title" : "Morro da Urca e Pão de Açúcar" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd599"), "title" : "Os Fundadores da Glória, O Ermitão Caminha" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd54a"), "title" : "4.2 Collection method distinct()" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd55e"), "title" : "4.2 Método distinct()" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd549"), "title" : "6.3 PHP" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd5e1"), "title" : "Copacabana" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd720"), "title" : "Segunda medição começada em 16 de Outubro de 1753, e concluida em 2 de Setembro de 1754" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd530"), "title" : "6.3 PHP" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd556"), "title" : "4.1 Método find()" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd53c"), "title" : "4.3 Collection method aggregate()" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd54b"), "title" : "4.1 Collection method find()" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd554"), "title" : "4.4 Operador $text" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd66e"), "title" : "O Centenário" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd6c7"), "title" : "Pão de Açúcar" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd53d"), "title" : "4.4 Query operator $text" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd553"), "title" : "4.3 Método aggregate()" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd79b"), "title" : "Índice Atualizado dos Logradouros (1929)" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd7af"), "title" : "Cidade" }
Type "it" for more
> it
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd65c"), "title" : "Equipamentos de Ginástica na Praia de Botafogo e no Parque do Flamengo" }
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("5f69ecd4d3a133b7d4bdd53d"), "title" : "4.4 Query operator $text" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd554"), "title" : "4.4 Operador $text" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd54a"), "title" : "4.2 Collection method distinct()" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd55e"), "title" : "4.2 Método distinct()" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd5e1"), "title" : "Copacabana" }
{ "_id" : ObjectId("5f69ecd4d3a133b7d4bdd625"), "title" : "Academias da Terceira Idade na Cidade do Rio de Janeiro" }
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" : "Da descoberta do Brasil, reconhecimento da sua costa até o Rio da Prata" }
{ "title" : "Engenho da Pedra" }
{ "title" : "Escola Militar" }
{ "title" : "Copacabana" }
{ "title" : "Santa Teresa &#8211; A Nova Linha" }
{ "title" : "São Roque" }
{ "title" : "Projeto de Nicolau Villegagnon de fazer no Rio de Janeiro um asilo dos protestantes perseguidos na Europa" }
{ "title" : "Zona Sul da Cidade do Rio de Janeiro" }
{ "title" : "Praia e Ermida de Copacabana" }
{ "title" : "Ilha de Paquetá" }
{ "title" : "Legislativo Municipal" }
{ "title" : "Expulsão dos Franceses do Rio de Janeiro" }
{ "title" : "Charita" }
{ "title" : "São Sebastião" }
{ "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)" }
{ "title" : "São Sebastião" }
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: Da descoberta do Brasil, reconhecimento da sua costa até o Rio da Prata
Título: Engenho da Pedra
Título: Escola Militar
Título: Copacabana
Título: Santa Teresa &#8211; A Nova Linha
Título: São Roque
Título: Projeto de Nicolau Villegagnon de fazer no Rio de Janeiro um asilo dos protestantes perseguidos na Europa
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: Expulsão dos Franceses do Rio de Janeiro
Título: Charita
Título: São Sebastião
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)
Título: São Sebastião
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.666530183713007
Título: Igrejinha de Copacabana; Score: 5.602346984501571
Título: Copacabana; Score: 5.278267660377956
Título: Região de Copacabana; Score: 5.176254734848484
Título: Praias da Cidade do Rio de Janeiro; Score: 5.15771647129557
Título: A Pesca no Rio de Janeiro da Primeira República; Score: 3.925228018032646
Título: 4.4 Operador $text; Score: 3.0720675871333976
Título: 4.4 Query operator $text; Score: 3.0672320659270857
Título: Índice Atualizado dos Logradouros (1929); Score: 3.013675886553118