Docs 菜单
Docs 主页
/
MongoDB Atlas
/ / / /

修改分数

在此页面上

  • boost
  • 字段
  • 示例
  • constant
  • 示例
  • embedded
  • 字段
  • 示例
  • function
  • 表达式
  • 示例

所有操作符都可以使用以下分数修改选项。有关详细信息和示例,请单击以下任一选项:

boost 选项将结果的基本分数乘以给定的数字或文档中数值字段的值。例如,您可以使用 boost 提高某些匹配文档在结果中的重要性。

注意

boost 选项包含以下字段:

字段
类型
必要性
说明

value

float

可选的

与默认基本分数相乘的数字。值必须是正数。valuepath 是必填项,但无法同时指定。

path

字符串

可选的

数字字段的名称,其值要乘以默认基数分数。pathvalue 是必填项,但无法同时指定。

undefined

float

Optional

用来替换 path 的数值,如果在文档中找不到通过 path 指定的数字字段。如果省略,则默认值为 0。仅当指定 path 时才可以指定此项。

以下示例使用 sample_mflix 数据库中的 movies 集合。如果集群有 示例数据集,则可以创建 Atlas Search default 索引并在集群上运行示例查询。

复合查询示例展示了如何提高一种搜索条件相对于另一种搜索条件的重要性。查询包括一个 $project 阶段,以排除 titlescore 以外的所有字段。

在以下示例中,复合操作符使用文本操作符在 plottitle 字段中搜索术语 Helsinki。对 title 字段的查询使用带有 boost 选项的 score,按照 value 字段的规定,将得分结果乘以 3。

1db.movies.aggregate([
2 {
3 "$search": {
4 "compound": {
5 "should": [{
6 "text": {
7 "query": "Helsinki",
8 "path": "plot"
9 }
10 },
11 {
12 "text": {
13 "query": "Helsinki",
14 "path": "title",
15 "score": { "boost": { "value": 3 } }
16 }
17 }]
18 }
19 }
20 },
21 {
22 "$limit": 5
23 },
24 {
25 "$project": {
26 "_id": 0,
27 "title": 1,
28 "plot": 1,
29 "score": { "$meta": "searchScore" }
30 }
31 }
32])

此查询返回以下结果,在该结果中,对于 title 与查询词匹配的文档,其分数为基值乘以 3

[
{
plot: 'Epic tale about two generations of men in a wealthy Finnish family, spanning from the 1960s all the way through the early 1990s. The father has achieved his position as director of the ...',
title: 'Kites Over Helsinki',
score: 12.2470121383667
},
{
plot: 'Alex is Finlander married to an Italian who works as a taxi driver in Berlin. One night in his taxi come two men with a briefcase full of money. Unluckily for Alex, they are being chased by...',
title: 'Helsinki-Naples All Night Long',
score: 9.56808090209961
},
{
plot: 'The recession hits a couple in Helsinki.',
title: 'Drifting Clouds',
score: 4.5660295486450195
},
{
plot: 'Two teenagers from Helsinki are sent on a mission by their drug dealer.',
title: 'Sairaan kaunis maailma',
score: 4.041563034057617
},
{
plot: 'A murderer tries to leave his criminal past in East Helsinki and make a new life for his family',
title: 'Bad Luck Love',
score: 3.6251673698425293
}
]

在以下示例中,复合操作符使用文本操作符在 plottitle 字段中搜索术语 Helsinki。针对 title 字段的查询使用带有 boost 选项的 score 将分数结果乘以 path 中的数值字段 imdb.rating。如果在指定的 path 中找不到数字字段,则操作符会将文档的分数乘以 3

1db.movies.aggregate([
2 {
3 "$search": {
4 "compound": {
5 "should": [{
6 "text": {
7 "query": "Helsinki",
8 "path": "plot"
9 }
10 },
11 {
12 "text": {
13 "query": "Helsinki",
14 "path": "title",
15 "score": {
16 "boost": {
17 "path": "imdb.rating",
18 "undefined": 3
19 }
20 }
21 }
22 }]
23 }
24 }
25 },
26 {
27 "$limit": 5
28 },
29 {
30 "$project": {
31 "_id": 0,
32 "title": 1,
33 "plot": 1,
34 "score": { "$meta": "searchScore" }
35 }
36 }
37])

