Tomalakův popis toho, jak funguje indexování textu, je správný, ale ve skutečnosti můžete použít textový index pro přesnou frázovou shodu fráze se speciálním znakem:
> 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" }
Přesné frázové shody jsou označeny ohraničením fráze ve dvojitých uvozovkách, které je třeba v shellu uvozovat jako "\"#text\""
.
Textové indexy jsou větší než normální indexy, ale pokud provádíte mnoho přesných frázových shod bez rozlišení velkých a malých písmen, mohou být lepší volbou než standardní index, protože budou fungovat lépe. Například na pole t
s indexem { "t" : 1 }
, přesná shoda regulárního výrazu
> db.test.find({ "t" : /#text/ })
provede úplné skenování indexu. Analogický (ale ne ekvivalentní) textový dotaz
> db.test.find({ "$text" : { "$search" : "\"#text\"" } })
použije textový index k vyhledání dokumentů obsahujících výraz "text"
a poté naskenujte všechny tyto dokumenty, abyste zjistili, zda obsahují celou frázi "#text
".
Buďte opatrní, protože textové indexy nerozlišují malá a velká písmena. Pokračujeme ve výše uvedeném příkladu:
> 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" }