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
textindeks nie może zawierać żadnych innych specjalnych typów indeksów, takich jak wielokluczowe lub geoprzestrzenne pola indeksowe. - Jeśli złożony
textindeks zawiera klucze poprzedzającetextklawisz indeksu, aby wykonać$textwyszukiwania, predykat zapytania musi zawierać warunki dopasowania równości w poprzednich kluczach. - Podczas tworzenia złożonego
textindeks, całytextklucze 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.