重要
$scoreFusion 仅适用于使用MongoDB 8.3+ 的部署。
定义
语法
该阶段采用以下语法:
{ $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 使用评分管道结果的顺序来影响输出分数。评分管道必须满足以下标准之一:
从以下有序阶段之一开始:
$match使用传统文本搜索
输入管道名称
input 中的管道名称必须符合以下限制:
不得为空字符串
不得以
$不得在字符串中的任何位置包含 ASCII 空字符分隔符
\0不得包含
.
分数详情
如果将 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 查询。
vectorSearch 索引
db.embedded_movies.createSearchIndex( "<INDEX_NAME>", "vectorSearch", { "fields": [ { "type": "vector", "path": "<FIELD_NAME>", "numDimensions": <NUMBER_OF_DIMENSIONS>, "similarity": "dotProduct" } ] });以下聚合管道将 $scoreFusion 与以下输入管道结合使用:
管道 | 返回的文档数量 | 说明 |
|---|---|---|
| 20 | 在索引为 |
| 20 | 对同一术语运行全文搜索,并将结果限制为 20 个文档。 |
db.embedded_movies.aggregate( [ { $scoreFusion: { input: { pipelines: { searchOne: [ { "$vectorSearch": { "index": "<INDEX_NAME>", "path": "<FIELD_NAME>", "queryVector": <QUERY_EMBEDDINGS>, "numCandidates": <NUMBER_OF_NEAREST_NEIGHBORS_TO_CONSIDER>, "limit": <NUBMER_OF_DOCUMENTS_TO_RETURN> } } ], searchTwo: [ { "$search": { "index": "<INDEX_NAME>", "text": { "query": "<QUERY_TERM>", "path": "<FIELD_NAME>" } } }, ] }, normalization: "sigmoid" }, combination: { method: "expression", expression: { $sum: [ {$multiply: [ "$$searchOne", 10]}, "$$searchTwo" ] } }, "scoreDetails": true } }, { "$project": { _id: 1, title: 1, plot: 1, scoreDetails: {"$meta": "scoreDetails"} } }, { $limit: 20 }] )此管道执行以下操作:
执行
input管道合并返回的结果
输出前 20 个文档,即
$scoreFusion管道中排名前 20 的结果