MongoDB - Ricerca di testo

A partire dalla versione 2.4, MongoDB ha iniziato a supportare gli indici di testo per la ricerca all'interno del contenuto della stringa. IlText Search utilizza tecniche di stemming per cercare parole specificate nei campi stringa eliminando le parole di stop con stemming come a, an, the, ecc. Attualmente MongoDB supporta circa 15 lingue.

Abilitazione della ricerca di testo

Inizialmente, Text Search era una funzionalità sperimentale ma a partire dalla versione 2.6, la configurazione è abilitata per impostazione predefinita.

Creazione di un indice di testo

Considera il seguente documento sotto posts raccolta contenente il testo del post e i suoi tag -

> 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 })

Creeremo un indice di testo nel campo post_text in modo da poter cercare all'interno del testo dei nostri post -

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

Utilizzo dell'indice di testo

Ora che abbiamo creato l'indice di testo nel campo post_text, cercheremo tutti i post contenenti la parola tutorialspoint nel loro testo.

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

Il comando precedente ha restituito i seguenti documenti risultato con la parola tutorialspoint nel testo del loro post -

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

Eliminazione dell'indice di testo

Per eliminare un indice di testo esistente, trova prima il nome dell'indice utilizzando la seguente query:

>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
	}
]
>

Dopo aver ottenuto il nome del tuo indice dalla query precedente, esegui il seguente comando. Qui,post_text_text è il nome dell'indice.

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