Когато създавате text
индекс в MongoDB, индексът използва език по подразбиране english
.
Езикът по подразбиране определя правилата за анализиране на корените на думите (т.е. изходни) и игнориране на спиращите думи.
Можете обаче да промените езика по подразбиране, ако е необходимо.
Можете също да посочите език на ниво документ и дори на ниво поддокумент. Езикът по подразбиране ще се използва само ако език не е посочен на ниво документ или поддокумент.
Тази статия представя примери за определяне на език за text
индекс.
Примерна колекция
Да предположим, че имаме колекция, наречена sitcoms
с документи като този:
{ "_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é" } ] }
Виждаме, че в тази колекция има два документа. Всеки документ съдържа името на сериала, заедно с преводи на името на сериала на различни езици. Езикът на всеки превод е посочен на language
поле на съответния поддокумент.
Вторият документ в тази колекция също включва language
поле на най-горното му ниво (в този случай, "language" : "spanish"
). Това означава, че името на сериала е на испански (или поне испанският е езикът, който искаме да се използва, когато този документ е индексиран).
Първият документ обаче не съдържа такова поле. Фактът, че първият документ не съдържа language
от най-високо ниво поле означава, че искаме то да бъде индексирано с езика по подразбиране. Ако не е посочен език по подразбиране по време на индексирането, тогава езикът по подразбиране ще бъде английски.
Ако вграден документ не съдържа поле, което посочва езика, тогава той ще използва езиковото поле на ограждащия документ. Ако ограждащият документ не съдържа поле за език, тогава той ще използва езика по подразбиране.
Създайте текстов индекс за няколко езика
Нека да продължим и да създадем text
индекс за горната колекция.
db.sitcoms.createIndex(
{
"original_name": "text",
"translations.sitcom_name": "text"
}
)
Това създава съставен text
индекс на original_name
полето и translations.sitcom_name
полето (т.е. sitcom_name
поле във вградените документи).
Сега нека използваме getIndexes()
за да разгледате този индекс:
db.sitcoms.getIndexes()
Резултат:
[ { "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 } ]
Можем да видим, че използва английски език по подразбиране. Това е посочено като "default_language" : "english"
.
Промяна на езика по подразбиране
Можем да зададем различен език по подразбиране при създаване на индекса, ако е необходимо.
Нека пуснем индекса и да го създадем отново с различен език по подразбиране:
db.sitcoms.dropIndex("original_name_text_translations.sitcom_name_text")
db.sitcoms.createIndex(
{
"original_name": "text",
"translations.sitcom_name": "text"
},
{
"default_language": "danish"
}
)
Нека да разгледаме индекса:
db.sitcoms.getIndexes()
Резултат:
[ { "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 } ]
Можем да видим, че езикът по подразбиране вече е danish
както е посочено.
language_override
Параметър
Може би се чудите „как MongoDB е знаел, че language
на документа полето е полето, което определя езика?”.
И това е страхотен въпрос. В крайна сметка, какво ще стане, ако дадем на полето друго име – как MongoDB би знаел, че то полето за използване ли е за езика?
Ако погледнете горния индекс, ще видите, че има language_override
поле. По-конкретно, това е така:"language_override" : "language"
Това означава, че language
на документа полето ще бъде полето, което индексът използва за отмяна на езика.
Когато създавате text
index, индексът ще търси полета, наречени language
и след това ги използвайте като език за съответния документ.
Въпреки това, името language
не е заложено в камък. Можете да го промените, ако желаете.
Да предположим, че нашата колекция съдържа документи, в които имената на полетата са на датски.
Като това:
{ "_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é" } ] }
В този случай sprog
е полето, което определя езика на всеки документ.
Следователно можем да създадем индекса, както следва:
db.sitcoms.createIndex(
{
"original_name": "text",
"translations.sitcom_name": "text"
},
{
"default_language": "danish",
"language_override": "sprog"
}
)
Нека проверим индекса:
db.sitcoms.getIndexes()
Резултат:
[ { "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 } ]
В нашия новосъздадения text
индекс, имаме default_language
като danish
и language_override
поле като sprog
.
Налични езици
Към момента на писане има около 15 езика, които се поддържат от text
индекси и $text
оператор.
Можете да използвате името на езика с дълга форма (както в горните примери) или двубуквения код на езика ISO 639-1.
Списък с езици за текстово търсене е достъпен на уебсайта на MongoDB.