MongoDB - Pesquisa de Texto

A partir da versão 2.4, o MongoDB passou a oferecer suporte a índices de texto para pesquisar dentro do conteúdo da string. oText Search usa técnicas de lematização para procurar palavras especificadas nos campos de string, eliminando palavras de interrupção de lematização, como a, an, the, etc. Atualmente, o MongoDB oferece suporte a cerca de 15 idiomas.

Habilitando Pesquisa de Texto

Inicialmente, a Pesquisa de texto era um recurso experimental, mas a partir da versão 2.6, a configuração é habilitada por padrão.

Criação de índice de texto

Considere o seguinte documento em posts coleção contendo o texto da postagem e suas tags -

> db.posts.insert({
   "post_text": "enjoy the mongodb articles on tutorialspoint",
   "tags": ["mongodb", "tutorialspoint"]
}
{
	"post_text" : "writing tutorials on mongodb",
	"tags" : [ "mongodb", "tutorial" ]
})
WriteResult({ "nInserted" : 1 })

Vamos criar um índice de texto no campo post_text para que possamos pesquisar dentro do texto de nossas postagens -

>db.posts.createIndex({post_text:"text"})
{
	"createdCollectionAutomatically" : true,
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"ok" : 1
}

Usando o Índice de Texto

Agora que criamos o índice de texto no campo post_text, vamos pesquisar por todos os posts que contêm a palavra tutorialspoint em seu texto.

> db.posts.find({$text:{$search:"tutorialspoint"}}).pretty()
{
	"_id" : ObjectId("5dd7ce28f1dd4583e7103fe0"),
	"post_text" : "enjoy the mongodb articles on tutorialspoint",
	"tags" : [
		"mongodb",
		"tutorialspoint"
	]
}

O comando acima retornou os seguintes documentos de resultado com a palavra tutorialspoint no texto da postagem -

{ 
   "_id" : ObjectId("53493d14d852429c10000002"), 
   "post_text" : "enjoy the mongodb articles on tutorialspoint", 
   "tags" : [ "mongodb", "tutorialspoint" ]
}

Excluindo Índice de Texto

Para excluir um índice de texto existente, primeiro encontre o nome do índice usando a seguinte consulta -

>db.posts.getIndexes()
[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_",
		"ns" : "mydb.posts"
	},
	{
		"v" : 2,
		"key" : {
			"fts" : "text",
			"ftsx" : 1
		},
		"name" : "post_text_text",
		"ns" : "mydb.posts",
		"weights" : {
			"post_text" : 1
		},
		"default_language" : "english",
		"language_override" : "language",
		"textIndexVersion" : 3
	}
]
>

Depois de obter o nome do seu índice da consulta acima, execute o seguinte comando. Aqui,post_text_text é o nome do índice.

>db.posts.dropIndex("post_text_text")
{ "nIndexesWas" : 2, "ok" : 1 }