Docs 菜单

为结果中的文档打分

Atlas Search或Atlas Vector Search查询返回的每个文档都会根据相关性分配一个分数,并且结果设立包含的文档会按从最高分到最低分的顺序返回。

要在搜索结果中包含每个文档的分数,请使用聚合管道中的 $project 阶段。

  • 对于 $search 阶段,score字段采用 $meta 表达式,这需要 searchScore 值。您还可以为 scoreDetails字段$meta表达式指定 searchScoreDetails 值,以获取分数的详细分类。

    注意

    如果部署了搜索节点,请考虑以下事项:

    • 避免按 searchScore 对结果进行排序,因为它可能因搜索节点而异。

    • 为了计算 searchScore,托管会考虑其上存在的所有文档,包括尚未从索引中删除的已删除文档。由于删除操作是在每个托管上独立进行的,因此这可能会导致 searchScore 发生变化,具体取决于查询路由到哪个托管。

    要在搜索节点上按 searchScore 排序时支持分页,请在MongoDB反馈引擎中对此请求投赞成票。

  • 对于$vectorSearch阶段,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 阶段来包含每个返回文档的分数以及结果设立。文档从最高分数返回到最低分数。很多因素都会影响文档的分数,其中包括:

要学习;了解有关Lucene评分算法的更多信息,请参阅Lucene文档。

除了默认的评分行为外, Atlas Search还支持以下选项:

如果结果中的多个文档具有相同的分数,则结果中文档的顺序是不确定的。如果您希望Atlas Search结果有确定的顺序,请在 $search阶段包含排序选项,以按唯一字段对结果进行排序。您还可以使用排序选项按分数返回对结果进行升序排序。要学习;了解更多信息,请参阅对Atlas Search结果进行排序和按分数排序示例。

单独的搜索节点 上,每个节点为文档分配不同的内部Lucene ID,用于在分数相同时进行排序。对结果进行排序和 分页 时,如果其他节点的内部mongot ID 的分页顺序大于令牌,则处理查询的节点上的$match 进程可能会包含来自其他节点的文档。为防止这种情况,请在 之后使用 ,按$search 排除文档。_id

查询大量值时,无论大量中有多少个值与查询匹配, Atlas Search都会分配相同的分数。

有关如何在Atlas Search查询中使用附加 score 选项的示例,请参阅以下页面:

有关如何在某些常见Atlas Search查询中使用 score字段的示例,请参阅以下页面: