Docs 菜单
Docs 主页
/
Atlas
/ /

如何自定义结果中文档的评分

您可以自定义结果中各个文档的评分。通过调整分数的计算方式,您可以确保最相关的文档在搜索结果中排名更高。如要了解更多关于自定义评分的不同方法,请参阅对结果中的文档进行评分。本页演示了如何修改结果中文档的得分,以提升或隐藏结果,以及如何在聚合管道的后续阶段将$search 查询评分归一化,范围从 01

Atlas Search查询返回的每个文档都会根据其相关性分配一个分数。结果集中包含的文档设立分数从最高到最低的顺序返回。要学习;了解更多信息,请参阅对结果中的文档进行评分。

您可以使用以下选项与所有操作符修改默认评分行为。有关详细信息和示例,请单击以下任一选项:

本节演示了如何为搜索字段添加权重,以提升或隐藏结果或结果类别中的文档。具体来说,它演示了如何将一个或多个值分配给字段,以返回得分较高或较低的结果。

您可以设置一个启用了动态映射的索引,以便为集合中的所有字段建立索引,或者在您要查询的字段上使用静态映射,并对结果进行排序。如需了解有关创建 Atlas Search 索引的更多信息,请参阅创建 Atlas Search 索引

这些示例查询演示了如何在结果中提升或隐藏文档。它们使用复合操作符将两个或多个操作符组合成一个查询。


➤ 使用选择语言下拉菜单设立要使用的客户端,请尝试本节中的示例。


您可以在聚合管道的后续阶段将$search查询分数标准化为01的范围。 您可以在$search阶段之后按以下顺序使用以下阶段来标准化分数:

  • $addFields

    {
    "$addFields": {
    "score": {
    "$meta": "searchScore"
    }
    }
    }
  • $setWindowFields

    {
    "$setWindowFields": {
    "output": {
    "maxScore": {
    "$max": "$score"
    }
    }
    }
    }
  • $addFields

    {
    "$addFields": {
    "normalizedScore": {
    "$divide": [
    "$score", "$maxScore"
    ]
    }
    }
    }
1db.movies.aggregate([{
2 "$search": {
3 "text": {
4 "query": "Helsinki",
5 "path": "plot"
6 }
7 }
8 },
9 {
10 "$limit": 5
11 },
12 {
13 "$project": {
14 "_id": 0,
15 "title": 1,
16 "score": 1,
17 "maxScore": 1,
18 "normalizedScore": 1
19 }
20 },
21 {
22 "$addFields": {
23 "score": {
24 "$meta": "searchScore"
25 }
26 }
27 },
28 {
29 "$setWindowFields": {
30 "output": {
31 "maxScore": {
32 "$max": "$score"
33 }
34 }
35 }
36 },
37 {
38 "$addFields": {
39 "normalizedScore": {
40 "$divide": [
41 "$score", "$maxScore"
42 ]
43 }
44 }
45}])
1[
2 {
3 title: 'Drifting Clouds',
4 score: 4.5660295486450195,
5 maxScore: 4.5660295486450195,
6 normalizedScore: 1
7 },
8 {
9 title: 'Sairaan kaunis maailma',
10 score: 4.041563034057617,
11 maxScore: 4.5660295486450195,
12 normalizedScore: 0.8851372929150143
13 },
14 {
15 title: 'Bad Luck Love',
16 score: 3.6251673698425293,
17 maxScore: 4.5660295486450195,
18 normalizedScore: 0.79394303764817
19 },
20 {
21 title: 'Bad Luck Love',
22 score: 3.6251673698425293,
23 maxScore: 4.5660295486450195,
24 normalizedScore: 0.79394303764817
25 },
26 {
27 title: 'Forbidden Fruit',
28 score: 3.6251673698425293,
29 maxScore: 4.5660295486450195,
30 normalizedScore: 0.79394303764817
31 }
32]
1db.movies.aggregate([{
2 "$search": {
3 "text": {
4 "path": "title",
5 "query": "men",
6 "score": {
7 "function":{
8 "multiply":[
9 {
10 "path": {
11 "value": "imdb.rating",
12 "undefined": 2
13 }
14 },
15 {
16 "score": "relevance"
17 }
18 ]
19 }
20 }
21 }
22 }
23 },
24 {
25 "$limit": 5
26 },
27 {
28 "$addFields": {
29 "score": {
30 "$meta": "searchScore"
31 }
32 }
33 },
34 {
35 "$setWindowFields": {
36 "output": {
37 "maxScore": {
38 "$max": "$score"
39 }
40 }
41 }
42 },
43 {
44 "$addFields": {
45 "normalizedScore": {
46 "$divide": [
47 "$score", "$maxScore"
48 ]
49 }
50 }
51 },
52 {
53 "$project": {
54 "_id": 0,
55 "title": 1,
56 "score": 1,
57 "maxScore": 1,
58 "normalizedScore": 1
59 }
60}])
1[
2 {
3 title: 'Men...',
4 score: 23.431293487548828,
5 maxScore: 23.431293487548828,
6 normalizedScore: 1
7 },
8 {
9 title: '12 Angry Men',
10 score: 22.080968856811523,
11 maxScore: 23.431293487548828,
12 normalizedScore: 0.9423708882544255
13 },
14 {
15 title: 'X-Men',
16 score: 21.34803581237793,
17 maxScore: 23.431293487548828,
18 normalizedScore: 0.911090795039637
19 },
20 {
21 title: 'X-Men',
22 score: 21.34803581237793,
23 maxScore: 23.431293487548828,
24 normalizedScore: 0.911090795039637
25 },
26 {
27 title: 'Matchstick Men',
28 score: 21.05954933166504,
29 maxScore: 23.431293487548828,
30 normalizedScore: 0.8987787781692841
31 }
32]
1db.movies.aggregate([{
2 "$search": {
3 "text": {
4 "path": "title",
5 "query": "shop",
6 "score": {
7 "function":{
8 "gauss": {
9 "path": {
10 "value": "imdb.rating",
11 "undefined": 4.6
12 },
13 "origin": 9.5,
14 "scale": 5,
15 "offset": 0,
16 "decay": 0.5
17 }
18 }
19 }
20 }
21 }
22 },
23 {
24 "$limit": 5
25 },
26 {
27 "$addFields": {
28 "score": {
29 "$meta": "searchScore"
30 }
31 }
32 },
33 {
34 "$setWindowFields": {
35 "output": {
36 "maxScore": {
37 "$max": "$score"
38 }
39 }
40 }
41 },
42 {
43 "$addFields": {
44 "normalizedScore": {
45 "$divide": [
46 "$score", "$maxScore"
47 ]
48 }
49 }
50 },
51 {
52 "$project": {
53 "_id": 0,
54 "title": 1,
55 "score": 1,
56 "maxScore": 1,
57 "normalizedScore": 1
58 }
59}])
1[
2 {
3 title: 'The Shop Around the Corner',
4 score: 0.9471074342727661,
5 maxScore: 0.9471074342727661,
6 normalizedScore: 1
7 },
8 {
9 title: 'Exit Through the Gift Shop',
10 score: 0.9471074342727661,
11 maxScore: 0.9471074342727661,
12 normalizedScore: 1
13 },
14 {
15 title: 'The Shop on Main Street',
16 score: 0.9395227432250977,
17 maxScore: 0.9471074342727661,
18 normalizedScore: 0.9919917310611205
19 },
20 {
21 title: 'Chop Shop',
22 score: 0.8849083781242371,
23 maxScore: 0.9471074342727661,
24 normalizedScore: 0.9343273488331464
25 },
26 {
27 title: 'Little Shop of Horrors',
28 score: 0.8290896415710449,
29 maxScore: 0.9471074342727661,
30 normalizedScore: 0.8753913353110349
31 }
32]
1db.movies.aggregate([{
2 "$search": {
3 "text": {
4 "path": "title",
5 "query": "men",
6 "score": {
7 "function":{
8 "path": {
9 "value": "imdb.rating",
10 "undefined": 4.6
11 }
12 }
13 }
14 }
15 }
16 },
17 {
18 "$limit": 5
19 },
20 {
21 "$addFields": {
22 "score": {
23 "$meta": "searchScore"
24 }
25 }
26 },
27 {
28 "$setWindowFields": {
29 "output": {
30 "maxScore": {
31 "$max": "$score"
32 }
33 }
34 }
35 },
36 {
37 "$addFields": {
38 "normalizedScore": {
39 "$divide": [
40 "$score", "$maxScore"
41 ]
42 }
43 }
44 },
45 {
46 "$project": {
47 "_id": 0,
48 "title": 1,
49 "score": 1,
50 "maxScore": 1,
51 "normalizedScore": 1
52 }
53}])
1[
2 {
3 title: '12 Angry Men',
4 score: 8.899999618530273,
5 maxScore: 8.899999618530273,
6 normalizedScore: 1
7 },
8 {
9 title: 'The Men Who Built America',
10 score: 8.600000381469727,
11 maxScore: 8.899999618530273,
12 normalizedScore: 0.9662922191102197
13 },
14 {
15 title: 'No Country for Old Men',
16 score: 8.100000381469727,
17 maxScore: 8.899999618530273,
18 normalizedScore: 0.9101124414213563
19 },
20 {
21 title: 'X-Men: Days of Future Past',
22 score: 8.100000381469727,
23 maxScore: 8.899999618530273,
24 normalizedScore: 0.9101124414213563
25 },
26 {
27 title: 'The Best of Men',
28 score: 8.100000381469727,
29 maxScore: 8.899999618530273,
30 normalizedScore: 0.9101124414213563
31 }
32]
1db.movies.aggregate([{
2 "$search": {
3 "text": {
4 "path": "title",
5 "query": "men",
6 "score": {
7 "function": {
8 "log": {
9 "path": {
10 "value": "imdb.rating",
11 "undefined": 10
12 }
13 }
14 }
15 }
16 }
17 }
18 },
19 {
20 "$limit": 5
21 },
22 {
23 "$addFields": {
24 "score": {
25 "$meta": "searchScore"
26 }
27 }
28 },
29 {
30 "$setWindowFields": {
31 "output": {
32 "maxScore": {
33 "$max": "$score"
34 }
35 }
36 }
37 },
38 {
39 "$addFields": {
40 "normalizedScore": {
41 "$divide": [
42 "$score", "$maxScore"
43 ]
44 }
45 }
46 },
47 {
48 "$project": {
49 "_id": 0,
50 "title": 1,
51 "score": 1,
52 "maxScore": 1,
53 "normalizedScore": 1
54 }
55 }
56])
1[
2 {
3 title: '12 Angry Men',
4 score: 0.9493899941444397,
5 maxScore: 0.9493899941444397,
6 normalizedScore: 1
7 },
8 {
9 title: 'The Men Who Built America',
10 score: 0.9344984292984009,
11 maxScore: 0.9493899941444397,
12 normalizedScore: 0.9843145968064908
13 },
14 {
15 title: 'No Country for Old Men',
16 score: 0.9084849953651428,
17 maxScore: 0.9493899941444397,
18 normalizedScore: 0.9569144408182233
19 },
20 {
21 title: 'X-Men: Days of Future Past',
22 score: 0.9084849953651428,
23 maxScore: 0.9493899941444397,
24 normalizedScore: 0.9569144408182233
25 },
26 {
27 title: 'The Best of Men',
28 score: 0.9084849953651428,
29 maxScore: 0.9493899941444397,
30 normalizedScore: 0.9569144408182233
31 }
32]

Atlas Search 结果包含以下分数:

  • 来自 $addFields 阶段的 score 字段中 $search 查询的修改分数。

  • $setWindowFields阶段分配给maxScore字段中结果中的文档的最高分数。

  • $addFields阶段的normalizedScore字段中的归一化分数,计算方法是使用$divide 将$score中的修改分数除以$maxScore中的最大分数。

要了解有关使用 Atlas Search 进行复合查询的更多信息,请参阅 MongoDB University 上的 MongoDB 入门课程第 9 单元。这个 1.5 小时的单元包括 Atlas Search 的概述以及有关创建 Atlas Search 索引、使用复合操作符运行 $search 查询以及使用分面对结果进行分组的课程。

后退

提高准确性

在此页面上