この章では、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の全文検索は、中国語のフレーズに対するサポートはあまり良くありません。