Tomalakによるテキストのインデックス作成の仕組みの説明は正しいですが、実際には、テキストインデックスを使用して、特殊文字を含むフレーズと完全に一致するフレーズを作成できます。
> 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" }
完全に一致するフレーズは、フレーズを二重引用符で囲むことで示されます。これは、"\"#text\""
のようにシェルでエスケープする必要があります。 。
テキストインデックスは通常のインデックスよりも大きくなりますが、大文字と小文字を区別しない完全なフレーズ一致を多数行う場合は、パフォーマンスが向上するため、標準のインデックスよりも優れたオプションになる可能性があります。たとえば、フィールドt
インデックス付き{ "t" : 1 }
、完全一致の正規表現
> db.test.find({ "t" : /#text/ })
フルインデックススキャンを実行します。類似の(ただし同等ではない)テキストクエリ
> db.test.find({ "$text" : { "$search" : "\"#text\"" } })
テキストインデックスを使用して、"text"
という用語を含むドキュメントを検索します 次に、これらすべてのドキュメントをスキャンして、完全なフレーズ"#text
が含まれているかどうかを確認します。 "。
テキストインデックスでは大文字と小文字が区別されないため、注意してください。上記の例を続ける:
> 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" }