MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Impedire a mongodb di ignorare i caratteri speciali?

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" }