MongoDB nám poskytuje možnost vytvářet indexy zástupných textů.
Indexy zástupných textů jsou podobné indexům zástupných znaků, kromě toho, že indexy zástupných textů podporují $text
operátor, zatímco indexy zástupných znaků nikoli.
To znamená, že vytváření každého typu indexu je velmi podobné v tom smyslu, že oba sdílejí zástupný znak $**
vzor pole.
Příklad
Předpokládejme, že máme kolekci nazvanou posts
a obsahuje dokumenty, které vypadají takto:
{ "_id" : 1, "title" : "Title text...", "body" : "Body text...", "abstract" : "Abstract text...", "tags" : [ "tag1", "tag2", "tag3" ] }
Mohli bychom vytvořit zástupný textový index pro tuto kolekci takto:
db.posts.createIndex( { "$**": "text" } )
Výstup:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
To používá zástupný znak $**
pole pro vytvoření indexu na všech textových polích. Když vytvoříte index, jako je tento, MongoDB indexuje každé pole, které obsahuje data řetězce pro každý dokument v kolekci.
To může být užitečné, pokud kolekce obsahuje mnoho nestrukturovaného obsahu a v dokumentech není žádná konzistence textových polí. V takových případech byste nemohli explicitně zahrnout pole do indexu, protože byste nevěděli, která pole budou v dokumentech.
Vážená pole
Můžete použít weights
parametr pro přiřazení různých vah k polím v indexu zástupných znaků.
Příklad:
db.posts.createIndex(
{ "$**": "text" },
{ weights: {
body: 10,
abstract: 5
}
}
)
Výstup:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
V tomto případě body
pole získá váhu 10
a abstract
pole získá váhu 5
. To znamená, že body
pole má dvakrát větší dopad než abstraktní pole a desetkrát větší dopad než všechna ostatní textová pole (protože jim bude přiřazena výchozí váha 1).
Po vytvoření tohoto indexu, pokud zavoláme getIndexes()
abychom vrátili všechny indexy pro kolekci, můžeme vidět váhy dané polím:
db.posts.getIndexes()
Výsledek:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "$**_text", "weights" : { "$**" : 1, "abstract" : 5, "body" : 10 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
Jak se očekávalo, body
pole získá 10
, abstract
pole získá 5
a všichni ostatní dostanou 1
.