此查询返回以下结果,其中 title 字段与查询术语匹配的文档的分数由其基值乘以数字字段 imdb.rating3 的值(如果文档中没有该字段):

[
{
plot: 'Epic tale about two generations of men in a wealthy Finnish family, spanning from the 1960s all the way through the early 1990s. The father has achieved his position as director of the ...',
title: 'Kites Over Helsinki',
score: 24.902257919311523
},
{
plot: 'Alex is Finlander married to an Italian who works as a taxi driver in Berlin. One night in his taxi come two men with a briefcase full of money. Unluckily for Alex, they are being chased by...',
title: 'Helsinki-Naples All Night Long',
score: 20.411907196044922
},
{
plot: 'The recession hits a couple in Helsinki.',
title: 'Drifting Clouds',
score: 4.5660295486450195
},
{
plot: 'Two teenagers from Helsinki are sent on a mission by their drug dealer.',
title: 'Sairaan kaunis maailma',
score: 4.041563034057617
},
{
plot: 'A murderer tries to leave his criminal past in East Helsinki and make a new life for his family',
title: 'Bad Luck Love',
score: 3.6251673698425293
}
]

constant 选项将基数分数替换为指定的数字。

注意

不得同时使用 constantboost 选项。

以下示例使用 sample_mflix.movies 集合上的默认索引以使用复合运算符查询 plottitle 字段。在查询中,文本运算符使用 scoreconstant 选项,将所有得分结果替换为 5,以获得仅与 title 字段的查询匹配的结果。

1db.movies.aggregate([
2 {
3 "$search": {
4 "compound": {
5 "should": [{
6 "text": {
7 "query": "tower",
8 "path": "plot"
9 }
10 },
11 {
12 "text": {
13 "query": "tower",
14 "path": "title",
15 "score": { "constant": { "value": 5 } }
16 }
17 }]
18 }
19 }
20 },
21 {
22 "$limit": 5
23 },
24 {
25 "$project": {
26 "_id": 0,
27 "title": 1,
28 "plot": 1,
29 "score": { "$meta": "searchScore" }
30 }
31 }
32])

上述查询返回以下结果,其中仅与 title 字段的查询匹配的文档的分数将替换为指定的 constant 值:

1[
2 {
3 plot: 'Several months after witnessing a murder, residents of Tower Block 31 find themselves being picked off by a sniper, pitting those lucky enough to be alive into a battle for survival.',
4 title: 'Tower Block',
5 score: 8.15460205078125
6 },
7 {
8 plot: "When a group of hard-working guys find out they've fallen victim to their wealthy employer's Ponzi scheme, they conspire to rob his high-rise residence.",
9 title: 'Tower Heist',
10 score: 5
11 },
12 {
13 plot: 'Toru Kojima and his friend Koji are young student boys with one thing in common - they both love to date older women. Koji is a playboy with several women, young and older, whereas Toru is a romantic with his heart set on on certain lady.',
14 title: 'Tokyo Tower',
15 score: 5
16 },
17 {
18 plot: 'A middle-aged mental patient suffering from a split personality travels to Italy where his two personalities set off all kinds of confusing developments.',
19 title: 'The Leaning Tower',
20 score: 5
21 },
22 {
23 plot: 'A documentary that questions the cost -- and value -- of higher education in the United States.',
24 title: 'Ivory Tower',
25 score: 5
26 }
27]

注意

该选项只能与嵌入式文档运算符一起使用。

embedded 选项允许您配置如何:

  • 聚合多个匹配嵌入式文档的分数。

  • 聚合匹配嵌入式文档的分数后,修改 embeddedDocument 操作符的分数。

注意

Atlas Search embeddedDocuments 类型、 embeddedDocument操作符和 embedded评分选项均处于预览状态。当副本集或单个MongoDB分片上的分片 Atlas Search索引达到2 、100 、000 、000 索引对象时, Atlas Search会将索引转换为过时的可查询状态。如果您希望Atlas Search将来支持超过2 、100 、000 、000 的索引对象,请在MongoDB反馈引擎中为此请求投票。

