W MongoDB można tworzyć różne rodzaje indeksów. Jeśli masz pole zawierające ciąg lub tablicę ciągów, możesz użyć text
indeks w tym polu.
Aby utworzyć text
indeks, użyj literału ciągu "text"
jako wartość podczas jej tworzenia.
Utwórz indeks tekstowy w jednym polu
Załóżmy, że mamy kolekcję o nazwie posts
i zawiera takie dokumenty:
{ "_id" : 1, "title" : "The Web", "body" : "Body text...", "abstract" : "Abstract text..." }
Możemy chcieć utworzyć text
indeks w body
pole lub abstract
pole, a nawet jedno i drugie.
Oto jak utworzyć text
indeks w body
pole:
db.posts.createIndex( { body : "text" } )
Wyjście:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Możemy teraz użyć getIndexes()
metoda przeglądania indeksu:
db.posts.getIndexes()
Wynik:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "body_text", "weights" : { "body" : 1 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
Widzimy, że istnieją dwa indeksy. Pierwszy to domyślny _id
indeks tworzony automatycznie z kolekcją. Drugi indeks to ten, który właśnie utworzyliśmy.
MongoDB automatycznie przypisał nazwę do naszego nowo utworzonego indeksu. Nazywa się body_text
.
Utwórz złożony indeks tekstowy
Kolekcja może mieć tylko jeden text
indeks, ale w razie potrzeby może to być indeks złożony.
Utwórzmy indeks złożony, który zawiera body
pole i abstract
pole.
Jak wspomniano, kolekcja może mieć tylko jeden text
indeks, więc odrzućmy indeks, który właśnie stworzyliśmy:
db.posts.dropIndex("body_text")
Wyjście:
{ "nIndexesWas" : 2, "ok" : 1 }
OK, teraz porzuciliśmy text
indeks, chodźmy dalej i stwórzmy kolejny – tym razem będzie to indeks złożony:
db.posts.createIndex( {
body : "text",
abstract : "text"
} )
Wyjście:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
To komunikat potwierdzający, który mówi nam, że kiedyś był 1 indeks, ale teraz jest 2.
Sprawdźmy jeszcze raz listę indeksów:
db.posts.getIndexes()
Wynik:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "body_text_abstract_text", "weights" : { "abstract" : 1, "body" : 1 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
Zwróć uwagę, że złożony text
indeksy mają następujące ograniczenia:
- Złożony
text
indeks nie może zawierać żadnych innych specjalnych typów indeksów, takich jak wielokluczowe lub geoprzestrzenne pola indeksowe. - Jeśli złożony
text
indeks zawiera klucze poprzedzającetext
klawisz indeksu, aby wykonać$text
wyszukiwania, predykat zapytania musi zawierać warunki dopasowania równości w poprzednich kluczach. - Podczas tworzenia złożonego
text
indeks, całytext
klucze indeksu muszą być wymienione obok w dokumencie specyfikacji indeksu.
Utwórz indeks tekstowy z symbolami zastępczymi
Możesz utworzyć indeks tekstowy z symbolami wieloznacznymi, używając symbolu wieloznacznego $**
wzór pola.
Porzućmy poprzedni indeks i utwórzmy indeks tekstowy z symbolami wieloznacznymi:
db.posts.dropIndex("body_text_abstract_text")
db.posts.createIndex( { "$**" : "text" } )
MongoDB zapewnia nam również możliwość tworzenia indeksów z symbolami wieloznacznymi, jednak indeksy tekstowe z symbolami wieloznacznymi i indeksy z symbolami wieloznacznymi to dwie różne rzeczy.
W szczególności indeksy tekstowe z symbolami wieloznacznymi obsługują $text
operator, podczas gdy indeksy wieloznaczne nie.
weights
Parametr
Podczas tworzenia text
indeksów, masz możliwość określenia wagi w jednym lub kilku polach. Domyślnie każdemu polu przypisywana jest waga 1. Można to jednak zmienić, aby nadać polom większą lub mniejszą wagę w wynikach wyszukiwania.
Przykład
db.posts.dropIndex("$**_text")
db.posts.createIndex(
{
title : "text",
body : "text",
abstract : "text"
},
{
weights: {
body: 10,
abstract: 5
}
}
)
Zacząłem od upuszczenia poprzedniego indeksu.
Kiedy utworzyłem nowy 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()
ponownie:
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.
Tworzenie indeksów tekstowych w wielu językach
Zauważysz, że powyższy text
indeks zawiera "default_language" : "english"
i "language_override" : "language"
w swojej definicji.
Te pola pomagają w radzeniu sobie z dokumentami w wielu językach. Wartości w powyższym indeksie są wartościami domyślnymi.
Kiedy tworzysz dokument, możesz określić język tego dokumentu, używając language
pole (lub inne pole zdefiniowane w language_override
pole text
indeks). Jeśli takie pole nie istnieje w dokumencie, użyje domyślnego języka określonego w default_language
pole.
Możesz określić default_language
(i language_override
) podczas tworzenia indeksu.
Zobacz Tworzenie wielojęzycznego indeksu tekstowego w MongoDB, aby zapoznać się z przykładami tworzenia indeksów tekstowych obsługujących wiele języków.