Il existe différents types d'index que vous pouvez créer dans MongoDB. Si vous avez un champ qui contient une chaîne ou un tableau de chaînes, vous pouvez utiliser un text
index sur ce champ.
Pour créer un text
index, utilisez la chaîne littérale "text"
comme valeur lors de sa création.
Créer un index de texte sur un seul champ
Supposons que nous ayons une collection appelée posts
, et il contient des documents comme celui-ci :
{ "_id" : 1, "title" : "The Web", "body" : "Body text...", "abstract" : "Abstract text..." }
Nous pourrions vouloir créer un text
index sur le body
ou le champ abstract
champ, ou même les deux.
Voici comment créer un text
index sur le body
champ :
db.posts.createIndex( { body : "text" } )
Sortie :
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Nous pouvons maintenant utiliser le getIndexes()
méthode pour afficher l'index :
db.posts.getIndexes()
Résultat :
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "body_text", "weights" : { "body" : 1 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
On voit qu'il y a deux index. Le premier est le _id
par défaut index créé automatiquement avec la collection. Le deuxième index est celui que nous venons de créer.
MongoDB a automatiquement attribué un nom à notre index nouvellement créé. Il s'appelle body_text
.
Créer un index de texte composé
Une collection ne peut avoir qu'un seul text
index, mais il peut s'agir d'un index composé si nécessaire.
Créons un index composé qui inclut le body
champ et le abstract
champ.
Comme mentionné, une collection ne peut avoir qu'un seul text
index, laissons tomber l'index que nous venons de créer :
db.posts.dropIndex("body_text")
Sortie :
{ "nIndexesWas" : 2, "ok" : 1 }
OK, maintenant que nous avons supprimé le text
index, allons-y et créons-en un autre - cette fois ce sera un index composé :
db.posts.createIndex( {
body : "text",
abstract : "text"
} )
Sortie :
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
C'est un message de confirmation qui nous dit qu'il y avait 1 index mais qu'il y en a maintenant 2.
Vérifions à nouveau la liste des index :
db.posts.getIndexes()
Résultat :
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "body_text_abstract_text", "weights" : { "abstract" : 1, "body" : 1 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
Notez que le composé text
les index ont les restrictions suivantes :
- Un
text
composé index ne peut pas inclure d'autres types d'index spéciaux, tels que des champs d'index multi-clés ou géospatiaux. - Si le composé
text
l'index inclut les clés précédant letext
clé d'index, pour effectuer un$text
recherche, le prédicat de la requête doit inclure des conditions de correspondance d'égalité sur les clés précédentes. - Lors de la création d'un
text
composé index, tout letext
les clés d'index doivent être répertoriées à côté dans le document de spécification d'index.
Créer un index de texte générique
Vous pouvez créer un index de texte générique en utilisant le caractère générique $**
modèle de champ.
Supprimons l'index précédent et créons un index de texte générique :
db.posts.dropIndex("body_text_abstract_text")
db.posts.createIndex( { "$**" : "text" } )
MongoDB nous offre également la possibilité de créer des index génériques, mais les index de texte générique et les index génériques sont deux choses distinctes.
En particulier, les index de texte génériques prennent en charge le $text
contrairement aux index génériques.
Les weights
Paramètre
Lors de la création de text
index, vous avez la possibilité de spécifier un poids sur un ou plusieurs champs. Par défaut, chaque champ reçoit un poids de 1. Mais vous pouvez modifier cela afin de donner plus ou moins de poids aux champs dans les résultats de la recherche.
Exemple
db.posts.dropIndex("$**_text")
db.posts.createIndex(
{
title : "text",
body : "text",
abstract : "text"
},
{
weights: {
body: 10,
abstract: 5
}
}
)
J'ai commencé par supprimer l'index précédent.
Lorsque j'ai créé le nouveau text
index, j'ai spécifié 3 champs. Lorsque j'ai spécifié les poids, j'ai spécifié des poids pour seulement deux de ces champs.
Le résultat est que ces deux champs seront pondérés comme spécifié, et l'autre champ (title
) aura le poids par défaut de 1.
Nous pouvons le voir lorsque nous exécutons getIndexes()
encore :
db.posts.getIndexes()
Résultat :
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "title_text_body_text_abstract_text", "weights" : { "abstract" : 5, "body" : 10, "title" : 1 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
Cela signifie que le body
le champ aura deux fois la signification du abstract
champ, et dix fois la signification du title
champ.
Création d'index de texte multilingues
Vous remarquerez que le text
ci-dessus l'index inclut "default_language" : "english"
et "language_override" : "language"
dans sa définition.
Ces champs aident à traiter les documents en plusieurs langues. Les valeurs de l'index ci-dessus sont les valeurs par défaut.
Lorsque vous créez un document, vous pouvez spécifier la langue de ce document en utilisant le language
champ (ou un autre champ défini dans le champ language_override
champ du text
indice). Si un tel champ n'existe pas dans le document, il utilisera la langue par défaut spécifiée dans le default_language
champ.
Vous pouvez spécifier un default_language
(et language_override
) lorsque vous créez l'index.
Voir Créer un index de texte multilingue dans MongoDB pour des exemples de création d'index de texte prenant en charge plusieurs langues.