minimum_should_match 顾名思义:最低匹配度,即 should 子句在倒排索引中最低的匹配个数。

1. minimum_should_match 的使用

1.1 数据准备

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 创建索引
PUT test_match
# 创建映射
PUT test_match/_mapping
{
"properties":{
"price":{
"type":"double"
},
"name":{
"type":"text"
}
}
}
# 批量导入数据
PUT _bulk
{"create":{"_index":"test_match","_type":"_doc"}}
{"name":"ES,rabbitmq,SPRING,REDIS","price":90.00}
{"create":{"_index":"test_match","_type":"_doc"}}
{"name":"PHP,JAVA,redis,JSP,kafaka,rabbitmq","price":80.00}
{"create":{"_index":"test_match","_type":"_doc"}}
{"name":"PHP,JAVA,C++,C,python,go","price":99.00}
{"create":{"_index":"test_match","_type":"_doc"}}
{"name":"hadoop,es","price":50.00}
{"create":{"_index":"test_match","_type":"_doc"}}
{"name":"hello,pool,mq","price":100.00}

1.2 实战分析

1.2.1 在 match 中的应用

minimum_should_match:当 operator 参数设置为 or 时,用来控制匹配分词的最少数量。

如上例中,name 字段类型为 text,第一条数据的倒排索引示意:

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

1
2
3
4
5
6
7
8
9
10
11
12
# 复杂查询
GET test_match/_search
{
"query": {
"match": {
"name": {
"query": "java,es",
"minimum_should_match": 2
}
}
}
}

1.2.2 在 should 中的应用

match 操作在 ES 底层会被转换为如下 term 操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
GET test_match/_search
{
"query": {
"bool": {
"should": [
{"term": {
"name": {
"value": "rabbitmq"
}
}},
{
"term": {
"name": {
"value": "es"
}
}
}
],
"minimum_should_match": 2
}
}
}

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

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

minimum_should_match 用于控制 bool 查询中 should 列表至少需要匹配几个条件才召回文档。

默认不传 minimum_should_match 时,分两种情况:

  • bool 处于 query 上下文且存在 mustfilter 子句时,should 即使一条都不满足也可召回文档(如图 1.3.1)
  • bool 处于 filter 上下文,或处于 query 上下文但无 must/filter 子句时,should 至少需匹配一个才会召回文档(如图 1.3.2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
GET test_match/_search
{
"query": {
"bool": {
"filter": [
{
"bool":{
"should":[
{"term":{"name":"es"}},
{"term":{"name":"rabbitmq"}}
]
}
},
{
"range":{
"price":{
"gte":80.00
}
}
}
]
}
}
}

注意:当传入 minimum_should_match 时,只会召回满足 should 匹配条件的文档。

2. minimum_should_match 参数说明

2.1 传入整数

传入正整数表示最少需匹配的个数,也可传入负数。示例:

1
2
3
4
5
6
7
8
9
10
11
GET test_match/_search
{
"query": {
"match": {
"name": {
"query": "php,java,jsp",
"minimum_should_match": "-1"
}
}
}
}

上面的意思: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 个不匹配。

参考资料