Когато създавате text
index в MongoDB, имате възможност да приложите различни тегла към всяко индексирано поле.
Тези тегла означават относителната значимост на индексираните полета едно спрямо друго. Поле с по-високо тегло ще има по-голямо влияние в резултатите от търсенето, отколкото поле с по-ниско тегло.
Това ви осигурява известен контрол върху това как се изчисляват резултатите от търсенето.
Теглото по подразбиране е 1, така че ако не посочите тежест за поле, ще му бъде присвоена тежест 1.
Пример
Да предположим, че имаме колекция, наречена posts
, и съдържа документи като този:
{ "_id" : 1, "title" : "The Web", "body" : "Body text...", "abstract" : "Abstract text..." }
Можем да създадем съставен text
индексирайте към трите текстови полета и приложете различни тежести към всяко от тях.
Като това:
db.posts.createIndex(
{
title : "text",
body : "text",
abstract : "text"
},
{
weights: {
body: 10,
abstract: 5
}
}
)
Когато създадох съставния text
индекс, посочих 3 полета. Когато посочих теглата, посочих тегла само за две от тези полета.
Резултатът е, че тези две полета ще бъдат претеглени, както е посочено, а другото поле (title
) ще има теглото по подразбиране 1.
Можем да видим това, когато изпълним getIndexes()
:
db.posts.getIndexes()
Резултат:
[ { "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 } ]
Това означава, че body
полето ще има два пъти по-голямо значение от abstract
поле и десет пъти по-голямо от значението на title
поле.
Текстови индекси с заместващи знаци с претеглени полета
Можете да прилагате тежести, когато създавате индекси на текст с заместващи знаци. Текстовите индекси със заместващи знаци могат да бъдат полезни, когато не знаете какви ще бъдат текстовите полета в документите. Може би познавате някои , но не всички.
В такива случаи можете да създадете текстов индекс с заместващи знаци и да присвоите тежест на онези полета, които сте наясно. На всички други полета ще бъде присвоена стойност по подразбиране 1.
Да предположим, че имаме следния документ като насока:
{ "_id" : 1, "title" : "Title text...", "body" : "Body text...", "abstract" : "Abstract text...", "tags" : [ "tag1", "tag2", "tag3" ] }
Той е подобен на предишния документ, с изключение на това, че вече има tags
поле, което съдържа масив. Но доколкото знаем, бъдещите документи в тази колекция може да имат други полета – като може би categories
, keywords
, author_bio
и др.
Но всъщност не знаем, така че ще създадем текстов индекс, който ще капсулира всички полета с низови данни. И ще създадем тежести за някои от познатите полета.
Пример:
db.posts.createIndex(
{ "$**": "text" },
{ weights: {
body: 10,
abstract: 5
}
}
)
В този случай body
полето получава тежест от 10
и abstract
полето получава тежест от 5
. Това означава, че body
поле има двойно по-голямо въздействие от абстрактното поле и десет пъти по-голямо от всички други текстови полета (защото ще им бъде присвоена тежест по подразбиране от 1).
След създаването на този индекс, ако извикаме getIndexes()
, можем да видим тежестите, дадени на полетата:
db.posts.getIndexes()
Резултат:
[ { "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 } ]
Както се очакваше, body
полето получава 10
, abstract
полето получава 5
, а всички останали получават 1
.