Når du opretter en text
indeks i MongoDB, har du mulighed for at anvende forskellige vægte på hvert indekseret felt.
Disse vægte angiver den relative betydning af de indekserede felter i forhold til hinanden. Et felt med en højere vægt vil have mere indflydelse i søgeresultaterne end et felt med en lavere vægt.
Dette giver dig en vis kontrol over, hvordan søgeresultaterne beregnes.
Standardvægten er 1, så hvis du ikke angiver en vægt for felt, vil den blive tildelt en vægt på 1.
Eksempel
Antag, at vi har en samling kaldet posts
, og det indeholder dokumenter som dette:
{ "_id" : 1, "title" : "The Web", "body" : "Body text...", "abstract" : "Abstract text..." }
Vi kunne lave en sammensat text
indeksere til de tre tekstfelter og anvende forskellig vægt på hvert enkelt.
Sådan:
db.posts.createIndex(
{
title : "text",
body : "text",
abstract : "text"
},
{
weights: {
body: 10,
abstract: 5
}
}
)
Da jeg oprettede den sammensatte text
indeks, jeg specificerede 3 felter. Da jeg specificerede vægtene, angav jeg vægte for kun to af disse felter.
Resultatet er, at disse to felter vil blive vægtet som specificeret, og det andet felt (title
) vil have standardvægten 1.
Vi kan se dette, når vi kører getIndexes()
:
db.posts.getIndexes()
Resultat:
[ { "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 } ]
Det betyder, at body
feltet vil have dobbelt så stor betydning som abstract
felt og ti gange betydningen af title
felt.
Jokertegn-tekstindekser med vægtede felter
Du kan anvende vægte, når du opretter jokertegn-tekstindekser. Wildcard-tekstindekser kan være praktiske, når du ikke ved, hvad tekstfelterne skal være i dokumenterne. Du kender måske nogle , men ikke alle.
I sådanne tilfælde kan du oprette et wildcard-tekstindeks og tildele en vægt til de felter, som du er opmærksom på. Alle andre felter vil blive tildelt standardværdien 1.
Antag, at vi har følgende dokument som rettesnor:
{ "_id" : 1, "title" : "Title text...", "body" : "Body text...", "abstract" : "Abstract text...", "tags" : [ "tag1", "tag2", "tag3" ] }
Det ligner det tidligere dokument, bortset fra at det nu har et tags
felt, der indeholder en matrix. Men for alt, hvad vi ved, kan fremtidige dokumenter i den samling have andre felter – som måske categories
, keywords
, author_bio
osv.
Men vi ved det faktisk ikke, så vi vil oprette et wildcard-tekstindeks, der vil indkapsle alle felter med strengdata. Og vi vil lave vægtninger for nogle af de kendte felter.
Eksempel:
db.posts.createIndex(
{ "$**": "text" },
{ weights: {
body: 10,
abstract: 5
}
}
)
I dette tilfælde er body
felt får en vægt på 10
og den abstract
felt får en vægt på 5
. Det betyder, at body
felt har dobbelt så stor effekt som det abstrakte felt og ti gange så stor effekt som alle andre tekstfelter (fordi de vil blive tildelt standardvægten 1).
Efter at have oprettet det indeks, hvis vi kalder getIndexes()
, kan vi se de vægtninger, der er givet til felterne:
db.posts.getIndexes()
Resultat:
[ { "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 } ]
Som forventet, body
felt får 10
, den abstract
felt får 5
, og alle andre får 1
.