embedded 选项包含以下字段:

字段
类型
必要性
说明

aggregate

字符串

Optional

配置如何合并匹配嵌入式文档的分数。值必须是以下聚合策略之一:

  • sum - (默认)将所有匹配的嵌入式文档的分数相加。

  • maximum - 选择所有匹配的嵌入式文档中的最高分数。

  • minimum — 选择所有匹配的嵌入式文档中最低分数。

  • mean - 选择所有匹配嵌入式文档的平均(算术平均值)分数。Atlas Search 仅在计算平均值时才包含匹配嵌入式文档的分数。Atlas Search 不会将不满足查询谓词的嵌入式文档计为分数为零的文档。

如果省略,该字段默认值为 sum

outerScore

Optional

指定应用聚合策略后要应用的分数修改。

以下示例将对 sample_analytics.transactions 集合使用名为 default 的索引。该索引为 transactions 数组中的文档配置 embeddedDocuments 类型,并为 transactions.symboltransactions.transaction_code 字段配置 string 类型。

例子

样本索引
{
"mappings": {
"dynamic": true,
"fields": {
"transactions": {
"dynamic": true,
"fields": {
"symbol": {
"type": "string"
},
"transaction_code": {
"type": "string"
}
},
"type": "embeddedDocuments"
}
}
}
}

transactions 字段的示例查询包含一个文档数组,其中的 $limit 阶段将输出限制为 10 个结果,$project 阶段用于执行以下操作:

  • 排除除 account_idtransaction_count 之外的所有字段。

  • 添加名为 score 的字段,该字段应用聚合策略并进一步修改分数。

    注意

    您可以在 embeddedDocument 操作符 operatorscore 选项中使用 function。但是,对于需要使用 path 选项的函数分数表达式,您为表达式指定的 path 数字字段必须位于 embeddedDocument 操作符的 path 内。例如,在以下示例查询中,第 24 行 compound 操作符的 score 选项所指定的字段 transactions.amount 位于第 4 行 embeddedDocument 操作符的路径 transactions 中。

该查询会搜索买入 AMD 的帐户,并将最大的单笔 AMD 买入(按股数计算)乘以该帐户在此期间进行的交易数量的 log1p 值。该操作根据以下内容对帐户进行排名:

  • 单次交易中购买的 AMD 数量

  • 上一周期的交易数

1db.transactions.aggregate({
2 "$search": {
3 "embeddedDocument": {
4 "path": "transactions",
5 "operator": {
6 "compound": {
7 "must": [
8 {
9 "text": {
10 "path": "transactions.symbol",
11 "query": "amd"
12 }
13 },
14 {
15 "text": {
16 "path": "transactions.transaction_code",
17 "query": "buy"
18 }
19 }
20 ],
21 "score": {
22 "function": {
23 "path": {
24 "value": "transactions.amount",
25 "undefined": 1.0
26 }
27 }
28 }
29 }
30 },
31 "score": {
32 "embedded": {
33 "aggregate": "maximum",
34 "outerScore": {
35 "function": {
36 "multiply": [
37 {
38 "log1p": {
39 "path": {
40 "value": "transaction_count"
41 }
42 }
43 },
44 {
45 "score": "relevance"
46 }
47 ]
48 }
49 }
50 }
51 }
52 }
53 }
54},
55{ "$limit": 10 },
56{
57 "$project": {
58 "_id": 0,
59 "account_id": 1,
60 "transaction_count": 1,
61 "score": { $meta: "searchScore" }
62 }
63})

Atlas Search 对帐户进行排名,在上一时期进行过多次交易并在单笔交易中购买了许多 AMD 的帐户排名较高。

