Opis działania indeksowania tekstu autorstwa Tomalaka jest poprawny, ale w rzeczywistości można użyć indeksu tekstu do dokładnego dopasowania frazy do frazy ze znakiem specjalnym:
> 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" }
Dokładne dopasowania fraz są wskazywane przez otoczenie frazy podwójnymi cudzysłowami, które muszą być zmienione w powłoce, jak "\"#text\""
.
Indeksy tekstowe są większe niż normalne indeksy, ale jeśli wykonujesz wiele dokładnych dopasowań fraz bez uwzględniania wielkości liter, mogą one być lepszą opcją niż indeks standardowy, ponieważ będą działać lepiej. Na przykład w polu t
z indeksem { "t" : 1 }
, wyrażenie regularne w dopasowaniu ścisłym
> db.test.find({ "t" : /#text/ })
wykonuje pełne skanowanie indeksu. Analogiczne (ale nie równoważne) zapytanie tekstowe
> db.test.find({ "$text" : { "$search" : "\"#text\"" } })
użyje indeksu tekstowego do zlokalizowania dokumentów zawierających termin "text"
, a następnie zeskanuj wszystkie te dokumenty, aby sprawdzić, czy zawierają pełną frazę "#text
".
Zachowaj ostrożność, ponieważ w indeksach tekstowych nie jest rozróżniana wielkość liter. Kontynuując powyższy przykład:
> 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" }