Описанието на Томалак за това как работи индексирането на текст е правилно, но всъщност можете да използвате текстов индекс за точно съвпадение по фраза на фраза със специален знак:
> db.test.drop()
> db.test.insert({ "_id" : 0, "t" : "hey look at all this #text" })
> db.test.insert({ "_id" : 1, "t" : "text is the best" })
> db.test.ensureIndex({ "t" : "text" })
> db.test.count({ "$text" : { "$search" : "text" } })
2
> db.test.count({ "$text" : { "$search" : "#text" } })
2
> db.test.find({ "$text" : { "$search" : "\"#text\"" } })
{ "_id" : 0, "t" : "hey look at all this #text" }
Точните съвпадения по фраза се обозначават чрез заобикаляне на фразата в двойни кавички, които трябва да бъдат екранирани в обвивката като "\"#text\""
.
Текстовите индекси са по-големи от нормалните индекси, но ако правите много точни съвпадения по фраза без значение на главни и малки букви, тогава те могат да бъдат по-добър вариант от стандартния индекс, защото ще работят по-добре. Например в поле t
с индекс { "t" : 1 }
, регулярен израз с точно съвпадение
> db.test.find({ "t" : /#text/ })
извършва пълно сканиране на индекса. Аналогичната (но не еквивалентна) текстова заявка
> db.test.find({ "$text" : { "$search" : "\"#text\"" } })
ще използва текстовия индекс, за да намери документи, съдържащи термина "text"
, след което сканирайте всички тези документи, за да видите дали съдържат пълната фраза "#text
".
Бъдете внимателни, защото текстовите индекси не са чувствителни към главни букви. Продължаване на примера по-горе:
> db.test.insert({ "_id" : 2, "t" : "Never seen so much #TEXT" })
> db.test.find({ "t" : /#text/ })
{ "_id" : 0, "t" : "hey look at all this #text" }
> db.test.find({ "$text" : { "$search" : "\"#text\"" } })
{ "_id" : 0, "t" : "hey look at all this #text" }
{ "_id" : 2, "t" : "Never seen so much #TEXT" }