MongoDB がテキスト検索結果を返す場合、返された各ドキュメントにスコアが割り当てられます。 スコアは、特定の検索クエリに対するドキュメントの関連性を示します。 返されたドキュメントをスコア別にソートして、最も関連性の高いドキュメントが結果セットの最初に表示されるようにすることができます。
複数のテキスト インデックス キーを持つ複合インデックスがある場合は、インデックス フィールドごとに異なる重みを指定できます。 インデックス付きフィールドの重みは、他のインデックス付きフィールドと比較したフィールドの重要性を示し、重みが大きいほどテキスト検索スコアが高くなります。
たとえば、ユーザーがタイトルを検索する可能性が高いことがわかっている場合や、 titleに他のドキュメント フィールドと比較してより関連性の高い検索タームが含まれている場合は、 titleフィールドで検索一致を強調できます。
インデックス付きのデフォルトの重みは、インデックス付きフィールドの 1 です。 インデックス フィールドの重みを調整するには、次の例に示すように、 db.collection.createIndex()メソッドに 重み オプションを含めます。
db.<collection>.createIndex( { <field1>: "text", <field2>: "text", ... }, { weights: { <field1>: <weight>, <field2>: <weight>, ... }, name: <indexName> } )
重要
インデックスの作成後にその重みを変更する場合、MongoDB はコレクションを再インデックス化する必要があります。 インデックスの再作成は、特に大規模なコレクションのパフォーマンスに悪影響を与える可能性があります。 詳しくは、「 格納済みコレクションでのインデックス ビルド 」を参照してください。
このタスクについて
個々のブログ投稿のドキュメントを含むblogコレクションがある場合 各ドキュメントには、次の内容が含まれています。
投稿の内容。
投稿がカバーするトピック。
投稿に関連するキーワードのリスト。
テキストインデックスを作成して、ユーザーがブログ投稿に対してテキスト検索を実行できるようにしたいと考えています。 アプリケーションは、コンテンツ、トピック、キーワードの検索をサポートしています。
他のドキュメント フィールドよりも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演算子を使用します。
フィールドと フィールドの一致contentabout
次のクエリは、 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重み)を持ちます。
フィールドと フィールドの一致keywordsabout
次のクエリは、 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 でのテキスト検索の詳細については、以下を参照してください。
注意
MongoDB Search
MongoDBでホストされているデータの場合、 MongoDB Search は インデックスよりも堅牢なカスタムtext スコアリングを提供します。詳しくは、 「 MongoDB Search スコアリング 」のドキュメントを参照してください。