Tomalaks beskrivning av hur textindexering fungerar är korrekt, men du kan faktiskt använda ett textindex för en exakt frasmatchning på en fras med ett specialtecken:
> 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" }
Exakta frasmatchningar indikeras genom att omge frasen med dubbla citattecken, som måste escapes i skalet som "\"#text\""
.
Textindex är större än vanliga index, men om du gör många skiftlägesokänsliga exakta frasmatchningar kan de vara ett bättre alternativ än ett standardindex eftersom de kommer att prestera bättre. Till exempel i ett fält t
med ett index { "t" : 1 }
, ett exakt matchande regex
> db.test.find({ "t" : /#text/ })
utför en fullständig indexskanning. Den analoga (men inte likvärdiga) textfrågan
> db.test.find({ "$text" : { "$search" : "\"#text\"" } })
kommer att använda textindexet för att hitta dokument som innehåller termen "text"
, skanna sedan alla dessa dokument för att se om de innehåller hela frasen "#text
".
Var försiktig eftersom textindex inte är skiftlägeskänsliga. Fortsätter exemplet ovan:
> 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" }