关于Elasticsearch中match子句内minimum_should_match作用的技术咨询
Elasticsearch查询中minimum_should_match参数的场景解析
1. bool查询must子句内match查询的minimum_should_match:2
你这里的match查询虽然写在外层bool的must里,但**minimum_should_match作用的是match查询内部生成的隐式bool should结构**,和外层bool的should无关。
当你给match的query传入多词内容(比如示例里的"here goes the query"),Elasticsearch会自动把这个match查询转换成一个包含多个term的bool should查询——每个词对应一个should子句。这时候设置minimum_should_match:2,就要求文档的title_normalized字段至少匹配这四个词中的2个,而且因为这个match在must子句里,这个条件是必须满足的,不满足的文档会被直接排除。
对应的查询逻辑等价于:
"must": { "bool": { "should": [ {"term": {"title_normalized": "here"}}, {"term": {"title_normalized": "goes"}}, {"term": {"title_normalized": "the"}}, {"term": {"title_normalized": "query"}} ], "minimum_should_match": 2 } }
2. filter的bool should数组内每个match查询的minimum_should_match:2
这个场景里有两层minimum_should_match,作用范围完全不同:
- 内层每个match的minimum_should_match:2:针对单个
match查询的多词query。比如第一个match的query是"here goes",这是两个词,设置minimum_should_match:2就要求文档的title_normalized字段必须同时匹配这两个词(因为要满足至少匹配2个,也就是全匹配);同理第二个match的"the query"也要求两个词都匹配。 - 外层filter bool的minimum_should_match:1:要求整个should数组里至少有一个match查询的条件被满足——也就是文档要么同时匹配"here"和"goes",要么同时匹配"the"和"query",二选一即可,满足其中一个就会被filter保留。
简单来说,这里的每个match都是一个“必须全匹配多词”的条件,外层bool要求至少满足其中一个这样的条件。
内容的提问来源于stack exchange,提问作者Nicola Pedretti
相关产品推荐
相关产品推荐

