Docs 菜单
Docs 主页
/
MongoDB 阿特拉斯
/ / /

为结果中的文档打分

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

很多因素都会影响文档的分数,包括:

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

  • 搜索词在文档中出现的频率、

  • 查询使用的运算符的类型,

  • 查询使用的分析器类型。

注意

当您查询数组中的值时,Atlas Search 不会根据与查询匹配的数组内的值数量更改匹配结果的分数。无论数组内有多少个匹配项,分数都将与单个匹配项相同。

分配给返回文档的分数是文档元数据的一部分。通过在聚合管道中使用 $project 阶段,可以将每个返回文档的分数与结果集一起包含在内。

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

$vectorSearch阶段之后的$project阶段, 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 阶段之后,您不需要包含降序 ,因为$sort Atlas Search 会按从最高分到最低分的顺序返回文档。但是,如果结果中的多个文档具有相同分数,则结果中文档的顺序是不确定的。如果希望结果有明确的顺序,我们建议您在 $search阶段包含 排序 选项,以按唯一字段对结果进行排序。如果不指定唯一字段,Atlas Search 默认会在结果分数相同时对结果进行任意排序。您还可以使用 排序 选项按分数返回对结果进行升序排序。要了解更多信息,请参阅 对 Atlas Search 结果 进行 排序和按分数排序示例。

注意

单独的 Search Nodes 上,每个节点都有自己的具有不同内部 ID 的文档副本,当多个文档具有相同分数时,Lucene 使用该副本对结果进行排序。如果未处理查询的节点上文档的内部 ID 的分页顺序大于分页词元,则如果您排序和mongot 分页 ,正在处理查询的节点上的 可能会将其包含在结果中结果。为缓解此问题,请在 之后使用 ,按$match $search_id排除文档。

有关 Lucene 评分算法的更多信息,请参阅 Lucene 文档

后退

3. 构造查询路径

来年

修改分数