Когато създавате 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 .