この章では、SQLの"like"演算子とは異なるMongoDBの全文検索について紹介します。MongoDBの全文検索は、SQLの"like"の実装と比べて、テキスト検索においてより効率的です。
テストデータの準備
storesコレクションにいくつかのレコードを追加します
db.stores.insert(
[
{ _id: 1, name: "Java Hut", description: "コーヒーとケーキ" },
{ _id: 2, name: "Burger Buns", description: "グルメハンバーガー" },
{ _id: 3, name: "Coffee Shop", description: "コーヒーだけ" },
{ _id: 4, name: "Clothes Clothes Clothes", description: "ディスカウント衣料品" },
{ _id: 5, name: "Java Shopping", description: "インドネシア製品" }
]
)
テキストインデックスの作成
全文検索機能を使用するために、テキストインデックスを作成する必要があります。 例:
db.stores.createIndex( { name: "text", description: "text" } )
説明:
- nameとdescriptionフィールドに対してテキスト型のインデックスを作成します。
注意: 1つのコレクションには1つのテキストインデックスしか許可されませんが、テキストインデックスには複数のフィールドを含めることができます。
$text演算子
テキスト検索には$text演算子を使用します。
構文:
{ $text: { $search: "検索キーワード" } }
例:
db.stores.find( { $text: { $search: "java coffee shop" } } )
説明:
- nameとdescriptionフィールドにキーワード"coffee"、"shop"、"java"を含むドキュメントを検索します。
出力:
{ "_id" : 3, "name" : "Coffee Shop", "description" : "コーヒーだけ" }
{ "_id" : 1, "name" : "Java Hut", "description" : "コーヒーとケーキ" }
{ "_id" : 5, "name" : "Java Shopping", "description" : "インドネシア製品" }
フレーズ検索
db.stores.find( { $text: { $search: "\"coffee shop\"" } } )
出力
{ "_id" : 3, "name" : "Coffee Shop", "description" : "コーヒーだけ" }
関連性ソート
デフォルトでは、$textクエリの結果はソートされません。$textクエリは、各ドキュメントの関連性のスコア(textScore)を計算します。このスコアを使用して、関連性の高いドキュメントをソートして表示できます。
db.stores.find(
{ $text: { $search: "java coffee shop" } },
{ score: { $meta: "textScore" } } // textScore関連性スコアを返すことを宣言
).sort( { score: { $meta: "textScore" } } ) // textScoreを使用してソートを指定
注意: MongoDBの全文検索は、中国語のフレーズに対するサポートはあまり良くありません。