Když vytvoříte text
index v MongoDB, máte možnost použít různé váhy na každé indexované pole.
Tyto váhy označují vzájemnou relativní významnost indexovaných polí. Pole s vyšší váhou bude mít větší dopad na výsledky vyhledávání než pole s nižší váhou.
To vám poskytuje určitou míru kontroly nad tím, jak se vypočítávají výsledky vyhledávání.
Výchozí váha je 1, takže pokud pro pole neurčíte váhu, bude mu přiřazena váha 1.
Příklad
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..." }
Mohli bychom vytvořit složený text
index na tři textová pole a aplikujte na každé z nich jinou váhu.
Takhle:
db.posts.createIndex(
{
title : "text",
body : "text",
abstract : "text"
},
{
weights: {
body: 10,
abstract: 5
}
}
)
Když jsem vytvořil složený 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()
:
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.
Zástupné textové indexy s váženými poli
Při vytváření indexů zástupných textů můžete použít váhy. Zástupné textové indexy mohou být užitečné, když nevíte, jaká textová pole budou v dokumentech. Možná některé znáte , ale ne všechny.
V takových případech můžete vytvořit index zástupných znaků a přiřadit váhu těm polím, o kterých víte. Všem ostatním polím bude přiřazena výchozí hodnota 1.
Předpokládejme, že máme jako vodítko následující dokument:
{ "_id" : 1, "title" : "Title text...", "body" : "Body text...", "abstract" : "Abstract text...", "tags" : [ "tag1", "tag2", "tag3" ] }
Je podobný předchozímu dokumentu, až na to, že nyní obsahuje tags
pole, které obsahuje pole. Ale pokud víme, budoucí dokumenty v této sbírce mohou mít další pole – třeba categories
, keywords
, author_bio
, atd.
Ale ve skutečnosti to nevíme, takže vytvoříme index zástupných znaků, který zapouzdří všechna pole řetězcovými daty. A vytvoříme váhy pro některá známá pole.
Příklad:
db.posts.createIndex(
{ "$**": "text" },
{ weights: {
body: 10,
abstract: 5
}
}
)
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()
, 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
.