1[
2 { account_id: 467651, transaction_count: 99, score: 19982 },
3 { account_id: 271554, transaction_count: 96, score: 19851.822265625 },
4 { account_id: 71148, transaction_count: 99, score: 19840 },
5 { account_id: 408143, transaction_count: 100, score: 19836.76953125 },
6 { account_id: 977774, transaction_count: 98, score: 19822.64453125 },
7 { account_id: 187107, transaction_count: 96, score: 19754.470703125 },
8 { account_id: 492843, transaction_count: 97, score: 19744.998046875 },
9 { account_id: 373169, transaction_count: 93, score: 19553.697265625 },
10 { account_id: 249078, transaction_count: 89, score: 19436.896484375 },
11 { account_id: 77690, transaction_count: 90, score: 19418.017578125 }
12]

function选项允许您使用数值字段更改文档的最终分数。 您可以通过表达式指定用于计算最终分数的数字字段。 如果函数得分的最终结果小于0 ,Atlas Search 会将得分替换为0

注意

您可以在 embeddedDocument 运算符的 operatorscore 选项中使用 function。但是,对于需要 path 选项的函数分数表达式,可为表达式指定为 path 的数值字段必须位于 embeddedDocument 运算符的 path 内。

使用以下带有 function 选项的表达式来更改文档的最终分数:

  • 算术表达式,用于将一系列数字相加或相乘。

  • 常量表达式,支持在函数分数中使用数。

  • 高斯衰减表达式,通过以指定速率相乘来衰减或减少分数。

  • 路径表达式,将索引数字字段值合并到函数分数中。

  • 分数表达式,返回 Atlas Search 分配的相关性分数。

  • 一元表达式,即采用单个参数的表达式。在 Atlas Search 中,您可以计算指定数字的 log10(x) 或 log10(x+1)。

注意

Atlas Search 函数的分数始终是 float 值,对于非常大或非常小的数字,精度可能会丢失。

算术表达式将一系列数字相加或相乘。例如,您可以使用算术表达式,通过数据扩充管道中的数字字段修改相关性排名。它必须包含以下选项之一:

选项
类型
说明

add

表达式大量

添加一系列数字。接受一个表达式大量,其中可以有负值。数组长度必须大于或等于2 。示例:

算术表达式事务语法
"function": {
"add": [
{"path": "rating"},
{"score": "relevance"}
]
}

在前面的示例中,Atlas Search 使用 pathscore 表达式添加以下内容:

  • rating 字段的数值或 0(如果文档中不存在 rating 字段)

  • 相关度分数,这是 Atlas Search 根据相关度分配的分数

multiply

表达式大量

将一系列数字相乘。接受一个表达式大量,其中可以有负值。数组长度必须大于或等于2 。示例:

算术表达式事务语法
"function": {
"multiply": [
{
"path": {
"value": "popularity",
"undefined": 2.5
}
},
{
"score": "relevance"
},
{
"constant": 0.75
}
]
}

在上一个示例中,Atlas Search 使用 pathscoreconstant 表达式来更改文档的最终分数。它将以下内容相乘:

  • 路径表达式的数值,如果文档中不存在 popularity 字段,则为 popularity 字段的数值或 2.5

  • 相关度分数,这是 Atlas Search 根据相关度分配的分数

  • 常数值 0.75

注意

不能将计算结果为 undefined 的算术表达式替换为常量值。

常量表达式允许在函数得分中使用常量。 例如,您可以使用constant通过来自数据扩充管道的数值修改相关性排名。 它必须包含以下选项:

选项
类型
说明

constant

float

表示固定值的数字。 Atlas Search 支持负值。

例子

常量表达式语法
{
"function": {
"constant": -23.78
}
}

高斯衰减表达式允许您根据数值字段值与指定原点的距离,通过相乘来衰减或减少文档的最终分数。 decay的计算公式为:

衰减计算的屏幕截图
点击放大

其中,计算 sigma 是为了确保分数在距离scale处取值decay origin±offset

sigma 计算的屏幕截图
点击放大

例如,您可以使用gauss根据文档新鲜度或影响较高排名的日期调整文档的相关分数。 gauss采用以下选项:

字段
类型
必要性
说明

decay

double

Optional

您想要将分数相乘的比率。 值必须是介于01 (不含)之间的正数。 如果省略,则默认为0.5

