Kiedy tworzysz text
indeks w MongoDB, indeks używa domyślnego języka english
.
Język domyślny określa zasady analizowania korzeni słów (tj. rdzeniowania) i ignorowania słów stop.
W razie potrzeby możesz jednak zmienić domyślny język.
Możesz również określić język na poziomie dokumentu, a nawet na poziomie poddokumentu. Język domyślny będzie używany tylko wtedy, gdy język nie został określony na poziomie dokumentu lub poddokumentu.
W tym artykule przedstawiono przykłady określania języka dla text
indeks.
Przykładowa kolekcja
Załóżmy, że mamy kolekcję o nazwie sitcoms
z takimi dokumentami:
{ "_id" : 1, "original_name" : "Family Guy", "translations" : { "language" : "german", "sitcom_name" : "Familienmensch" } } { "_id" : 2, "original_name" : "Cuéntame como pasó", "language" : "spanish", "translations" : [ { "language" : "english", "sitcom_name" : "Tell me how it happened" }, { "language" : "french", "sitcom_name" : "Raconte-moi comment cela s'est passé" } ] }
Widzimy, że w tym zbiorze znajdują się dwa dokumenty. Każdy dokument zawiera nazwę sitcomu wraz z tłumaczeniem tej nazwy na różne języki. Język każdego tłumaczenia jest określony w language
pole odpowiedniego poddokumentu.
Drugi dokument w tej kolekcji zawiera również language
pole na najwyższym poziomie (w tym przypadku "language" : "spanish"
). Oznacza to, że nazwa sitcomu jest po hiszpańsku (a przynajmniej hiszpański jest językiem, którego chcemy używać podczas indeksowania tego dokumentu).
Jednak pierwszy dokument nie zawiera takiego pola. Fakt, że pierwszy dokument nie zawiera language
najwyższego poziomu pole oznacza, że chcemy, aby było indeksowane przy użyciu domyślnego języka. Jeśli podczas indeksowania nie określono języka domyślnego, domyślnym językiem będzie angielski.
Jeśli osadzony dokument nie zawiera pola określającego język, użyje pola języka załączonego dokumentu. Jeśli załączony dokument nie zawiera pola języka, użyje języka domyślnego.
Utwórz indeks tekstowy dla wielu języków
Chodźmy dalej i utwórzmy text
indeks dla powyższej kolekcji.
db.sitcoms.createIndex(
{
"original_name": "text",
"translations.sitcom_name": "text"
}
)
To tworzy złożony text
indeks na original_name
pole i translations.sitcom_name
pole (np. sitcom_name
w osadzonych dokumentach).
Teraz użyjmy getIndexes()
aby spojrzeć na ten indeks:
db.sitcoms.getIndexes()
Wynik:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "original_name_text_translations.sitcom_name_text", "weights" : { "original_name" : 1, "translations.sitcom_name" : 1 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
Widzimy, że używa domyślnego języka angielskiego. Jest to określone jako "default_language" : "english"
.
Zmień domyślny język
W razie potrzeby możemy ustawić inny język domyślny podczas tworzenia indeksu.
Upuśćmy indeks i utwórzmy go ponownie w innym domyślnym języku:
db.sitcoms.dropIndex("original_name_text_translations.sitcom_name_text")
db.sitcoms.createIndex(
{
"original_name": "text",
"translations.sitcom_name": "text"
},
{
"default_language": "danish"
}
)
Rzućmy okiem na indeks:
db.sitcoms.getIndexes()
Wynik:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "original_name_text_translations.sitcom_name_text", "default_language" : "danish", "weights" : { "original_name" : 1, "translations.sitcom_name" : 1 }, "language_override" : "language", "textIndexVersion" : 3 } ]
Widzimy, że domyślnym językiem jest teraz danish
jak określono.
language_override
Parametr
Być może zastanawiasz się „Skąd MongoDB wiedział, że language
dokumentu? pole jest polem, które określa język?”.
I to jest świetne pytanie. W końcu, co by było, gdybyśmy nadawali polu inną nazwę – skąd MongoDB wiedziałby, że to czy pole ma być używane dla języka?
Jeśli spojrzysz na powyższy indeks, zobaczysz, że ma on language_override
pole. W szczególności wygląda to tak:"language_override" : "language"
Oznacza to, że language
dokumentu pole będzie polem, którego indeks używa do zastąpienia języka.
Kiedy tworzysz text
indeks, indeks będzie szukał pól o nazwie language
a następnie użyj ich jako języka odpowiedniego dokumentu.
Jednak nazwa language
nie jest osadzony w kamieniu. Możesz to zmienić, jeśli sobie tego życzysz.
Załóżmy, że nasza kolekcja zawiera dokumenty, w których nazwy pól są w języku duńskim.
Tak:
{ "_id" : 1, "originalt_navn" : "Family Guy", "sprog" : "english", "oversættelser" : { "sprog" : "german", "sitcom-navn" : "Familienmensch" } } { "_id" : 2, "originalt_navn" : "Cuéntame como pasó", "sprog" : "spanish", "oversættelser" : [ { "sprog" : "english", "sitcom-navn" : "Tell me how it happened" }, { "sprog" : "french", "sitcom-navn" : "Raconte-moi comment cela s'est passé" } ] }
W tym przypadku sprog
to pole, które określa język każdego dokumentu.
Dlatego możemy utworzyć indeks w następujący sposób:
db.sitcoms.createIndex(
{
"original_name": "text",
"translations.sitcom_name": "text"
},
{
"default_language": "danish",
"language_override": "sprog"
}
)
Sprawdźmy indeks:
db.sitcoms.getIndexes()
Wynik:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "original_name_text_translations.sitcom_name_text", "default_language" : "danish", "language_override" : "sprog", "weights" : { "original_name" : 1, "translations.sitcom_name" : 1 }, "textIndexVersion" : 3 } ]
W naszym nowo utworzonym text
indeks, mamy default_language
jako danish
i language_override
pole jako sprog
.
Dostępne języki
W chwili pisania tego tekstu istnieje około 15 języków obsługiwanych przez text
indeksy i $text
operatora.
Możesz użyć długiej nazwy języka (jak w powyższych przykładach) lub dwuliterowego kodu języka ISO 639-1.
Lista języków wyszukiwania tekstu jest dostępna na stronie MongoDB.