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

Créer un index de texte avec différentes pondérations de champ dans MongoDB

Lorsque vous créez un text index dans MongoDB, vous avez la possibilité d'appliquer des pondérations différentes à chaque champ indexé.

Ces poids indiquent l'importance relative des champs indexés les uns par rapport aux autres. Un champ avec un poids plus élevé aura plus d'impact dans les résultats de recherche qu'un champ avec un poids plus faible.

Cela vous donne un certain contrôle sur la façon dont les résultats de la recherche sont calculés.

Le poids par défaut est 1, donc si vous ne spécifiez pas de poids pour le champ, un poids de 1 lui sera attribué.

Exemple

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 créer un text composé indexez les trois champs de texte et appliquez des pondérations différentes à chacun.

Comme ceci :

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

Lorsque j'ai créé le composé 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() :

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.

Index de texte générique avec champs pondérés

Vous pouvez appliquer des pondérations lors de la création d'index de texte génériques. Les index de texte génériques peuvent être pratiques lorsque vous ne savez pas quels seront les champs de texte dans les documents. Vous en connaissez peut-être certains , mais pas tous.

Dans de tels cas, vous pouvez créer un index de texte générique et attribuer une pondération aux champs dont vous avez connaissance. Tous les autres champs se verront attribuer la valeur par défaut de 1.

Supposons que nous ayons le document suivant comme ligne directrice :

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

Il est similaire au document précédent, sauf qu'il a maintenant un tags champ qui contient un tableau. Mais pour autant que nous sachions, les futurs documents de cette collection pourraient avoir d'autres champs - comme peut-être categories , keywords , author_bio , etc.

Mais nous ne le savons pas réellement, nous allons donc créer un index de texte générique qui encapsulera tous les champs avec des données de chaîne. Et nous créerons des pondérations pour certains des champs connus.

Exemple :

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

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() , 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 .