Има различни типове индекси, които можете да създадете в MongoDB. Ако имате поле, което съдържа низ или масив от низове, можете да използвате text
индекс на това поле.
За да създадете text
index, използвайте низовия литерал "text"
като стойност при създаването му.
Създаване на текстов индекс в едно поле
Да предположим, че имаме колекция, наречена posts
, и съдържа документи като този:
{ "_id" : 1, "title" : "The Web", "body" : "Body text...", "abstract" : "Abstract text..." }
Може да искаме да създадем text
индекс на body
поле или abstract
поле или дори и двете.
Ето как да създадете text
индекс на body
поле:
db.posts.createIndex( { body : "text" } )
Изход:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Вече можем да използваме getIndexes()
метод за преглед на индекса:
db.posts.getIndexes()
Резултат:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "body_text", "weights" : { "body" : 1 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
Виждаме, че има два индекса. Първият е _id
по подразбиране индекс, който се създава автоматично с колекцията. Вторият индекс е този, който току-що създадохме.
MongoDB автоматично присвои име на новосъздадения ни индекс. Нарича се body_text
.
Създайте индекс на съставен текст
Една колекция може да има само един text
индекс, но може да бъде съставен индекс, ако е необходимо.
Нека създадем съставен индекс, който включва body
полето и abstract
поле.
Както споменахме, една колекция може да има само един text
индекс, така че нека пуснем индекса, който току-що създадохме:
db.posts.dropIndex("body_text")
Изход:
{ "nIndexesWas" : 2, "ok" : 1 }
Добре, сега махнахме text
индекс, нека да продължим и да създадем още един – този път ще бъде съставен индекс:
db.posts.createIndex( {
body : "text",
abstract : "text"
} )
Изход:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Това е съобщение за потвърждение, което ни казва, че преди е имало 1 индекс, но сега има 2.
Нека отново проверим списъка с индекси:
db.posts.getIndexes()
Резултат:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "body_text_abstract_text", "weights" : { "abstract" : 1, "body" : 1 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
Обърнете внимание, че съставен text
индексите имат следните ограничения:
- Съставен
text
индексът не може да включва никакви други специални типове индекси, като полета с множество ключове или геопространствени индекси. - Ако съставният
text
индексът включва ключове, предхождащиtext
индексен ключ, за да извършите$text
търсене, предикатът на заявката трябва да включва условия за съответствие на равенството на предходните ключове. - При създаване на съставен
text
индекс, целиятtext
индексните ключове трябва да бъдат изброени в съседство в документа за спецификация на индекса.
Създайте индекс на текст с заместващ знак
Можете да създадете заместващ текстов индекс, като използвате заместващия знак $**
модел на полето.
Нека пуснем предишния индекс и да създадем текстов индекс с заместващи знаци:
db.posts.dropIndex("body_text_abstract_text")
db.posts.createIndex( { "$**" : "text" } )
MongoDB ни предоставя и възможността да създаваме индекси с заместващи символи, но индексите на заместващи символи и индексите на заместващи символи са две различни неща.
По-специално, индексите за заместващи символи поддържат $text
оператор, докато индексите с заместващи знаци не го правят.
weights
Параметър
При създаване на text
индекси, имате възможност да зададете тежест за едно или повече полета. По подразбиране всяко поле получава тежест от 1. Но можете да промените това, за да дадете на полетата повече или по-малко тежест в резултатите от търсенето.
Пример
db.posts.dropIndex("$**_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
поле.
Създаване на многоезични текстови индекси
Ще забележите, че горният text
индексът включва "default_language" : "english"
и "language_override" : "language"
в нейното определение.
Тези полета помагат при работа с документи на множество езици. Стойностите в горния индекс са стойностите по подразбиране.
Когато създавате документ, можете да посочите езика на този документ, като използвате language
поле (или някакво друго поле, дефинирано в language_override
полето на text
индекс). Ако такова поле не съществува в документа, то ще използва езика по подразбиране, посочен в default_language
поле.
Можете да посочите default_language
(и language_override
), когато създавате индекса.
Вижте Създаване на многоезичен текстов индекс в MongoDB за примери за създаване на текстови индекси, които поддържат множество езици.