Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs 菜单
Docs 主页
/
数据库手册
/ / /

$scoreFusion(聚合)

重要

$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

对象

包含管道名称到定义该管道的聚合阶段的映射。$score input.pipelines必须至少包含一个管道。如果输入管道未返回分数,则必须为输入管道指定 。所有管道必须对同一个集合进行操作,并且必须具有唯一的名称。

有关输入管道限制的更多信息,请参阅输入管道和输入管道名称。

input.normalization

字符串

在合并结果之前,将分数归一化到 01 的范围内。值可以是:

  • none - 不进行规范化。

  • sigmoid -应用$sigmoid 表达式。

  • minMaxScaler —应用$minMaxScaler 窗口运算符。

combination

对象

可选。定义如何合并 input管道结果。

combination.weights

对象

可选。组合结果时应用归一化输入管道分数的权重。对应于输入管道,每个管道一个。如果任何管道的权重未指定,则默认重为 1。每个权重值必须是非负数(整数或小数)。权重可以是 0

combination.method

字符串

可选。指定组合分数的方法。值可以是:

  • avg — 计算输入分数的平均值。

  • expression —应用您在 combination.expression字段中指定的自定义聚合表达式。

如果省略,则默认值为 avg

combination.expression

算术表达式

可选。指定组合输入分数的逻辑。这是当 combination.method设立为 expression 时使用的自定义表达式。在表达式中,使用输入管道的名称来表示文档的相应输入分数。

combination.weights 互斥。

scoreDetails

布尔

可选。指定是否在输出文档的元数据中包含来自每个输入管道的详细评分信息。如果省略,默认为 false

您只能将 $scoreFusion 与单个集合一起使用。您不能在数据库范围内使用此聚合阶段。

$scoreFusion 对最终输出中多个输入管道的结果去重。每个唯一的输入文档在 $scoreFusion 输出中最多出现一次,无论该文档在输入管道输出中出现多少次。

每个 input管道必须既是选择管道又是评分管道。

选择管道从集合中检索一设立文档,并且在检索后不执行任何修改。 $scoreFusion 比较不同输入管道中的文档,这要求所有输入管道输出相同的未经修改的文档。

选择管道必须仅包含以下阶段:

类型
阶段(Stages)

搜索阶段

  • $match,包括带有传统文本搜索的$match$geoNear

  • $search

  • $vectorSearch

    注意

    如果在选择管道中使用 $geoNear,则无法指定 includeLogsdistanceField,因为这些字段会修改文档。

对阶段进行排序

分页阶段

评分管道根据文档的分数对文档进行排序。 $scoreFusion 使用评分管道结果的顺序来影响输出分数。评分管道必须满足以下标准之一:

input 中的管道名称必须符合以下限制:

  • 不得为空字符串

  • 不得以 $

  • 不得在字符串中的任何位置包含 ASCII 空字符分隔符 \0

  • 不得包含 .

如果将 scoreDetails设立为 true$scoreFusion 则会为每个文档创建一个 scoreDetails 元元数据字段。 scoreDetails字段包含有关最终排名的信息。

注意

当您将 scoreDetails设立为 true 时,$scoreFusion 会为每个文档设置 scoreDetails 元元数据字段。默认下,它不会自动输出 scoreDetails 元字段。

要查看 scoreDetails元数据字段,您必须在 $project$addFields$set 等阶段通过 $meta表达式进行显式设立。

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 管道

  • 合并返回的结果

  • 输出前 20 个文档,即 $scoreFusion管道中排名前 20 的结果

后退

$score

在此页面上