为结果中的文档打分
Atlas Search 查询返回的每份文档都会根据相关性进行评分,结果集所包含的文档按分数高低顺序返回。
很多因素都会影响文档的分数,包括:
注意
当您查询数组中的值时,Atlas Search 不会根据与查询匹配的数组内的值数量更改匹配结果的分数。无论数组内有多少个匹配项,分数都将与单个匹配项相同。
分配给返回文档的分数是文档元数据的一部分。通过在聚合管道中使用 $project
阶段,可以将每个返回文档的分数与结果集一起包含在内。
在$search
阶段之后的$project
阶段, score
字段采用$meta表达式,该表达式需要searchScore
值。您还可以为scoreDetails
字段$meta表达式指定searchScoreDetails
值,以获取分数的详细分类。
在$vectorSearch
阶段之后的$project
阶段, score
字段采用$meta表达式,这需要vectorSearchScore
值才能返回向量搜索结果中每个文档的分数。
例子
下面的查询使用 $project
阶段在返回的文档中添加名为 score
的字段:
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
阶段之后,您不需要包含降序 ,因为$sort
Atlas Search 会按从最高分到最低分的顺序返回文档。但是,如果结果中的多个文档具有相同分数,则结果中文档的顺序是不确定的。如果希望结果有明确的顺序,我们建议您在 $search
阶段包含 排序 选项,以按唯一字段对结果进行排序。如果不指定唯一字段,Atlas Search 默认会在结果分数相同时对结果进行任意排序。您还可以使用 排序 选项按分数返回对结果进行升序排序。要了解更多信息,请参阅 对 Atlas Search 结果 进行 排序和按分数排序示例。
注意
在 单独的 Search Nodes 上,每个节点都有自己的具有不同内部 ID 的文档副本,当多个文档具有相同分数时,Lucene 使用该副本对结果进行排序。如果未处理查询的节点上文档的内部 ID 的分页顺序大于分页词元,则如果您排序和mongot
分页 ,正在处理查询的节点上的 可能会将其包含在结果中结果。为缓解此问题,请在 之后使用 ,按$match
$search
_id
排除文档。
有关 Lucene 评分算法的更多信息,请参阅 Lucene 文档。