对于数值字段值(使用path指定)与origin加减 ( ± ) offset存在一定距离(使用scale指定)的文档,Atlas Search 会使用decay

offset

double

Optional

用于确定距原点距离的数字。 仅对距离大于origin正负 ( ± ) offset的文档执行衰减操作。 如果省略,则默认为0

origin

double

必需

计算距离的原点。

path

必需

要使用其值来乘以基本分数的数字字段的名称。

scale

double

必需

origin正负 ( ± ) offset的距离,在该距离处分数必须相乘。

例子

Gaussian 表达式语法
{
"function": {
"gauss": {
"path": {
"value": "rating",
"undefined": 50
},
"origin": 95,
"scale": 5,
"offset": 5,
"decay": 0.5
}
}
}

假设最大评分为100 。 Atlas Search 使用文档中的rating字段来衰减分数:

  • 保留评分介于90100之间的文档的当前分数。

  • 对于评分低于 的文档,将当前分数乘以0.5 90

  • 对于评分低于85的文档,将当前分数乘以0.25 ,依此类推。

路径表达式将索引数字字段值合并到函数分数中。它可以是 stringobject

如果 string,则该值是要搜索路径表达式的数值字段名称。

例子

路径表达式语法
{
"function": {
"path": "rating"
}
}

Atlas Search 将 rating 字段的数值纳入文档的最终分数中。

如果 object,路径表达式将采用以下选项:

选项
类型
必要性
说明

value

字符串

必需

数值字段的名称。字段可以包含负数值。

undefined

float

Optional

如果文档中缺少使用 value 指定的数值字段,则要使用的值。如果省略,则默认值为 0

例子

路径表达式语法
{
"function": {
"path": {"value": "quantity", "undefined": 2}
}
}

Atlas Search 将 quantity 字段的数值或 2(如果文档中不存在 quantity 字段)的数值纳入文档的最终分数中。

路径表达式不能是 arraypath 中也不能包含正则表达式通配符

分数表达式表示相关性分数,即 Atlas Search 根据查询的相关性为文档分配的分数。它与文档的当前分数相同。它必须包含以下选项:

选项
类型
说明

score

字符串

查询的相关性分数的值。值必须是 relevance

例子

分数表达式语法
{
"function": {
"score": "relevance"
}
}

一元表达式是指采用单个参数的表达式。在 Atlas Search 中,您可以使用一元表达式来计算指定数字的 log10(x) 或 log10(x+1)。例如,您可以使用 log1p 按文档受欢迎程度分数影响相关性分数。它必须包含以下选项之一:

选项
类型
说明

log

计算一个数字以 10 为底的对数。例如:

一元表达式语法
{
"function": {
"log": {
"multiply": [
{"path": "popularity"},
{"constant": 0.5},
{"score": "relevance"}
]
}
}
}

在前面的示例中, Atlas Search 计算算术表达式的 log10 ,该算术表达式使用 multiply 选项来计算 popularity 字段的数值、 0.5 常量值和 Atlas Search 分配的相关性分数的乘积。

如果为 log 选项指定的表达式的计算结果为小于或等于 0,则 log 的计算结果为未定义。例如:

一元表达式语法
{
"function": {
"log": {
"constant": -5.1
}
}
}

在前面的示例中,Atlas Search 将常量表达式的 -5.1 以 10 为底的对数评估为未定义。因此,该文档的最终得分是 0

log1p

1 添加到该数字,然后计算其 log10 。例如:

一元表达式语法
{
"function": {
"log1p": {
"path": {
"value": "rating",
"undefined": 4
}
}
}
}

在前面的示例中,Atlas Search 将 1 添加到表达式中,该表达式使用 path 选项来计算 rating 字段的数值,然后计算结果总和以 10 为底的对数。

以下示例使用 sample_mflix.movies 集合上的默认索引来查询 title 字段。示例查询包括一个 $limit 阶段,用于将输出限制为 5 结果;以及一个 $project 阶段,用于排除除 titlescore 之外的所有字段。

例子

