minimum_should_match顾名思义:最低匹配度,即should子句在倒排索引中最低的匹配个数。
1. minimum_should_match 的使用
1.1 数据准备
1 | # 创建索引 |
1.2 实战分析
1.2.1 在 match 中的应用
minimum_should_match:当 operator 参数设置为 or 时,用来控制匹配分词的最少数量。
如上例中,name 字段类型为 text,第一条数据的倒排索引示意:

match 的查询条件同样会分词,minimum_should_match 用于控制分词条件在倒排索引中最少需要匹配的个数。
1 | # 复杂查询 |

1.2.2 在 should 中的应用
match 操作在 ES 底层会被转换为如下 term 操作:
1 | GET test_match/_search |

1.3 should 子句失去 or 功能的解决方案

照片出处... elasticsearch should实现or功能,设置minimum_should_match

minimum_should_match 用于控制 bool 查询中 should 列表至少需要匹配几个条件才召回文档。
默认不传 minimum_should_match 时,分两种情况:
bool处于query上下文且存在must或filter子句时,should即使一条都不满足也可召回文档(如图 1.3.1)bool处于filter上下文,或处于query上下文但无must/filter子句时,should至少需匹配一个才会召回文档(如图 1.3.2)

1 | GET test_match/_search |
注意:当传入 minimum_should_match 时,只会召回满足 should 匹配条件的文档。
2. minimum_should_match 参数说明
2.1 传入整数
传入正整数表示最少需匹配的个数,也可传入负数。示例:
1 | GET test_match/_search |
上面的意思:3 个条件最低满足 2 个(即最多允许 1 个不匹配)。
2.2 传入百分比
传入正百分比时(如图 2.2-1):

3 个参数,匹配 1 个为 34%,匹配 2 个为 67%。传入 50% 时,向下取整转换为最少匹配 1 个。
传入负百分比时(如图 2.2-2):

负数 -50% 表示最多不匹配 50%,向下取整为最多不匹配 1 个,即最少匹配 2 个。
2.3 条件组合方式
格式为 正整数<说明符:当可选子句数量 ≤ 该整数时,全部都必须匹配;若数量 > 该整数,则应用后面的说明符。

2.4 多条件组合
多个规范用空格分隔,每个规范仅对大于前一个的数量有效。示例:若有 1 或 2 个 should 子句则全部要求匹配;若有 3~9 个则需匹配 75% 以上(除 25% 外);若超过 9 个则最多允许 3 个不匹配。
