Tomalak's beschrijving van hoe tekstindexering werkt, is correct, maar u kunt een tekstindex gebruiken voor een exacte woordgroepovereenkomst op een woordgroep met een speciaal teken:
> 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" }
Exacte overeenkomsten met woordgroepen worden aangegeven door de woordgroep tussen dubbele aanhalingstekens te plaatsen, die in de shell moeten worden escaped, zoals "\"#text\""
.
Tekstindexen zijn groter dan normale indexen, maar als u veel hoofdletterongevoelige exacte woordgroepen gebruikt, kunnen ze een betere optie zijn dan een standaardindex omdat ze beter presteren. Bijvoorbeeld in een veld t
met een index { "t" : 1 }
, een exacte match-regex
> db.test.find({ "t" : /#text/ })
voert een volledige indexscan uit. De analoge (maar niet equivalente) tekstquery
> db.test.find({ "$text" : { "$search" : "\"#text\"" } })
zal de tekstindex gebruiken om documenten te zoeken die de term "text"
bevatten en scan vervolgens al die documenten om te zien of ze de volledige zin "#text
. bevatten ".
Wees voorzichtig, want tekstindexen zijn niet hoofdlettergevoelig. Voortzetting van het bovenstaande voorbeeld:
> 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" }