V MongoDB můžete vytvořit různé typy indexů. Pokud máte pole, které obsahuje řetězec nebo pole řetězců, můžete použít text
index v tomto poli.
Chcete-li vytvořit text
index, použijte řetězcový doslovný "text"
jako hodnotu při jeho vytváření.
Vytvoření textového indexu v jednom poli
Předpokládejme, že máme kolekci nazvanou posts
a obsahuje dokumenty jako tento:
{ "_id" : 1, "title" : "The Web", "body" : "Body text...", "abstract" : "Abstract text..." }
Možná budeme chtít vytvořit text
index na body
pole nebo abstract
pole, nebo dokonce obojí.
Zde je návod, jak vytvořit text
index na body
pole:
db.posts.createIndex( { body : "text" } )
Výstup:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Nyní můžeme použít getIndexes()
metoda zobrazení indexu:
db.posts.getIndexes()
Výsledek:
[ { "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 } ]
Vidíme, že existují dva indexy. První z nich je výchozí _id
index, který se vytváří automaticky s kolekcí. Druhý index je ten, který jsme právě vytvořili.
MongoDB automaticky přiřadil název našemu nově vytvořenému indexu. Jmenuje se body_text
.
Vytvoření indexu složeného textu
Sbírka může mít pouze jeden text
index, ale v případě potřeby to může být složený index.
Vytvořme složený index, který bude obsahovat body
pole a abstract
pole.
Jak již bylo zmíněno, kolekce může mít pouze jeden text
index, takže vynecháme index, který jsme právě vytvořili:
db.posts.dropIndex("body_text")
Výstup:
{ "nIndexesWas" : 2, "ok" : 1 }
Dobře, teď, když jsme vynechali text
index, pojďme do toho a vytvořte další – tentokrát to bude složený index:
db.posts.createIndex( {
body : "text",
abstract : "text"
} )
Výstup:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
To je potvrzovací zpráva, která nám říká, že dříve existoval 1 index, ale nyní jsou 2.
Podívejme se znovu na seznam indexů:
db.posts.getIndexes()
Výsledek:
[ { "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 } ]
Všimněte si, že složený text
indexy mají následující omezení:
- Složený
text
index nemůže obsahovat žádné další speciální typy indexů, jako jsou víceklíčová nebo geoprostorová indexová pole. - Pokud je složený
text
index obsahuje klíče předtext
indexový klíč pro provedení$text
vyhledávání, predikát dotazu musí zahrnovat podmínky shody na předchozích klíčích. - Při vytváření složeného
text
index, veškerýtext
klíče indexu musí být uvedeny vedle sebe v dokumentu specifikace indexu.
Vytvoření indexu zástupného textu
Zástupný textový index můžete vytvořit pomocí zástupného znaku $**
vzor pole.
Vynecháme předchozí index a vytvoříme index zástupného textu:
db.posts.dropIndex("body_text_abstract_text")
db.posts.createIndex( { "$**" : "text" } )
MongoDB nám také poskytuje možnost vytvářet indexy zástupných znaků, nicméně indexy zástupných textů a indexy zástupných znaků jsou dvě odlišné věci.
Zejména indexy zástupných textů podporují $text
operátor, zatímco indexy zástupných znaků nikoli.
weights
Parametr
Při vytváření text
indexy, máte možnost určit váhu pro jedno nebo více polí. Ve výchozím nastavení je každému poli přiřazena váha 1. Tuto hodnotu však můžete změnit a dát polím větší či menší váhu ve výsledcích vyhledávání.
Příklad
db.posts.dropIndex("$**_text")
db.posts.createIndex(
{
title : "text",
body : "text",
abstract : "text"
},
{
weights: {
body: 10,
abstract: 5
}
}
)
Začal jsem vypuštěním předchozího indexu.
Když jsem vytvořil nový text
index, zadal jsem 3 pole. Když jsem specifikoval váhy, určil jsem váhy jen pro dvě z těchto polí.
Výsledkem je, že tato dvě pole budou mít váhu, jak je uvedeno, a druhé pole (title
) bude mít výchozí váhu 1.
Můžeme to vidět, když spustíme getIndexes()
znovu:
db.posts.getIndexes()
Výsledek:
[ { "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 } ]
To znamená, že body
pole bude mít dvakrát větší význam než abstract
pole a desetkrát větší význam než title
pole.
Vytváření vícejazyčných textových indexů
Všimnete si, že výše uvedený text
index obsahuje "default_language" : "english"
a "language_override" : "language"
v jeho definici.
Tato pole pomáhají při práci s dokumenty ve více jazycích. Hodnoty ve výše uvedeném indexu jsou výchozí hodnoty.
Když vytváříte dokument, můžete určit jazyk tohoto dokumentu pomocí language
pole (nebo jiné pole definované v language_override
pole text
index). Pokud takové pole v dokumentu neexistuje, použije výchozí jazyk uvedený v default_language
pole.
Můžete zadat default_language
(a language_override
), když vytváříte index.
Příklady vytváření textových indexů, které podporují více jazyků, najdete v části Vytvoření vícejazyčného textového indexu v MongoDB.