Když vytvoříte text
index v MongoDB, index používá výchozí jazyk english
.
Výchozí jazyk určuje pravidla pro analýzu kořenů slov (tj. odvození od kořenů) a ignorování zastavovacích slov.
V případě potřeby však můžete výchozí jazyk změnit.
Můžete také určit jazyk na úrovni dokumentu a dokonce i na úrovni vnořeného dokumentu. Výchozí jazyk bude použit pouze v případě, že jazyk nebyl zadán na úrovni dokumentu nebo vnořeného dokumentu.
Tento článek uvádí příklady určení jazyka pro text
index.
Ukázková sbírka
Předpokládejme, že máme kolekci nazvanou sitcoms
s dokumenty, jako je tento:
{ "_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é" } ] }
Vidíme, že v této sbírce jsou dva dokumenty. Každý dokument obsahuje název situační komedie spolu s překlady názvu této situační komedie do různých jazyků. Jazyk každého překladu je uveden v language
pole příslušného vnořeného dokumentu.
Druhý dokument v této kolekci také obsahuje language
pole na jeho nejvyšší úrovni (v tomto případě "language" : "spanish"
). To znamená, že název sitcomu je ve španělštině (nebo alespoň španělština je jazyk, který chceme používat, když je tento dokument indexován).
První dokument však takové pole neobsahuje. Skutečnost, že první dokument neobsahuje language
nejvyšší úrovně pole znamená, že chceme, aby byl indexován pomocí výchozího jazyka. Pokud není během indexování zadán žádný výchozí jazyk, bude výchozím jazykem angličtina.
Pokud vložený dokument neobsahuje pole určující jazyk, použije se pole jazyka přiloženého dokumentu. Pokud přiložený dokument neobsahuje pole jazyka, použije se výchozí jazyk.
Vytvořte textový index pro více jazyků
Pojďme do toho a vytvořte text
index pro výše uvedenou kolekci.
db.sitcoms.createIndex(
{
"original_name": "text",
"translations.sitcom_name": "text"
}
)
Tím se vytvoří složený text
index na original_name
pole a translations.sitcom_name
pole (tj. sitcom_name
pole ve vložených dokumentech).
Nyní použijeme getIndexes()
podívat se na ten index:
db.sitcoms.getIndexes()
Výsledek:
[ { "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 } ]
Vidíme, že používá výchozí jazyk angličtinu. Toto je specifikováno jako "default_language" : "english"
.
Změnit výchozí jazyk
V případě potřeby můžeme při vytváření indexu nastavit jiný výchozí jazyk.
Pojďme index vypustit a znovu jej vytvořit s jiným výchozím jazykem:
db.sitcoms.dropIndex("original_name_text_translations.sitcom_name_text")
db.sitcoms.createIndex(
{
"original_name": "text",
"translations.sitcom_name": "text"
},
{
"default_language": "danish"
}
)
Podívejme se na index:
db.sitcoms.getIndexes()
Výsledek:
[ { "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 } ]
Vidíme, že výchozí jazyk je nyní danish
jak je uvedeno.
Přepis language_override
Parametr
Možná se ptáte, „jak MongoDB věděl, že language
dokumentu je pole je pole, které určuje jazyk?“.
A to je skvělá otázka. Ostatně, co kdybychom poli dali jiný název – jak by MongoDB věděl, že to je pole, které se má pro jazyk použít?
Pokud se podíváte na výše uvedený index, uvidíte, že má language_override
pole. Konkrétně to vypadá takto:"language_override" : "language"
To znamená, že language
dokumentu pole bude pole, které index používá k přepsání jazyka.
Když vytvoříte text
index, bude index hledat všechna pole nazvaná language
a poté je použijte jako jazyk pro příslušný dokument.
Název language
není vytesán do kamene. Můžete to změnit, pokud si to přejete.
Předpokládejme, že naše sbírka obsahuje dokumenty, kde jsou názvy polí v dánštině.
Takhle:
{ "_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é" } ] }
V tomto případě sprog
je pole, které určuje jazyk každého dokumentu.
Proto můžeme index vytvořit následovně:
db.sitcoms.createIndex(
{
"original_name": "text",
"translations.sitcom_name": "text"
},
{
"default_language": "danish",
"language_override": "sprog"
}
)
Podívejme se na index:
db.sitcoms.getIndexes()
Výsledek:
[ { "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 } ]
V našem nově vytvořeném text
index, máme default_language
jako danish
a language_override
pole jako sprog
.
Dostupné jazyky
V době psaní tohoto článku existuje asi 15 jazyků, které podporuje text
indexy a $text
operátor.
Můžete použít dlouhý název jazyka (jako ve výše uvedených příkladech) nebo dvoupísmenný kód jazyka ISO 639-1.
Seznam jazyků textového vyhledávání je k dispozici na webu MongoDB.