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

为结果中的文档打分

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

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

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

    注意

    如果您部署了搜索节点,请考虑以下情况:

    • 避免按 searchScore 对结果进行排序,因为不同的搜索节点可能会有所不同。

    • 要计算 searchScore,主机会考虑其上存在的所有文档,包括尚未从索引中移除的已删除文档。由于删除在每个主机上独立进行,这可能会导致 searchScore 发生变化,具体取决于查询被路由到哪个主机。

    为支持在搜索节点上按 searchScore 排序时的分页功能,请在 MongoDB Feedback Engine 中投票支持该请求

  • 对于 $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 阶段,将每个返回文档的得分与结果集一起包含在内。文档按从最高分到最低分的顺序返回。很多因素都会影响文档的分数,包括以下因素:

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

  • 搜索术语在文档中出现的频率。

  • Atlas Search 查询使用的操作符分析器的类型。

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

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

如果结果中的多份文档具有相同得分,则结果中各文档的排序是不确定的。如果您希望 Atlas Search 搜索结果有一个确定的顺序,请在您的 $search 阶段中加入 sort 选项,以便按唯一字段对结果进行排序。您还可以使用 sort 选项,按分数对结果进行升序排序。要了解更多信息,请参阅对 Atlas Search 结果进行排序按分数排序示例

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

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

有关如何在 Atlas 搜索查询中使用其他 score 选项的示例,请参阅以下页面:

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

后退

搜索选项

在此页面上