注意
MongoDB Search は、関連性の向上やスコアのブーストなど、高度な全文検索機能を提供します。関連性スコアに基づいてテキスト検索結果を割り当て、並べ替えるには、$text 演算子ではなく、 フィールドとともに$search ステージを使用することを推奨します。score
MongoDB が$text クエリの結果を返すと、返された各ドキュメントにスコアが割り当てられます。スコアは、特定の検索クエリに対するドキュメントの関連性を示します。返されたドキュメントをスコア別にソートして、最も関連性の高いドキュメントが結果セットの最初に表示されるようにすることができます。
複合インデックス 複数のテキストインデックスキーを持つ場合は、インデックス付きフィールドごとに異なる重みを指定できます。インデックス付きフィールドの重みは、他のインデックス付きフィールドと比較したフィールドの重要性を示し、重みが大きいほどスコアが高くなります。
たとえば、ユーザーがタイトルを検索する可能性が高いことがわかっている場合や、 titleに他のドキュメント フィールドと比較して関連する検索タームが多く含まれている場合は、 titleフィールドで検索一致を強調できます。
インデックス フィールドのデフォルトの重みは 1 です。インデックス フィールドの重みを調整するには、次の例に示すように、db.collection.createIndex() メソッドに 重み オプションを含めます。
db.<collection>.createIndex( { <field1>: "text", <field2>: "text", ... }, { weights: { <field1>: <weight>, <field2>: <weight>, ... }, name: <indexName> } )
重要
インデックスの作成後にその重みを変更する場合、MongoDB はコレクションを再インデックス化する必要があります。 インデックスの再作成は、特に大規模なコレクションのパフォーマンスに悪影響を与える可能性があります。 詳しくは、「 格納済みコレクションでのインデックス ビルド 」を参照してください。
このタスクについて
個々のブログ投稿のドキュメントを含むblogコレクションがある場合 各ドキュメントには、次の内容が含まれています。
投稿の内容。
投稿がカバーするトピック。
投稿に関連するキーワードのリスト。
テキストインデックスを作成して、ユーザーがブログ記事に対して $text クエリを実行できるようにしたいと考えています。アプリケーションは、コンテンツ、トピック、キーワードの検索をサポートしています。
他のドキュメント フィールドよりもcontentフィールドの一致を優先する場合 インデックスの重みを使用して、 contentの一致の重要性を高め、クエリ結果をソートして、 contentの一致が最初に表示されるようにします。
始める前に
次のドキュメントを使用して blog コレクションを作成します。
db.blog.insertMany( [ { _id: 1, content: "This morning I had a cup of coffee.", about: "beverage", keywords: [ "coffee" ] }, { _id: 2, content: "Who likes chocolate ice cream for dessert?", about: "food", keywords: [ "poll" ] }, { _id: 3, content: "My favorite flavors are strawberry and coffee", about: "ice cream", keywords: [ "food", "dessert" ] } ] )
手順
インデックス フィールドごとに異なる重みを持つtextインデックスを作成します。
db.blog.createIndex( { content: "text", keywords: "text", about: "text" }, { weights: { content: 10, keywords: 5 }, name: "BlogTextIndex" } )
textインデックスには次のフィールドと重みがあります。
contentの重みは 10 です。keywordsの重みは 5 です。aboutのデフォルトの重みは 1 です。
これらの重みは、インデックス フィールドの相互に対する相対的な重要性を示します。
結果
次の例は、インデックス フィールドのさまざまな重みが結果スコアにどのように影響するかを示しています。 各例では、各ドキュメントのtextScoreに基づいて結果をソートします。 ドキュメントのtextScore属性にアクセスするには、 $meta演算子を使用します。
content フィールドと about フィールドの一致
次のクエリは、 blogコレクション内のドキュメントで string ice creamを検索します。
db.blog.find( { $text: { $search: "ice cream" } }, { score: { $meta: "textScore" } } ).sort( { score: { $meta: "textScore" } } )
出力:
[ { _id: 2, content: 'Who likes chocolate ice cream for dessert?', about: 'food', keywords: [ 'food', 'poll' ], score: 12 }, { _id: 3, content: 'My favorite flavors are strawberry and coffee', about: 'ice cream', keywords: [ 'food', 'dessert' ], score: 1.5 } ]
検索string ice cream は次と一致します。
_id: 2を持つドキュメントのcontentフィールド。_id: 3を持つドキュメントのaboutフィールド。
contentフィールドのターム一致は、 keywordsフィールドのターム一致として、 10倍の影響( 10:1重み)を持ちます。
keywords フィールドと about フィールドの一致
次のクエリは、 blogコレクション内のドキュメントで string foodを検索します。
db.blog.find( { $text: { $search: "food" } }, { score: { $meta: "textScore" } } ).sort( { score: { $meta: "textScore" } } )
出力:
[ { _id: 3, content: 'My favorite flavors are strawberry and coffee', about: 'ice cream', keywords: [ 'food', 'dessert' ], score: 5.5 }, { _id: 2, content: "Who likes chocolate ice cream for dessert?", about: 'food', keywords: [ 'poll' ], score: 1.1 } ]
検索string food は次と一致します。
_id: 3を持つドキュメントのkeywordsフィールド。_id: 2を持つドキュメントのaboutフィールド。
keywordsフィールドのターム一致は、 aboutフィールドのターム一致として、 5倍の影響( 5:1重み)を持ちます。
1 つのドキュメントでの複数の一致
次のクエリは、 blogコレクション内のドキュメントで string coffeeを検索します。
db.blog.find( { $text: { $search: "coffee" } }, { score: { $meta: "textScore" } } ).sort( { score: { $meta: "textScore" } } )
出力:
[ { _id: 1, content: 'This morning I had a cup of coffee.', about: 'beverage', keywords: [ 'coffee' ], score: 11.666666666666666 }, { _id: 3, content: 'My favorite cake flavors are strawberry and coffee', about: 'ice cream', keywords: [ 'food', 'dessert' ], score: 6 } ]
検索string coffee は次と一致します。
_id: 1を持つドキュメント内のcontentフィールドとkeywordsフィールド。_id: 3を持つドキュメントのcontentフィールド。
検索stringが複数のフィールドと一致するときに score を計算するために、 MongoDBは一致の数に対応するフィールドの重みを掛けて結果を合計します。
詳細
MongoDBの $text クエリの詳細については、以下をご覧ください。
注意
MongoDB Search
MongoDBでホストされているデータの場合、MongoDB Search は text インデックスよりも堅牢なカスタム スコアリングを提供します。詳しくは、 MongoDB Search スコアリング のドキュメントを参照してください。