关于ES的minimum_should_match
minimum_should_match用于控制bool中should列表,至少匹配几个条件才召回doc。
默认不传minimum_should_match的情况下,查询分2个情况:
- 当bool处在query上下文中时,如果must或者filter匹配了doc,那么should即便一条都不满足也可以召回doc。
- 当bool处在父bool的filter上下文中时 或者 bool处在query上下文且没有must/filter子句的时候,should至少匹配1个才能召回doc。
所以,如果需要类似这种查询:where a=1 and (b=2 or c=3),就有2种做法:
走嵌套bool,让should进入filter上下文:
1 2 3 4 5 6 7 8 9 10 11 |
bool { filter: [ a=1, bool { should: [ b=2, c=3 ] } ] } |
走单bool,query上下文,需要显式指定minimum_should_match=1:
1 2 3 4 5 6 7 8 9 10 |
bool { filter: [ a=1, ], should: [ b=2, c=3 ], minimum_should_match: 1 } |
其实作为一个可扩展的查询接口,一般来说嵌套bool表达力更丰富,扩展性更好,所以不建议用第二种方式开发业务。
如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~

111
222
1
腻害了,解决我一大疑惑
厉害了少侠 我说怎么加filter和should 怎么should就没起作用呢
的确。