真实用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}}}}
不设置minimum_should_match(真实用默认operator=or): hits = 5 → 5篇文档全部命中,哪怕只含"apple"这一个词的那篇也算
这是本系列第29篇验证过的真实结论的延续:match查询的4个词被分析之后,默认用should(OR)语义组合,真实只要命中其中任意一个词就算匹配,所以哪怕只含一个单词"apple"的文档也真实被判定为命中。minimum_should_match这个参数真实就是用来收紧这个"任意一个就算"的宽松标准的。
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篇。
代码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}}}}
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"
每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。
match 查询与 minimum_should_match 参数