如何在Elasticsearch-DSL中将minimum_should_match应用到内层查询作用域
问题原因
你当前的写法是将minimum_should_match参数传给了最外层的bool查询,因此该参数会作用于外层bool的整个查询逻辑,会影响外层所有的must、should、filter子句的匹配规则,自然不会作用于内层的genotypes_q查询列表。
修复方案
你只需要将minimum_should_match参数绑定到genotypes_q对应的内层bool查询上即可,有两种常用实现方式:
方式1:直接构造内层bool查询(推荐,无需循环拼接)
不需要再用|=循环拼接查询条件,直接把查询条件列表传给内层bool的should参数,同时指定minimum_should_match:
from elasticsearch_dsl import Q # 内层bool查询绑定minimum_should_match,仅作用于当前的should条件列表 genotypes_q = Q('bool', should=qs, minimum_should_match=2) # 外层bool查询直接将内层查询放入filter即可,不需要额外参数 Search().query('bool', filter=[genotypes_q])
方式2:保留原有循环拼接逻辑,手动给内层bool加参数
如果你不想修改原有循环拼接的写法,可以直接给拼接完成的genotypes_q对象添加minimum_should_match属性:
from elasticsearch_dsl import Q genotypes_q = Q() # 注意要先初始化空的Q对象,原有代码如果没有这步要补上 for family_samples_q in qs: genotypes_q |= family_samples_q # 给内层bool查询添加匹配规则,仅作用于该查询内的should子句 genotypes_q.minimum_should_match = 2 Search().query('bool', filter=[genotypes_q])
两种写法最终生成的DSL结构完全一致,minimum_should_match都会只作用于genotypes_q对应的内层should查询列表,不会对外层的其他查询条件产生任何影响。
内容的提问来源于stack exchange,提问作者Nikita Vlasenko
相关产品推荐
相关产品推荐

