为结果中的文档打分
Atlas Search或Atlas Vector Search查询返回的每个文档都会根据相关性分配一个分数,并且结果设立包含的文档会按从最高分到最低分的顺序返回。
使用
要在搜索结果中包含每个文档的分数,请使用聚合管道中的 $project
阶段。
对于
$search
阶段,score
字段采用 $meta 表达式,这需要searchScore
值。您还可以为scoreDetails
字段$meta表达式指定searchScoreDetails
值,以获取分数的详细分类。注意
如果部署了搜索节点,请考虑以下事项:
避免按
searchScore
对结果进行排序,因为它可能因搜索节点而异。为了计算
searchScore
,托管会考虑其上存在的所有文档,包括尚未从索引中删除的已删除文档。由于删除操作是在每个托管上独立进行的,因此这可能会导致searchScore
发生变化,具体取决于查询路由到哪个托管。
要在搜索节点上按
searchScore
排序时支持分页,请在MongoDB反馈引擎中对此请求投赞成票。对于
$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还支持以下选项:
Considerations
如果结果中的多个文档具有相同的分数,则结果中文档的顺序是不确定的。如果您希望Atlas Search结果有确定的顺序,请在 $search
阶段包含排序选项,以按唯一字段对结果进行排序。您还可以使用排序选项按分数返回对结果进行升序排序。要学习;了解更多信息,请参阅对Atlas Search结果进行排序和按分数排序示例。
在 单独的搜索节点 上,每个节点为文档分配不同的内部Lucene ID,用于在分数相同时进行排序。对结果进行排序和 分页 时,如果其他节点的内部mongot
ID 的分页顺序大于令牌,则处理查询的节点上的$match
进程可能会包含来自其他节点的文档。为防止这种情况,请在 之后使用 ,按$search
排除文档。_id
查询大量值时,无论大量中有多少个值与查询匹配, Atlas Search都会分配相同的分数。