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

为结果中的文档打分

Atlas Search 查询返回的每份文档都会根据相关性进行评分,结果集所包含的文档按分数高低顺序返回。

很多因素都会影响文档的分数,包括:

  • 搜索词在文档中的位置,

  • 搜索词在文档中出现的频率、

  • 查询使用的 操作符的类型,

  • 查询使用的分析器类型。

注意

当您查询数组中的值时,Atlas Search 不会根据与查询匹配的数组内的值数量更改匹配结果的分数。无论数组内有多少个匹配项,分数都将与单个匹配项相同。

分配给返回文档的分数是文档元数据的一部分。通过在聚合管道中使用 $project 阶段,可以将每个返回文档的分数与结果集一起包含在内。

$search 阶段之后,在 $project 阶段,score 字段采用 $meta 表达式,此表达式需要 searchScore 值。您也可以为 scoreDetails 字段 $meta 表达式指定 searchScoreDetails 值,以了解分数明细。

$vectorSearch 阶段之后,在 $project 阶段,score 字段采用了 $meta 表达式,需要 vectorSearchScore 值返回向量搜索结果中每个文档的分数。

例子

下面的查询使用 $project 阶段在返回的文档中添加名为 score 的字段:

1db.movies.aggregate([
2 {
3 "$search": {
4 "text": {
5 <operator-specification>
6 }
7 }
8 },
9 {
10 "$project": {
11 "<field-to-include>": 1,
12 "<field-to-exclude>": 0,
13 "score": { "$meta": "searchScore" }
14 }
15 }
16])

要了解更多信息,请参阅修改规范化搜索分数。

1db.movies.aggregate([
2 {
3 "$search": {
4 "text": {
5 <operator-specification>
6 },
7 "scoreDetails": true
8 }
9 },
10 {
11 "$project": {
12 "<field-to-include>": 1,
13 "<field-to-exclude>": 0,
14 "scoreDetails": { "$meta": "searchScoreDetails" }
15 }
16 }
17])

要了解更多信息,请参阅返回搜索分数详情。

1db.movies.aggregate([
2 {
3 "$vectorSearch": {
4 <query-syntax>
5 }
6 },
7 {
8 "$project": {
9 "<field-to-include>": 1,
10 "<field-to-exclude>": 0,
11 "score": { "$meta": "vectorSearchScore" }
12 }
13 }
14])

要了解详细信息,请参阅 Atlas Vector Search 分数

$project 阶段之后,不需要加入降序 $sort,因为 Atlas Search 会从最高得分到最低得分返回文档。但是,如果结果中的多份文档具有相同得分,则文档顺序是不确定的。如果希望结果有明确的排序,建议您在 $search阶段加入排序选项,以便按唯一字段对结果进行排序。如果未指定唯一字段,Atlas Search 默认会在结果分数相同时对结果进行任意排序。您还可以使用排序选项,按分数对结果进行升序排序。要了解更多信息,请参阅对 Atlas Search 结果进行排序按分数排序示例。

注意

单独的搜索节点上,每个节点都有自己的文档副本,该副本具有不同的内部 ID,当多个文档具有相同的分数时,Lucene 会使用该 ID 对结果进行排序。如果未处理查询的节点上文档的内部 ID 的分页顺序高于分页标记,则如果对结果进行排序和分页,处理查询的节点上的 mongot 可能会将其包含在结果中。为避免出现这种情况,请在 $search 后使用 $match,通过 _id 排除文档。

有关 Lucene 评分算法的更多信息,请参阅 Lucene 文档

后退

3. 构造查询路径