Elasticsearch查询无法使用OR条件,should语句未返回全部匹配结果
要实现SQL中select * from tablename where makeIt in ("foo","roo")的查询效果,优先使用Elasticsearch原生的terms查询,语法更简洁,逻辑也完全对齐需求,调整后的查询DSL如下:
{ "query": { "terms": { "makeIt": ["foo", "roo"] } } }
原查询问题说明
你当前的bool.should写法逻辑上也可以实现同等效果,出现仅返回部分匹配结果的问题,通常是两个原因:
- 没有显式设置
minimum_should_match参数:当bool查询中同时存在其他filter/must子句时,minimum_should_match默认值为0,会导致should的匹配条件不生效,仅作为算分依据,显式设置该参数为1即可要求至少匹配一个should子句。 - 分页参数
size设置过小:仅返回了部分命中结果,可适当调大size或者使用scroll/search_after获取全量数据。
如果要保留bool.should的写法,调整后的示例如下:
{ "query": { "bool": { "minimum_should_match": 1, "should": [ { "term": {"makeIt": {"value": "foo"}} }, { "term": {"makeIt": {"value": "roo"}} } ] } } }
注意事项
terms和term都属于精确匹配查询,要求查询的字段为keyword类型或者未做分词的数值/日期类型,如果makeIt字段是text分词类型,需要根据实际分词规则调整查询逻辑。
内容的提问来源于stack exchange,提问作者SJJ
相关产品推荐
相关产品推荐

