如何编写ElasticSearch查询获取code为a或空数组的文档
错误原因
你原写法里should和must_not是同级参数,所以两个条件会同时生效,要求文档既匹配code=a,又满足code字段不存在,天然是AND逻辑,不符合需求。
正确写法
要实现「code包含a OR code是空数组」的逻辑,把两个条件都放到bool.should数组中即可,ES中should数组下的条件默认满足任意一个就匹配:
{ "query": { "bool": { "should": [ // 条件1:code包含a,用keyword子字段做精确匹配可避免分词干扰 { "term": { "code.keyword": "a" } }, // 条件2:code是空数组(ES中空数组的exists查询返回false,和字段不存在效果一致) { "bool": { "must_not": [ { "exists": { "field": "code" } } ] } } ], "minimum_should_match": 1 } } }
补充说明
- 如果你需要对code做分词匹配而非精确匹配,可以把
term查询换回你原来的match查询即可。 - 加
minimum_should_match: 1是显式声明至少满足一个should条件,避免后续bool下新增其他must条件时should逻辑失效的问题。
内容的提问来源于stack exchange,提问作者Test1 Test2
相关产品推荐
相关产品推荐

