Wanneer u een text
aanmaakt index in MongoDB, hebt u de mogelijkheid om verschillende gewichten toe te passen op elk geïndexeerd veld.
Deze gewichten geven het relatieve belang aan van de geïndexeerde velden ten opzichte van elkaar. Een veld met een hoger gewicht zal meer impact hebben in de zoekresultaten dan een veld met een lager gewicht.
Dit geeft je een zekere mate van controle over hoe de zoekresultaten worden berekend.
Het standaardgewicht is 1, dus als u geen gewicht opgeeft voor het veld, krijgt het een gewicht van 1.
Voorbeeld
Stel dat we een verzameling hebben met de naam posts
, en het bevat documenten zoals deze:
{ "_id" : 1, "title" : "The Web", "body" : "Body text...", "abstract" : "Abstract text..." }
We zouden een samengestelde text
kunnen maken index op de drie tekstvelden en pas op elk een ander gewicht toe.
Zoals dit:
db.posts.createIndex(
{
title : "text",
body : "text",
abstract : "text"
},
{
weights: {
body: 10,
abstract: 5
}
}
)
Toen ik de samengestelde text
. maakte index, ik heb 3 velden opgegeven. Toen ik de gewichten specificeerde, specificeerde ik gewichten voor slechts twee van die velden.
Het resultaat is dat die twee velden worden gewogen zoals gespecificeerd, en het andere veld (title
) zal het standaardgewicht van 1 hebben.
We kunnen dit zien wanneer we getIndexes()
run uitvoeren :
db.posts.getIndexes()
Resultaat:
[ { "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 } ]
Dit betekent dat de body
veld zal twee keer de betekenis hebben van de abstract
veld, en tien keer de betekenis van de title
veld.
Wildcard-tekstindexen met gewogen velden
U kunt gewichten toepassen bij het maken van indexen met jokertekens. Tekstindexen met jokertekens kunnen handig zijn als u niet weet wat de tekstvelden in de documenten zullen zijn. Misschien ken je sommige , maar niet allemaal.
In dergelijke gevallen kunt u een wildcard-tekstindex maken en een gewicht toewijzen aan de velden waarvan u op de hoogte bent. Aan alle andere velden wordt de standaardwaarde 1 toegewezen.
Stel dat we het volgende document als richtlijn hebben:
{ "_id" : 1, "title" : "Title text...", "body" : "Body text...", "abstract" : "Abstract text...", "tags" : [ "tag1", "tag2", "tag3" ] }
Het is vergelijkbaar met het vorige document, behalve dat het nu een tags
. heeft veld dat een array bevat. Maar voor zover we weten, zouden toekomstige documenten in die verzameling andere velden kunnen hebben, zoals misschien categories
, keywords
, author_bio
, enz.
Maar we weten het eigenlijk niet, dus we zullen een wildcard-tekstindex maken die alle velden inkapselt met tekenreeksgegevens. En we zullen wegingen maken voor enkele van de bekende velden.
Voorbeeld:
db.posts.createIndex(
{ "$**": "text" },
{ weights: {
body: 10,
abstract: 5
}
}
)
In dit geval is de body
veld krijgt een gewicht van 10
en de abstract
veld krijgt een gewicht van 5
. Dit betekent dat de body
veld heeft twee keer de impact van het abstracte veld en tien keer de impact van alle andere tekstvelden (omdat ze het standaardgewicht van 1 krijgen).
Als we na het maken van die index getIndexes()
. aanroepen , kunnen we de wegingen zien die aan de velden zijn gegeven:
db.posts.getIndexes()
Resultaat:
[ { "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 } ]
Zoals verwacht, de body
veld krijgt 10
, de abstract
veld krijgt 5
, en alle anderen krijgen 1
.