重要
$scoreFusion
MongoDB 8.2+ を使用する配置でのみ使用できます。
定義
$scoreFusion
$scoreFusion
最初にすべての入力パイプラインを個別に実行し、次に重複を除外して、入力パイプラインの結果を最終スコアリングされた結果セットに結合します。$scoreFusion
は、ドキュメントのスコアと入力パイプラインの重みに基づいて、ランク付けされたドキュメントのセットを出力します。算術式を指定して、パイプラインステージの入力スコアに基づいてスコアを計算できます。デフォルトでは 、さまざまな入力パイプラインステージからのドキュメントのスコアの平均が使用されます。$scoreFusion
を使用して、複数の条件に基づいて単一のコレクション内のドキュメントを検索し、指定されたすべての条件に要素が含まれる最終スコア付き結果セットを取得します。
構文
このステージの構文は、次のとおりです。
{ $scoreFusion: { input: { pipelines: { <input-pipeline-name>: <expression>, <input-pipeline-name>: <expression>, ... }, normalization: "none|sigmoid|minMaxScaler" }, combination: { weights: { <input-pipeline-name>: <numeric expression>, <input-pipeline-name>: <numeric expression>, ... }, method: "avg|expression", expression: <expression> } } }
フィールド
$scoreFusion
は、次のフィールドがあります。
フィールド | タイプ | 説明 |
---|---|---|
| オブジェクト |
|
| オブジェクト |
|
| 文字列 | 結果を結合する前に、スコアを
|
| オブジェクト | 任意。 |
| オブジェクト | 任意。結果を組み合わせるときに正規化された入力パイプラインスコアに適用する重み。入力パイプラインに対して 1 つのパイプラインに対応します。パイプラインの重みが指定されていない場合、デフォルトの重みは |
| 文字列 | 任意。スコアを結合する方法を指定します。値は次のとおりです。
省略した場合、デフォルトは |
| 算術式 | 任意。入力スコアを組み合わせるロジックを指定します。これは、
|
| ブール値 | 任意。出力ドキュメントのメタデータに各入力パイプラインからの詳細なスコアリング情報を含めるかどうかを指定します。省略した場合、デフォルトは |
動作
コレクション
$scoreFusion
は 1 つのコレクションでのみ使用できます。この集計ステージは、データベーススコープでは使用できません。
De-Duplication
$scoreFusion
は、最終出力の複数の入力パイプラインにわたる結果の重複を排除します。一意の各入力ドキュメントは、ドキュメントが入力パイプライン出力に表示される回数に関係なく、$scoreFusion
出力に最大 1 回表示されます。
入力パイプライン
各 input
パイプラインは、選択パイプラインとスコアリング パイプラインの両方である必要があります。
選択パイプライン
選択パイプラインは、検索後に変更を実行せずにコレクションからドキュメントのセットを検索します。 $scoreFusion
は異なる入力パイプライン間でドキュメントを比較します。このため、すべての入力パイプラインが同じ変更されていないドキュメントを出力する必要があります。
選択パイプラインには、次のステージのみを含める必要があります。
スコアリング パイプライン
スコアリングパイプラインラインは、ドキュメントのスコアに基づいてドキュメントを並べ替えたり順序付けしたりします。 $scoreFusion
は、スコア付けされたパイプライン結果の順序を使用して出力スコアに影響を与えます。スコアリング パイプラインは、次のいずれかの条件を満たしている必要があります。
入力パイプライン名
input
のパイプライン名は次の制限を満たす必要があります。
空の文字列ではない
で開始しないでください
$
string のどこにも ASCII null 文字区切り文字
\0
を含めることはできません次を含めることはできません:
.
score詳細
scoreDetails
を true
に設定すると、$scoreFusion
は各ドキュメントに対して scoreDetails
メタデータフィールドを作成します。 scoreDetails
フィールドには最終ランキングに関する情報が含まれています。
注意
scoreDetails
を true
に設定すると、$scoreFusion
は各ドキュメントの scoreDetails
メタデータフィールドを設定します。デフォルトでは 、scoreDetails
メタフィールドは自動的に出力されません。
メタデータフィールドを表示するには、 scoreDetails
$addFields
、 $meta
$project
、または などのステージで$set
式を介して式を明示的に設定する必要があります。
scoreDetails
フィールドには次のサブフィールドが含まれています。
フィールド | 説明 |
---|---|
| このドキュメントのスコアの数値。 |
|
|
| スコアを正規化するために使用される正規化方法。 |
| パイプラインの結果を結合するために使用される 組み合わせメソッド と式。 |
| このドキュメントを出力する入力パイプラインに関する情報が各配列エントリに含まれている配列。 |
details
フィールド内の各配列エントリには、次のサブフィールドが含まれています。
フィールド | 説明 |
---|---|
| このドキュメントを出力する入力パイプラインの名前。 |
| 正規化前のパイプラインからのドキュメントのスコア。 |
| 入力パイプラインの重み。 |
| 任意。入力パイプラインがこのドキュメントに対して |
| 入力パイプラインの |
警告
MongoDB、scoreDetails
の特定の出力形式は保証されません。
例
次のコード ブロックは、$search
、$vectorSearch
、$match
入力パイプラインを使用した $scoreFusion
操作の scoreDetails
フィールドを示しています。
scoreDetails: { value: 7.847857250621068, description: 'the value calculated by combining the scores (either normalized or raw) across input pipelines from which this document is output from:', normalization: 'sigmoid', combination: { method: 'custom expression', expression: "{ string: { $sum: [ { $multiply: [ '$$searchOne', 10 ] }, '$$searchTwo' ] } }" }, details: [ { inputPipelineName: 'searchOne', inputPipelineRawScore: 0.7987099885940552, weight: 1, value: 0.6896984675751023, details: [] }, { inputPipelineName: 'searchTwo', inputPipelineRawScore: 2.9629626274108887, weight: 1, value: 0.950872574870045, details: [] } ] }
explain の結果
MongoDB は、$scoreFusion
操作を既存の集計ステージのセットに変換し、クエリの実行前に出力結果を計算します。 $scoreFusion
操作の説明結果には、$scoreFusion
が最終結果を作成するために使用する基礎となる集計ステージの完全な実行が示されています。
例
この例では、埋め込みとテキスト フィールドを持つコレクションを使用しています。コレクションに search
と vectorSearch
型のインデックスを作成します。
次のインデックス定義は、インデックス フィールドに対して$search
クエリを実行中ために、コレクション内のすべての動的にインデックス可能なフィールドを自動的にインデックス化します。
db.embedded_movies.createSearchIndex( "<INDEX_NAME>", { mappings: { dynamic: true } } )
次のインデックス定義は、そのフィールドに対して クエリを実行中ためのコレクション内の$vectorSearch
を含むフィールドをインデックスします。
db.embedded_movies.createSearchIndex( "<INDEX_NAME>", "vectorSearch", { "fields": [ { "type": "vector", "path": "<FIELD_NAME>", "numDimensions": <NUMBER_OF_DIMENSIONS>, "similarity": "dotProduct" } ] } );
次の集計パイプラインでは、次の入力パイプラインで $scoreFusion
を使用します。
パイプライン | 返されたドキュメントの数 | 説明 |
---|---|---|
| 20 | 埋め込みとして指定されたタームの |
| 20 | 同じタームの全文検索を実行し、結果を 20 ドキュメントに制限します。 |
1 db.embedded_movies.aggregate( [ 2 { 3 $scoreFusion: { 4 input: { 5 pipelines: { 6 searchOne: [ 7 { 8 "$vectorSearch": { 9 "index": "<INDEX_NAME>", 10 "path": "<FIELD_NAME>", 11 "queryVector": <QUERY_EMBEDDINGS>, 12 "numCandidates": <NUMBER_OF_NEAREST_NEIGHBORS_TO_CONSIDER>, 13 "limit": <NUBMER_OF_DOCUMENTS_TO_RETURN> 14 } 15 } 16 ], 17 searchTwo: [ 18 { 19 "$search": { 20 "index": "<INDEX_NAME>", 21 "text": { 22 "query": "<QUERY_TERM>", 23 "path": "<FIELD_NAME>" 24 } 25 } 26 }, 27 ] 28 }, 29 normalization: "sigmoid" 30 }, 31 combination: { 32 method: "expression", 33 expression: { 34 $sum: [ 35 {$multiply: [ "$$searchOne", 10]}, "$$searchTwo" 36 ] 37 } 38 }, 39 "scoreDetails": true 40 } 41 }, 42 { 43 "$project": { 44 _id: 1, 45 title: 1, 46 plot: 1, 47 scoreDetails: {"$meta": "scoreDetails"} 48 } 49 }, 50 { $limit: 20 } 51 ] )
このパイプラインは、次のアクションを実行します。
input
パイプラインを実行します返された結果を組み合わせます
$scoreFusion
パイプラインの上位 20 結果である最初の 20 ドキュメントを出力します