キーワード検索をサポートするモデルデータ
注意
キーワード検索は テキスト検索 や 検索 と 同一ではFull Text Search なく 、ステミングなどのテキスト処理機能は提供されません。詳細については、「 キーワード インデックスの制限 」セクションを参照してください。
2.4では、 MongoDB にはテキスト検索機能があります。 詳細については、「自己管理型配置のテキスト インデックス 」を参照してください。
アプリケーションでテキストを保持するフィールドの内容に対してクエリを実行する必要がある場合は、テキストに対して完全一致を実行するか、 $regex
を使用して正規表現によるパターン一致を使用できます。 ただし、テキストに対する多くの操作では、これらのメソッドはアプリケーション要件を満たしていません。
このパターンでは、MongoDB を使用してキーワード検索をサポートする方法の 1 つで、テキストフィールドと同じドキュメント内の配列に保存されているキーワードを使用します。 このパターンをマルチキーインデックスと組み合わせると、アプリケーションのキーワード検索操作をサポートできます。
パターン
キーワードベースのクエリをサポートするようにドキュメントに構造を追加するには、ドキュメント内に配列フィールドを作成し、キーワードを配列に string として追加します。 次に、 配列にマルチキー インデックスを作成し、 配列から値を選択するクエリを作成できます。
例
トピックベースの検索を提供したいライブラリ ボリュームのコレクションがある場合。 各ボリュームに対して、配列topics
を追加し、特定のボリュームに必要な数の キーワードを追加します。
Moby-Dick
ボリュームの場合、次のドキュメントがある可能性があります。
{ title : "Moby-Dick" , author : "Herman Melville" , published : 1851 , ISBN : 0451526996 , topics : [ "whaling" , "allegory" , "revenge" , "American" , "novel" , "nautical" , "voyage" , "Cape Cod" ] }
次に、 topics
配列にマルチキー インデックスを作成します。
db.volumes.createIndex( { topics: 1 } )
マルチキー インデックスでは、 topics
配列内の各キーワードに対して個別のインデックスエントリが作成されます。 たとえば、インデックスにはwhaling
のエントリが 1 つと、 allegory
のエントリが 1 つ含まれています。
次に、キーワードに基づいてクエリを実行します。 例:
db.volumes.findOne( { topics : "voyage" }, { title: 1 } )
注意
数百または数千のキーワードを持つ配列など、多数の要素を含む配列では、挿入時のインデックス コストが高くなります。
キーワード インデックスの制限
MongoDB は、特定のデータモデルとマルチキー インデックスを使用したキーワード検索をサポートできます。ただし、これらの キーワード インデックスは次の点で全文製品に十分ではなく、同等ではありません。
ステミング。 MongoDB のキーワード クエリでは、ルートまたは関連単語のキーワードを解析できません。
シノニム(同意語) 。 キーワードベースの検索機能は、アプリケーション層内のシノニム(同意語)または関連するクエリのサポートを提供する必要があります。
ランキング。 このドキュメントで説明されているキーワード検索では、結果を重み付ける方法は提供されていません。
非同期インデックス作成。 MongoDB はインデックスを同期してビルドするため、キーワード インデックスに使用されるインデックスは常に最新で、リアルタイムで動作できます。 ただし、一部のコンテンツやワークロードでは非同期一括インデックスの方が効率的な場合があります。