MongoDB ни предоставя възможността да създаваме заместващи текстови индекси.
Текстовите индекси с заместващи символи са подобни на индексите с заместващи символи, с изключение на това, че текстовите индекси с заместващи символи поддържат $text
оператор, докато индексите на заместващи символи не го правят.
Въпреки това създаването на всеки тип индекс е много подобно в смисъл, че и двамата споделят заместващия знак $**
модел на полето.
Пример
Да предположим, че имаме колекция, наречена posts
, и съдържа документи, които изглеждат така:
{ "_id" : 1, "title" : "Title text...", "body" : "Body text...", "abstract" : "Abstract text...", "tags" : [ "tag1", "tag2", "tag3" ] }
Бихме могли да създадем текстов индекс с заместващи знаци за тази колекция по следния начин:
db.posts.createIndex( { "$**": "text" } )
Изход:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Това използва заместващия знак $**
модел на поле, за да създадете индекс за всички текстови полета. Когато създадете индекс като този, MongoDB индексира всяко поле, което съдържа низови данни за всеки документ в колекцията.
Това може да бъде полезно, ако колекцията съдържа много неструктурирано съдържание и няма последователност на текстовите полета в документите. В такива случаи няма да можете изрично да включите полетата в индекса, защото няма да знаете кои полета ще бъдат в документите.
Претеглени полета
Можете да използвате weights
параметър за присвояване на различни тегла на полетата в текстов индекс.
Пример:
db.posts.createIndex(
{ "$**": "text" },
{ weights: {
body: 10,
abstract: 5
}
}
)
Изход:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
В този случай 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
.