Kiedy tworzysz text
indeksu w MongoDB, masz możliwość zastosowania różnych wag do każdego indeksowanego pola.
Wagi te oznaczają względne znaczenie indeksowanych pól względem siebie. Pole o wyższej wadze będzie miało większy wpływ na wyniki wyszukiwania niż pole o mniejszej wadze.
Zapewnia to pewną kontrolę nad sposobem obliczania wyników wyszukiwania.
Domyślna waga to 1, więc jeśli nie określisz wagi dla pola, zostanie mu przypisana waga 1.
Przykład
Załóżmy, że mamy kolekcję o nazwie posts
i zawiera takie dokumenty:
{ "_id" : 1, "title" : "The Web", "body" : "Body text...", "abstract" : "Abstract text..." }
Moglibyśmy stworzyć złożony text
indeksuj do trzech pól tekstowych i stosuj różne wagi do każdego z nich.
Tak:
db.posts.createIndex(
{
title : "text",
body : "text",
abstract : "text"
},
{
weights: {
body: 10,
abstract: 5
}
}
)
Kiedy utworzyłem złożony text
indeks, określiłem 3 pola. Kiedy określiłem wagi, określiłem wagi tylko dla dwóch z tych pól.
W rezultacie te dwa pola będą ważone zgodnie ze specyfikacją, a drugie pole (title
) będzie miał domyślną wagę 1.
Możemy to zobaczyć, gdy uruchamiamy getIndexes()
:
db.posts.getIndexes()
Wynik:
[ { "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 } ]
Oznacza to, że body
pole będzie miało dwa razy większe znaczenie niż abstract
i dziesięć razy większe znaczenie niż title
pole.
Indeksy tekstu wieloznacznego z polami ważonymi
Wagi można stosować podczas tworzenia indeksów tekstu wieloznacznego. Indeksy tekstu wieloznacznego mogą być przydatne, gdy nie wiesz, jakie pola tekstowe będą znajdować się w dokumentach. Możesz znać niektóre , ale nie wszystkie.
W takich przypadkach możesz utworzyć indeks tekstowy z symbolami wieloznacznymi i przypisać wagę do tych pól, o których wiesz. Do wszystkich pozostałych pól zostanie przypisana domyślna wartość 1.
Załóżmy, że mamy następujący dokument jako wytyczne:
{ "_id" : 1, "title" : "Title text...", "body" : "Body text...", "abstract" : "Abstract text...", "tags" : [ "tag1", "tag2", "tag3" ] }
Jest podobny do poprzedniego dokumentu, z tą różnicą, że ma teraz tags
pole zawierające tablicę. Ale z tego, co wiemy, przyszłe dokumenty w tej kolekcji mogą mieć inne pola – na przykład categories
, keywords
, author_bio
itp.
Ale tak naprawdę nie wiemy, więc utworzymy indeks tekstowy z symbolami wieloznacznymi, który hermetyzuje wszystkie pola danymi ciągów. Stworzymy wagi dla niektórych znanych pól.
Przykład:
db.posts.createIndex(
{ "$**": "text" },
{ weights: {
body: 10,
abstract: 5
}
}
)
W tym przypadku body
pole otrzymuje wagę 10
i abstract
pole otrzymuje wagę 5
. Oznacza to, że body
pole ma dwukrotnie większy wpływ niż pole abstrakcyjne i dziesięciokrotnie większy wpływ wszystkich innych pól tekstowych (ponieważ zostanie im przypisana domyślna waga 1).
Po utworzeniu tego indeksu, jeśli wywołamy getIndexes()
, możemy zobaczyć wagi przypisane do pól:
db.posts.getIndexes()
Wynik:
[ { "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 } ]
Zgodnie z oczekiwaniami body
pole otrzymuje 10
, abstract
pole otrzymuje 5
, a wszyscy inni otrzymują 1
.