MongoDB - Recherche de texte

À partir de la version 2.4, MongoDB a commencé à prendre en charge les index de texte pour rechercher dans le contenu des chaînes. leText Search utilise des techniques de racine pour rechercher des mots spécifiés dans les champs de chaîne en supprimant des mots d'arrêt de racine comme a, an, the, etc. Actuellement, MongoDB prend en charge environ 15 langues.

Activation de la recherche de texte

Au départ, la recherche de texte était une fonctionnalité expérimentale mais à partir de la version 2.6, la configuration est activée par défaut.

Création d'un index de texte

Considérez le document suivant sous posts collection contenant le texte de l'article et ses balises -

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

Nous allons créer un index de texte sur le champ post_text afin de pouvoir rechercher dans le texte de nos articles -

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

Utilisation de l'index de texte

Maintenant que nous avons créé l'index de texte sur le champ post_text, nous allons rechercher tous les articles contenant le mot tutorialspoint dans leur texte.

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

La commande ci-dessus a renvoyé les documents de résultat suivants contenant le mot tutorialspoint dans le texte de leur message -

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

Suppression de l'index de texte

Pour supprimer un index de texte existant, recherchez d'abord le nom de l'index à l'aide de la requête suivante -

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

Après avoir obtenu le nom de votre index à partir de la requête ci-dessus, exécutez la commande suivante. Ici,post_text_text est le nom de l'index.

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