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
的字段:
1 db.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 ])
1 db.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 ])
要了解更多信息,请参阅返回搜索分数详情。
1 db.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 还支持以下选项:
修改分配给某些文档的分数。
通过使用 score details 选项返回分数的详细分解。
规范化搜索分数。
Considerations
如果结果中的多份文档具有相同得分,则结果中各文档的排序是不确定的。如果您希望 Atlas Search 搜索结果有一个确定的顺序,请在您的 $search
阶段中加入 sort 选项,以便按唯一字段对结果进行排序。您还可以使用 sort 选项,按分数对结果进行升序排序。要了解更多信息,请参阅对 Atlas Search 结果进行排序和按分数排序示例。
在独立的搜索节点上,每个节点为文档分配不同的内部 Lucene ID,用于在分数相同时进行排序。在对结果进行排序和分页时,处理查询的节点上的mongot
进程可能会包含来自其他节点的文档,如果其他节点的内部ID的分页顺序大于标记。为防止这种情况,请在 $match
后使用 $search
按文档的 _id
排除文档。
在查询数组值时,无论数组中有多少个值与查询匹配,Atlas Search 都会分配相同的评分。