MongoDB zapewnia nam możliwość tworzenia indeksów tekstowych z symbolami wieloznacznymi.
Indeksy tekstowe z symbolami wieloznacznymi są podobne do indeksów z symbolami wieloznacznymi, z wyjątkiem tego, że indeksy tekstowe z symbolami wieloznacznymi obsługują $text
operatora, podczas gdy indeksy wieloznaczne nie.
To powiedziawszy, tworzenie każdego typu indeksu jest bardzo podobne w tym sensie, że oba mają wspólny symbol wieloznaczny $**
wzór pola.
Przykład
Załóżmy, że mamy kolekcję o nazwie posts
i zawiera dokumenty, które wyglądają tak:
{ "_id" : 1, "title" : "Title text...", "body" : "Body text...", "abstract" : "Abstract text...", "tags" : [ "tag1", "tag2", "tag3" ] }
Możemy utworzyć indeks tekstowy z symbolami wieloznacznymi dla tej kolekcji w ten sposób:
db.posts.createIndex( { "$**": "text" } )
Wyjście:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Używa symbolu wieloznacznego $**
wzorzec pola, aby utworzyć indeks na wszystkich polach tekstowych. Kiedy tworzysz indeks w ten sposób, MongoDB indeksuje każde pole zawierające dane ciągu dla każdego dokumentu w kolekcji.
Może to być przydatne, jeśli kolekcja zawiera dużo nieustrukturyzowanej treści i nie ma spójności pól tekstowych w dokumentach. W takich przypadkach nie będziesz w stanie wyraźnie uwzględnić pól w indeksie, ponieważ nie będziesz wiedział, które pola znajdą się w dokumentach.
Pola ważone
Możesz użyć weights
parametr, aby przypisać różne wagi do pól w indeksie tekstu wieloznacznego.
Przykład:
db.posts.createIndex(
{ "$**": "text" },
{ weights: {
body: 10,
abstract: 5
}
}
)
Wyjście:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
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()
aby zwrócić wszystkie indeksy dla kolekcji, możemy zobaczyć wagi nadane polom:
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
.