Wenn Sie einen text
erstellen index in MongoDB haben Sie die Möglichkeit, jedem indizierten Feld unterschiedliche Gewichtungen zuzuweisen.
Diese Gewichtungen geben die relative Bedeutung der indizierten Felder zueinander an. Ein Feld mit einer höheren Gewichtung wirkt sich stärker auf die Suchergebnisse aus als ein Feld mit einer niedrigeren Gewichtung.
Dadurch haben Sie eine gewisse Kontrolle darüber, wie die Suchergebnisse berechnet werden.
Die Standardgewichtung ist 1. Wenn Sie also keine Gewichtung für das Feld angeben, wird ihm eine Gewichtung von 1 zugewiesen.
Beispiel
Angenommen, wir haben eine Sammlung namens posts
, und es enthält Dokumente wie diese:
{ "_id" : 1, "title" : "The Web", "body" : "Body text...", "abstract" : "Abstract text..." }
Wir könnten einen zusammengesetzten text
erstellen indexieren Sie die drei Textfelder und wenden Sie unterschiedliche Gewichtungen auf diese an.
So:
db.posts.createIndex(
{
title : "text",
body : "text",
abstract : "text"
},
{
weights: {
body: 10,
abstract: 5
}
}
)
Als ich den zusammengesetzten text
erstellt habe index, ich habe 3 Felder angegeben. Als ich die Gewichtungen angegeben habe, habe ich Gewichtungen für nur zwei dieser Felder angegeben.
Das Ergebnis ist, dass diese beiden Felder wie angegeben gewichtet werden und das andere Feld (title
) hat die Standardgewichtung 1.
Wir können dies sehen, wenn wir getIndexes()
ausführen :
db.posts.getIndexes()
Ergebnis:
[ { "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 } ]
Das bedeutet, dass der body
Das Feld hat die doppelte Bedeutung des abstract
Feld und die zehnfache Bedeutung des title
Feld.
Platzhalter-Textindizes mit gewichteten Feldern
Beim Erstellen von Platzhalter-Textindizes können Sie Gewichtungen anwenden. Platzhalter-Textindizes können praktisch sein, wenn Sie nicht wissen, welche Textfelder in den Dokumenten enthalten sein werden. Vielleicht kennen Sie einige , aber nicht alle.
In solchen Fällen könnten Sie einen Platzhalter-Textindex erstellen und den Ihnen bekannten Feldern eine Gewichtung zuweisen. Allen anderen Feldern wird der Standardwert 1 zugewiesen.
Angenommen, wir haben das folgende Dokument als Richtlinie:
{ "_id" : 1, "title" : "Title text...", "body" : "Body text...", "abstract" : "Abstract text...", "tags" : [ "tag1", "tag2", "tag3" ] }
Es ähnelt dem vorherigen Dokument, außer dass es jetzt tags
hat Feld, das ein Array enthält. Aber soweit wir wissen, könnten zukünftige Dokumente in dieser Sammlung andere Felder haben – wie vielleicht categories
, keywords
, author_bio
usw.
Aber wir wissen es nicht genau, also erstellen wir einen Platzhalter-Textindex, der alle Felder mit Zeichenfolgendaten kapselt. Und wir werden Gewichtungen für einige der bekannten Felder erstellen.
Beispiel:
db.posts.createIndex(
{ "$**": "text" },
{ weights: {
body: 10,
abstract: 5
}
}
)
In diesem Fall der body
-Feld erhält eine Gewichtung von 10
und die abstract
Feld erhält eine Gewichtung von 5
. Das bedeutet, dass der body
-Feld hat die doppelte Auswirkung des abstrakten Felds und die zehnfache Auswirkung aller anderen Textfelder (weil ihnen die Standardgewichtung 1 zugewiesen wird).
Nachdem wir diesen Index erstellt haben, rufen wir getIndexes()
auf , können wir die den Feldern zugewiesene Gewichtung sehen:
db.posts.getIndexes()
Ergebnis:
[ { "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 } ]
Wie erwartet, der body
Feld bekommt 10
, die abstract
Feld bekommt 5
, und alle anderen erhalten 1
.