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

Comment créer un index de texte dans MongoDB

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 le text 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 le text 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.