Tomalaks beskrivelse af, hvordan tekstindeksering fungerer, er korrekt, men du kan faktisk bruge et tekstindeks til et eksakt sætningsmatch på en sætning med et specialtegn:
> 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" }
Nøjagtige sætningsmatches er angivet ved at omgive sætningen i dobbelte anførselstegn, som skal escapes i skallen som "\"#text\""
.
Tekstindekser er større end normale indekser, men hvis du laver en masse ufølsomme eksakte sætningsmatches, kan de være en bedre mulighed end et standardindeks, fordi de vil yde bedre. For eksempel på et felt t
med et indeks { "t" : 1 }
, et regulært udtryk
> db.test.find({ "t" : /#text/ })
udfører en fuld indeksscanning. Den analoge (men ikke tilsvarende) tekstforespørgsel
> db.test.find({ "$text" : { "$search" : "\"#text\"" } })
vil bruge tekstindekset til at finde dokumenter, der indeholder termen "text"
, scan derefter alle disse dokumenter for at se, om de indeholder den fulde sætning "#text
".
Vær forsigtig, fordi tekstindekser ikke skelner mellem store og små bogstaver. Fortsætter eksemplet ovenfor:
> 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" }