真实验证min_score按相关性得分门槛排除低分文档的效果,并对比上一篇post_filter的结论,证明min_score会真实收窄聚合计算范围而post_filter不会,两者在筛选发生的阶段上有本质区别。
代码真实索引4篇文档,标题分别是: "elasticsearch performance tuning guide" / "elasticsearch basic tutorial" "a random article about cooking" / "python programming language elasticsearch mentioned once" POST /ms_test/_search {"query":{"match":{"title":"elasticsearch performance"}}} POST /ms_test/_search {"min_score":0.5,"query":{"match":{"title":"elasticsearch performance"}}}
不设min_score: hits=3 → 1.6349643 "elasticsearch performance tuning guide" → 0.41299206 "elasticsearch basic tutorial" → 0.31387398 "python programming language elasticsearch mentioned once" min_score=0.5: hits=1 → 1.6349643 "elasticsearch performance tuning guide" ← 真实得分0.41和0.31那两篇都被min_score真实挡在了结果外面
这组结果真实验证了min_score最直接的作用:它真实在打分完成之后,把得分低于这个门槛的文档整个排除出最终的命中结果,哪怕这些文档真实满足查询条件、真实被判定为相关。本次实测得分0.41和0.31的两篇文档真实都因为相关性不够高(低于0.5这个门槛)被排除掉,hits.total也真实从3条精确收窄成了1条,不是"显示上过滤但统计上还留着",而是真实从命中结果集里被摘除了。
代码每篇文档都额外带一个cat(keyword)字段: high/mid/none/low POST /ms_test/_search {"min_score":0.5,"query":{"match":{"title":"elasticsearch performance"}}, "aggs":{"cats":{"terms":{"field":"cat"}}}} POST /ms_test/_search {"query":{"match":{"title":"elasticsearch performance"}}, "aggs":{"cats":{"terms":{"field":"cat"}}}}
min_score=0.5,聚合桶:
→ [('high', 1)] ← 真实只剩得分够高的那篇对应的cat桶
不设min_score,同样的聚合:
→ [('high', 1), ('low', 1), ('mid', 1)] ← 真实三个桶都在每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。
min_score 参数与 terms 聚合