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
.