自己管理型配置のテキスト検索結果への重みの割り当て
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
演算子を使用します。
フィールドと フィールドの一致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 でのテキスト検索の詳細については、以下を参照してください。
注意
Atlas Search
MongoDB Atlas でホストされているデータの場合、 Atlas Searchはtext
インデックスよりも堅牢なカスタム スコアリングを提供します。 詳しくは、「 Atlas Searchスコアリング」のドキュメントを参照してください。