在此示例中,文本操作符用 scorefunction 选项乘以下列值:

  • 路径表达式的数值,即文档中 imdb.rating 字段的值,如果 imdb.rating 字段不在文档中则为 2

  • 相关性分数,或文档的当前分数

db.movies.aggregate([{
"$search": {
"text": {
"path": "title",
"query": "men",
"score": {
"function":{
"multiply":[
{
"path": {
"value": "imdb.rating",
"undefined": 2
}
},
{
"score": "relevance"
}
]
}
}
}
}
},
{
$limit: 5
},
{
$project: {
"_id": 0,
"title": 1,
"score": { "$meta": "searchScore" }
}
}])

此查询返回以下结果,其中分数替换为指定的 function 值:

{ "title" : "Men...", "score" : 23.431293487548828 }
{ "title" : "12 Angry Men", "score" : 22.080968856811523 }
{ "title" : "X-Men", "score" : 21.34803581237793 }
{ "title" : "X-Men", "score" : 21.34803581237793 }
{ "title" : "Matchstick Men", "score" : 21.05954933166504 }

例子

在以下示例中,文本操作符使用带有function选项的score ,将文档的当前分数替换为常量数值3

db.movies.aggregate([
{
"$search": {
"text": {
"path": "title",
"query": "men",
"score": {
"function":{
"constant": 3
}
}
}
}
},
{
$limit: 5
},
{
$project: {
"_id": 0,
"title": 1,
"score": { "$meta": "searchScore" }
}
}
])

此查询返回以下结果,其中分数替换为指定的 function 值:

{ "title" : "Men Without Women", "score" : 3 }
{ "title" : "One Hundred Men and a Girl", "score" : 3 }
{ "title" : "Of Mice and Men", "score" : 3 }
{ "title" : "All the King's Men", "score" : 3 }
{ "title" : "The Men", "score" : 3 }

例子

在以下示例中, 文本 操作符使用带有score function选项的 来衰减结果中文档的相关性分数。

该查询指定,对于imdb.rating字段值或4.6的文档,如果文档中不存在imdb.rating字段,则与 origin 的距离为scale ,即59.5 ,加上或减去offset ,即0 ,Atlas Search 必须将分数与decay相乘,该分数从0.5开始。 此查询包括一个$limit阶段,用于将输出限制为最多10结果;以及一个$project阶段,用于在结果中添加imdb.rating字段。

db.movies.aggregate([
{
"$search": {
"text": {
"path": "title",
"query": "shop",
"score": {
"function":{
"gauss": {
"path": {
"value": "imdb.rating",
"undefined": 4.6
},
"origin": 9.5,
"scale": 5,
"offset": 0,
"decay": 0.5
}
}
}
}
}
},
{
"$limit": 10
},
{
"$project": {
"_id": 0,
"title": 1,
"imdb.rating": 1,
"score": { "$meta": "searchScore" }
}
}
])

此查询将返回以下结果:

[
{ title: 'The Shop Around the Corner', imdb: { rating: 8.1 }, score: 0.9471074342727661 },
{ title: 'Exit Through the Gift Shop', imdb: { rating: 8.1 }, score: 0.9471074342727661 },
{ title: 'The Shop on Main Street', imdb: { rating: 8 }, score: 0.9395227432250977 },
{ imdb: { rating: 7.4 }, title: 'Chop Shop', score: 0.8849083781242371 },
{ title: 'Little Shop of Horrors', imdb: { rating: 6.9 }, score: 0.8290896415710449 },
{ title: 'The Suicide Shop', imdb: { rating: 6.1 }, score: 0.7257778644561768 },
{ imdb: { rating: 5.6 }, title: 'A Woman, a Gun and a Noodle Shop', score: 0.6559237241744995 },
{ title: 'Beauty Shop', imdb: { rating: 5.4 }, score: 0.6274620294570923 }
]

要将上一个查询中使用的高斯表达式的结果与 Atlas Search 结果中返回的相关性分数进行比较,请运行以下查询:

