重要
$scoreFusion
仅适用于使用MongoDB 8.2+ 的部署。
定义
语法
该阶段采用以下语法:
{ $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
采用以下字段:
字段 | 类型 | 说明 |
---|---|---|
| 对象 | 定义 |
| 对象 | 包含管道名称到定义该管道的聚合阶段的映射。 |
| 字符串 | 在合并结果之前,将分数归一化到
|
| 对象 | 可选。定义如何合并 |
| 对象 | 可选。组合结果时应用归一化输入管道分数的权重。对应于输入管道,每个管道一个。如果任何管道的权重未指定,则默认重为 |
| 字符串 | 可选。指定组合分数的方法。值可以是:
如果省略,则默认值为 |
| 算术表达式 | 可选。指定组合输入分数的逻辑。这是当 与 |
| 布尔 | 可选。指定是否在输出文档的元数据中包含来自每个输入管道的详细评分信息。如果省略,默认为 |
行为
集合
您只能将 $scoreFusion
与单个集合一起使用。您不能在数据库范围内使用此聚合阶段。
De-Duplication
$scoreFusion
对最终输出中多个输入管道的结果去重。每个唯一的输入文档在 $scoreFusion
输出中最多出现一次,无论该文档在输入管道输出中出现多少次。
输入管道
每个 input
管道必须既是选择管道又是评分管道。
选择管道
选择管道从集合中检索一设立文档,并且在检索后不执行任何修改。 $scoreFusion
比较不同输入管道中的文档,这要求所有输入管道输出相同的未经修改的文档。
选择管道必须仅包含以下阶段:
评分管道
评分管道根据文档的分数对文档进行排序。 $scoreFusion
使用评分管道结果的顺序来影响输出分数。评分管道必须满足以下标准之一:
输入管道名称
input
中的管道名称必须符合以下限制:
不得为空字符串
不得以
$
不得在字符串中的任何位置包含 ASCII 空字符分隔符
\0
不得包含
.
scoreDetails
如果将 scoreDetails
设立为 true
,$scoreFusion
则会为每个文档创建一个 scoreDetails
元元数据字段。 scoreDetails
字段包含有关最终排名的信息。
注意
当您将 scoreDetails
设立为 true
时,$scoreFusion
会为每个文档设置 scoreDetails
元元数据字段。默认下,它不会自动输出 scoreDetails
元字段。
要查看 scoreDetails
元数据字段,您必须在 $project
、$addFields
或 $set
等阶段通过 $meta
表达式进行显式设立。
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: [] } ] }
解释结果
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
管道合并返回的结果
输出前 20 个文档,即
$scoreFusion
管道中排名前 20 的结果