Elasticsearch查询如何忽略空值参数并实现非空值精确匹配
解决方案
你需要的查询可以通过两种方式实现,分别对应不同的使用场景:
方案1:动态构建查询(性能最优,最推荐)
在业务代码生成ES查询语句的阶段,先判断传入的myvalue是否为空字符串:
- 如果为空,就不要把该字段的查询条件加入
bool.must数组,自然就不会执行空字符串检索 - 如果非空,将原有的
match查询替换为term查询实现精确匹配,最终效果如下:
...... bool: { must: [ // 其他原有查询条件 term : { myfield.myfield2.keyword : "myvalue" } ] } ......
keyword类型字段用term查询本身就是精确匹配逻辑,完全满足你的第二个要求,且没有额外的查询开销。
方案2:ES侧固定查询(适合无法修改业务查询构建逻辑的场景)
如果需要写死在ES侧的查询语句,不需要业务层判断参数,可以借助搜索模板+bool.should分支逻辑实现,写法如下:
{ "script": { "lang": "mustache", "source": { "query": { "bool": { "must": [ // 其他原有查询条件 { "bool": { "should": [ // 适配myvalue为空字符串的分支 { "term": { "myvalue": "" } }, // 非空时走精确匹配的分支 { "term": { "myfield.myfield2.keyword": "{{myvalue}}" } } ], "minimum_should_match": 1 } } ] } } }, "params": { "myvalue": "你的传入参数" } } }
逻辑说明:
- 当传入的
myvalue为空字符串时,should的第一个分支命中,整个字段过滤条件直接成立,相当于没有加这个限制 - 当传入的
myvalue非空时,第一个分支不命中,自动走第二个分支的精确匹配逻辑 - 如果需要适配
myvalue为null的场景,把第一个分支替换为{"bool": {"must_not": {"exists": {"field": "myvalue"}}}}即可
内容的提问来源于stack exchange,提问作者Fabry
相关产品推荐
相关产品推荐

