MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Créer un index de texte générique dans MongoDB

MongoDB nous offre la possibilité de créer des index de texte génériques.

Les index de texte génériques sont similaires aux index génériques, sauf que les index de texte génériques prennent en charge le $text contrairement aux index génériques.

Cela dit, la création de chaque type d'index est très similaire dans le sens où ils partagent tous les deux le caractère générique $** modèle de champ.

Exemple

Supposons que nous ayons une collection appelée posts , et il contient des documents qui ressemblent à ceci :

{
	"_id" : 1,
	"title" : "Title text...",
	"body" : "Body text...",
	"abstract" : "Abstract text...",
	"tags" : [
		"tag1",
		"tag2",
		"tag3"
	]
}

Nous pourrions créer un index de texte générique sur cette collection comme ceci :

db.posts.createIndex( { "$**": "text" } )

Sortie :

{
	"createdCollectionAutomatically" : false,
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"ok" : 1
}

Qui utilise le caractère générique $** modèle de champ pour créer un index sur tous les champs de texte. Lorsque vous créez un index comme celui-ci, MongoDB indexe chaque champ contenant des données de chaîne pour chaque document de la collection.

Cela peut être utile si la collection contient beaucoup de contenu non structuré et qu'il n'y a pas de cohérence des champs de texte dans les documents. Dans de tels cas, vous ne seriez pas en mesure d'inclure explicitement les champs dans l'index car vous ne sauriez pas quels champs vont figurer dans les documents.

Champs pondérés

Vous pouvez utiliser les weights paramètre pour attribuer différents poids aux champs dans un index de texte générique.

Exemple :

db.posts.createIndex( 
  { "$**": "text" },
  { weights: {
      body: 10,
      abstract: 5
    } 
  } 
)

Sortie :

{
	"createdCollectionAutomatically" : false,
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"ok" : 1
}

Dans ce cas, le body le champ obtient un poids de 10 et le abstract le champ obtient un poids de 5 . Cela signifie que le body champ a deux fois l'impact du champ abstrait et dix fois l'impact de tous les autres champs de texte (car ils se verront attribuer le poids par défaut de 1).

Après avoir créé cet index, si nous appelons getIndexes() pour retourner tous les index de la collection, on peut voir les pondérations données aux champs :

db.posts.getIndexes()

Résultat :

[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"_fts" : "text",
			"_ftsx" : 1
		},
		"name" : "$**_text",
		"weights" : {
			"$**" : 1,
			"abstract" : 5,
			"body" : 10
		},
		"default_language" : "english",
		"language_override" : "language",
		"textIndexVersion" : 3
	}
]

Comme prévu, le body le champ obtient 10 , le abstract le champ obtient 5 , et tous les autres obtiennent 1 .