Docs Menu
Docs Home
/
データベース マニュアル
/ / /

$scoreDocuments(集計)

重要

$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 は、次のフィールドがあります。

フィールド
タイプ
説明

input

オブジェクト

$scoreFusion が結合する入力を定義します。

input.pipelines

オブジェクト

input.pipelinesそのパイプラインを定義する集計ステージへのパイプライン名とのマップが含まれます。 には少なくとも 1 つのパイプラインが含まれている必要があります。入力パイプラインがスコアを返さない場合は、入力パイプラインに$score を指定する必要があります。すべてのパイプラインは同じコレクションで動作する必要があり、一意の名前が必要です。

入力パイプラインの制限の詳細については、「 入力パイプライン 」と「 入力パイプライン名 」を参照してください。

input.normalization

文字列

結果を結合する前に、スコアを 0 から 1 の範囲に正規化します。値は次のとおりです。

  • none - 正規化しない場合。

  • sigmoid - は$sigmoid 式を適用します。

  • minMaxScaler -$minMaxScaler ウィンドウオペレーターを適用します。

combination

オブジェクト

任意。 inputパイプラインの結果を組み合わせる方法を定義します。

combination.weights

オブジェクト

任意。結果を組み合わせるときに正規化された入力パイプラインスコアに適用する重み。入力パイプラインに対して 1 つのパイプラインに対応します。パイプラインの重みが指定されていない場合、デフォルトの重みは 1 です。各重み値は負でない数(整数または小数)である必要があります。重みは 0 になります。

combination.method

文字列

任意。スコアを結合する方法を指定します。値は次のとおりです。

  • avg - 入力スコアの平均を計算します。

  • expression - : combination.expressionフィールドで指定したカスタム集計式を適用します。

省略した場合、デフォルトは avg になります。

combination.expression

算術式

任意。入力スコアを組み合わせるロジックを指定します。これは、combination.methodexpression に設定されている場合に使用されるカスタム式です。式内では、入力パイプラインの名前を使用して、ドキュメントの対応する入力スコアを表します。

combination.weights と排他関係にあります。

scoreDetails

ブール値

任意。出力ドキュメントのメタデータに各入力パイプラインからの詳細なスコアリング情報を含めるかどうかを指定します。省略した場合、デフォルトはfalse になります。

$scoreFusion は 1 つのコレクションでのみ使用できます。この集計ステージは、データベーススコープでは使用できません。

$scoreFusion は、最終出力の複数の入力パイプラインにわたる結果の重複を排除します。一意の各入力ドキュメントは、ドキュメントが入力パイプライン出力に表示される回数に関係なく、$scoreFusion 出力に最大 1 回表示されます。

inputパイプラインは、選択パイプラインとスコアリング パイプラインの両方である必要があります。

選択パイプラインは、検索後に変更を実行せずにコレクションからドキュメントのセットを検索します。 $scoreFusion は異なる入力パイプライン間でドキュメントを比較します。このため、すべての入力パイプラインが同じ変更されていないドキュメントを出力する必要があります。

選択パイプラインには、次のステージのみを含める必要があります。

タイプ
ステージ

検索ステージ

  • $match(レガシーテキスト検索$match を持つ $geoNearを含む)

  • $search

  • $vectorSearch

    注意

    選択パイプラインで $geoNear を使用する場合、includeLogs または distanceField は指定できません。これらのフィールドはドキュメントを変更するためです。

順序付けステージ

ページネーション ステージ

スコアリングパイプラインラインは、ドキュメントのスコアに基づいてドキュメントを並べ替えたり順序付けしたりします。 $scoreFusion は、スコア付けされたパイプライン結果の順序を使用して出力スコアに影響を与えます。スコアリング パイプラインは、次のいずれかの条件を満たしている必要があります。

  • 次の順序付けられたステージのいずれかから始まります。

  • $score前述のパイプラインが本質的にスコアを返さない場合は、明示的な ステージを含めます。

input のパイプライン名は次の制限を満たす必要があります。

  • 空の文字列ではない

  • で開始しないでください $

  • string のどこにも ASCII null 文字区切り文字 \0 を含めることはできません

  • 次を含めることはできません: .

scoreDetailstrue に設定すると、$scoreFusion は各ドキュメントに対して scoreDetailsメタデータフィールドを作成します。 scoreDetailsフィールドには最終ランキングに関する情報が含まれています。

注意

scoreDetailstrue に設定すると、$scoreFusion は各ドキュメントの scoreDetailsメタデータフィールドを設定します。デフォルトでは 、scoreDetails メタフィールドは自動的に出力されません。

メタデータフィールドを表示するには、 scoreDetails$addFields$meta$project、または などのステージで$set 式を介して式を明示的に設定する必要があります。

scoreDetailsフィールドには次のサブフィールドが含まれています。

フィールド
説明

value

このドキュメントのスコアの数値。

description

$scoreFusion が最終スコアを計算した方法の説明。

normalization

スコアを正規化するために使用される正規化方法。

combination

パイプラインの結果を結合するために使用される 組み合わせメソッド と式。

details

このドキュメントを出力する入力パイプラインに関する情報が各配列エントリに含まれている配列。

detailsフィールド内の各配列エントリには、次のサブフィールドが含まれています。

フィールド
説明

inputPipelineName

このドキュメントを出力する入力パイプラインの名前。

inputPipelineRawScore

正規化前のパイプラインからのドキュメントのスコア。

weight

入力パイプラインの重み。

value

任意。入力パイプラインがこのドキュメントに対して { $meta: 'score' } を出力する場合、value には { $meta: 'score' } が含まれます。

details

入力パイプラインの scoreDetailsフィールド。入力パイプラインがscoreDetailsフィールドを出力しない場合、このフィールドは空の配列になります。

警告

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: []
}
]
}

MongoDB は、$scoreFusion 操作を既存の集計ステージのセットに変換し、クエリの実行前に出力結果を計算します。 $scoreFusion操作の説明結果には、$scoreFusion が最終結果を作成するために使用する基礎となる集計ステージの完全な実行が示されています。

この例では、埋め込みとテキスト フィールドを持つコレクションを使用しています。コレクションに searchvectorSearch 型のインデックスを作成します。

次のインデックス定義は、インデックス フィールドに対して$search クエリを実行中ために、コレクション内のすべての動的にインデックス可能なフィールドを自動的にインデックス化します。

検索インデックス
db.embedded_movies.createSearchIndex(
"<INDEX_NAME>",
{
mappings: { dynamic: true }
}
)

次のインデックス定義は、そのフィールドに対して クエリを実行中ためのコレクション内の$vectorSearch を含むフィールドをインデックスします。

vectorSearch インデックス
db.embedded_movies.createSearchIndex(
"<INDEX_NAME>",
"vectorSearch",
{
"fields": [
{
"type": "vector",
"path": "<FIELD_NAME>",
"numDimensions": <NUMBER_OF_DIMENSIONS>,
"similarity": "dotProduct"
}
]
}
);

次の集計パイプラインでは、次の入力パイプラインで $scoreFusion を使用します。

パイプライン
返されたドキュメントの数
説明

searchOne

20

埋め込みとして指定されたタームの vector タイプとしてインデックス付けされたフィールドでベクトル検索を実行します。クエリは最大 500 の最近傍を考慮しますが、結果は 20 ドキュメントに制限されます。

searchTwo

20

同じタームの全文検索を実行し、結果を 20 ドキュメントに制限します。

1db.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 ドキュメントを出力します

戻る

$score

項目一覧