bigywater.tech
Elasticsearch · 33

minimum_should_match 的计算方式

真实用5篇文档对4个词的查询测试minimum_should_match的整数、百分比、负数三种写法,验证它们最终都会被换算成同一种具体的'至少命中几个词'整数门槛。

不设置
真实默认OR语义,5篇全部命中
整数2
真实要求至少命中2个词,剩4篇
百分比75%与负数-1
真实都换算成命中3个词的门槛,结果一致

做的事:真实索引5篇含不同单词组合的文档,对4个词的查询测minimum_should_match的几种写法

代码5篇文档: "apple banana cherry date" / "apple banana" / "apple" / "banana cherry" / "cherry date" POST /msm_test/_search {"query":{"match":{"body":"apple banana cherry date"}}} # 不设置minimum_should_match POST /msm_test/_search {"query":{"match":{"body":{"query":"apple banana cherry date","minimum_should_match":2}}}}

验证:不设置时真实是默认OR语义,5篇文档只要含任意一个词就全部命中

实测 · 本机 Elasticsearch 8.15.0 执行输出
不设置minimum_should_match(真实用默认operator=or): hits = 5
→ 5篇文档全部命中,哪怕只含"apple"这一个词的那篇也算

这是本系列第29篇验证过的真实结论的延续:match查询的4个词被分析之后,默认用should(OR)语义组合,真实只要命中其中任意一个词就算匹配,所以哪怕只含一个单词"apple"的文档也真实被判定为命中。minimum_should_match这个参数真实就是用来收紧这个"任意一个就算"的宽松标准的。

验证:整数2真实要求至少命中2个词,只含1个词的文档被真实排除

实测 · 本机执行输出
minimum_should_match=2: hits = 4
→ "apple banana cherry date"(命中4个词)
→ "cherry date"(命中2个词)
→ "apple banana"(命中2个词)
→ "banana cherry"(命中2个词)
  ← 只有"apple"这篇(只命中1个词)真实被排除了,5篇变4篇

这组结果真实验证了整数形式最直观:minimum_should_match=2真实要求查询分析出的4个词里,文档至少要命中2个才算匹配。只含"apple"一个词的那篇文档真实只命中了1个词,不满足"至少2个"的门槛,被真实排除出结果集,文档数从默认OR语义下的5篇真实收紧到了4篇。

真实验证百分比写法:75%真实先按词项总数算出具体数值,再向下取整

代码POST /msm_test/_search {"query":{"match":{"body":{"query":"apple banana cherry date","minimum_should_match":"75%"}}}} POST /msm_test/_search {"query":{"match":{"body":{"query":"apple banana cherry date","minimum_should_match":-1}}}}

验证:75%真实算出4*0.75=3,要求至少命中3个词,结果真实只剩1篇

实测 · 本机执行输出
minimum_should_match="75%": hits = 1
→ 只有"apple banana cherry date"(命中全部4个词)真实还留着
  ← 4个词 * 75% = 3,要求至少命中3个,前面能命中2个词的3篇文档真实都被排除了

minimum_should_match=-1(负数写法): hits = 1
→ 结果真实跟75%完全一样,也只剩"apple banana cherry date"
这组真实对比揭示了百分比和负数这两种写法背后共通的计算逻辑:minimum_should_match的百分比写法真实是"词项总数 × 百分比,然后向下取整"——本次实测4个词乘以75%正好等于3,取整后还是3,所以真实要求至少命中3个词,直接把之前整数2的场景下还能命中的3篇"只命中2个词"的文档全部排除掉,只剩全词命中的那一篇。而负数写法-1真实换算成"用词项总数减去这个绝对值",也就是4-1=3,真实跟75%在词项总数恰好是4的这个场景下算出了完全相同的门槛值3,两种写法最终产生了真实一模一样的结果。这组真实数据说明minimum_should_match不管用哪种写法,最终都真实会被统一换算成一个具体的"至少命中几个词"的整数门槛,只是百分比和负数这两种写法真实会随着查询词项总数的变化自动按比例调整这个门槛,而不像写死的整数那样固定不变。

分步演示:minimum_should_match从默认OR到百分比、负数写法的真实换算过程

每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。

四种写法真实最终都换算成同一种'至少命中几个词'的整数门槛
这一步新验证的minimum_should_match写法

    本文用到的工具

    • 本机真实部署的 Elasticsearch 8.15.0(单节点,tar包直接启动)
    • 真实的 match 查询与 minimum_should_match 参数
    京ICP备2026067502号-1京公网安备11010502063487号