db.movies.aggregate([
{
"$search": {
"text": {
"path": "title",
"query": "shop"
}
}
},
{
"$limit": 10
},
{
"$project": {
"_id": 0,
"title": 1,
"imdb.rating": 1,
"score": { "$meta": "searchScore" }
}
}
])

此查询将返回以下结果:

[
{ title: 'Beauty Shop', imdb: { rating: 5.4 }, score: 4.111973762512207 },
{ imdb: { rating: 7.4 }, title: 'Chop Shop', score: 4.111973762512207 },
{ title: 'The Suicide Shop', imdb: { rating: 6.1 }, score: 3.5363259315490723 },
{ title: 'Little Shop of Horrors', imdb: { rating: 6.9 }, score: 3.1020588874816895 },
{ title: 'The Shop Around the Corner', imdb: { rating: 8.1 }, score: 2.762784481048584 },
{ title: 'The Shop on Main Street', imdb: { rating: 8 }, score: 2.762784481048584 },
{ title: 'Exit Through the Gift Shop', imdb: { rating: 8.1 }, score: 2.762784481048584 },
{ imdb: { rating: 5.6 }, title: 'A Woman, a Gun and a Noodle Shop', score: 2.0802340507507324 }
]

例子

在下面的示例中,text 操作符使用 scorefunction 选项,将查询的相关性得分替换为数字字段 imdb.rating, 如果文档中没有 imdb.rating 字段的话,则替换 4.6 的值。

db.movies.aggregate([{
"$search": {
"text": {
"path": "title",
"query": "men",
"score": {
"function":{
"path": {
"value": "imdb.rating",
"undefined": 4.6
}
}
}
}
}
},
{
$limit: 5
},
{
$project: {
"_id": 0,
"title": 1,
"score": { "$meta": "searchScore" }
}
}])

此查询返回以下结果,其中分数替换为指定的 function 值:

{ "title" : "12 Angry Men", "score" : 8.899999618530273 }
{ "title" : "The Men Who Built America", "score" : 8.600000381469727 }
{ "title" : "No Country for Old Men", "score" : 8.100000381469727 }
{ "title" : "X-Men: Days of Future Past", "score" : 8.100000381469727 }
{ "title" : "The Best of Men", "score" : 8.100000381469727 }

例子

在以下示例中,文本操作符使用 scorefunction选项来返回文档的相关性分数,该分数与当前分数相同)。

db.movies.aggregate([{
"$search": {
"text": {
"path": "title",
"query": "men",
"score": {
"function":{
"score": "relevance"
}
}
}
}
},
{
"$limit": 5
},
{
"$project": {
"_id": 0,
"title": 1,
"score": { "$meta": "searchScore" }
}
}])

此查询返回以下结果,其中分数替换为指定的 function 值:

{ "title" : "Men...", "score" : 3.4457783699035645 }
{ "title" : "The Men", "score" : 2.8848698139190674 }
{ "title" : "Simple Men", "score" : 2.8848698139190674 }
{ "title" : "X-Men", "score" : 2.8848698139190674 }
{ "title" : "Mystery Men", "score" : 2.8848698139190674 }

例子

在以下示例中,text 操作符使用 scorefunction 选项来计算 imdb.rating 字段的对数10;如果文档中不存在 imdb.rating 字段,则计算 10 的对数。

db.movies.aggregate([{
"$search": {
"text": {
"path": "title",
"query": "men",
"score": {
"function": {
"log": {
"path": {
"value": "imdb.rating",
"undefined": 10
}
}
}
}
}
}
},
{
"$limit": 5
},
{
"$project": {
"_id": 0,
"title": 1,
"score": { "$meta": "searchScore" }
}
}])

此查询返回以下结果,其中分数替换为指定的 function 值:

{ "title" : "12 Angry Men", "score" : 0.9493899941444397 }
{ "title" : "The Men Who Built America", "score" : 0.9344984292984009 }
{ "title" : "No Country for Old Men", "score" : 0.9084849953651428 }
{ "title" : "X-Men: Days of Future Past", "score" : 0.9084849953651428 }
{ "title" : "The Best of Men", "score" : 0.9084849953651428
}

后退

4。对文档进行评分