La descrizione di Tomalak di come funziona l'indicizzazione del testo è corretta, ma puoi effettivamente utilizzare un indice di testo per una corrispondenza esatta di una frase su una frase con un carattere speciale:
> 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" }
Le corrispondenze esatte delle frasi sono indicate racchiudendo la frase tra virgolette doppie, che devono essere sottoposte a escape nella shell come "\"#text\""
.
Gli indici di testo sono più grandi dei normali indici, ma se stai eseguendo molte corrispondenze di frasi esatte senza distinzione tra maiuscole e minuscole, possono essere un'opzione migliore rispetto a un indice standard perché funzioneranno meglio. Ad esempio, su un campo t
con un indice { "t" : 1 }
, un'espressione regolare di corrispondenza esatta
> db.test.find({ "t" : /#text/ })
esegue una scansione completa dell'indice. La query di testo analoga (ma non equivalente)
> db.test.find({ "$text" : { "$search" : "\"#text\"" } })
utilizzerà l'indice di testo per individuare i documenti contenenti il termine "text"
, quindi scansiona tutti quei documenti per vedere se contengono la frase completa "#text
".
Fai attenzione perché gli indici di testo non fanno distinzione tra maiuscole e minuscole. Continuando l'esempio sopra:
> 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" }