La description de Tomalak du fonctionnement de l'indexation de texte est correcte, mais vous pouvez en fait utiliser un index de texte pour une correspondance exacte sur une phrase avec un caractère spécial :
> 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" }
Les correspondances de phrases exactes sont indiquées en entourant la phrase de guillemets doubles, qui doivent être échappés dans le shell comme "\"#text\""
.
Les index de texte sont plus volumineux que les index normaux, mais si vous faites beaucoup de correspondances de phrases exactes insensibles à la casse, ils peuvent être une meilleure option qu'un index standard car ils fonctionneront mieux. Par exemple, sur un champ t
avec un index { "t" : 1 }
, une regex de correspondance exacte
> db.test.find({ "t" : /#text/ })
effectue une analyse complète de l'index. La requête textuelle analogue (mais non équivalente)
> db.test.find({ "$text" : { "$search" : "\"#text\"" } })
utilisera l'index de texte pour localiser les documents contenant le terme "text"
, puis scannez tous ces documents pour voir s'ils contiennent la phrase complète "#text
".
Soyez prudent car les index de texte ne sont pas sensibles à la casse. Reprenons l'exemple ci-dessus :
> 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" }