Elasticsearch查询报错:如何匹配Long类型字段为NULL或指定值
解决Elasticsearch中查询字段为NULL或指定值的问题
我明白你遇到的困扰了——直接在term查询里写null会触发Bad Request,这是因为Elasticsearch并不会实际存储null值:对于字段值为null的文档,ES只会标记该字段不存在,而不是存储一个null的字面量。
正确的查询写法
你需要用exists查询来匹配字段为null(即字段不存在)的文档,再结合terms查询匹配指定值,把这两个条件放在bool的should数组里。这里分两种常用写法给你参考:
1. JSON DSL格式
{ "query": { "bool": { "should": [ { "bool": { "must_not": { "exists": { "field": "your_field_name" } } } }, { "terms": { "your_field_name": [1, 2, 3, 4, 5, 6] } } ], "minimum_should_match": 1 } } }
也可以用更简洁的exists否定写法(和上面效果完全一致):
{ "query": { "bool": { "should": [ {"exists": {"field": "your_field_name", "negate": true}}, {"terms": {"your_field_name": [1, 2, 3, 4, 5, 6]}} ], "minimum_should_match": 1 } } }
2. 适配你所用的数组风格(比如PHP)
[ 'bool' => [ 'should' => [ ['bool' => ['must_not' => ['exists' => ['field' => 'your_field_name']]]], ['terms' => ['your_field_name' => [1, 2, 3, 4, 5, 6]]] ], 'minimum_should_match' => 1 ] ]
额外注意事项
- 如果你的字段在mapping里配置了
null_values(比如特意把null映射成某个固定值,例如"null_values": [0]),那你就需要用term查询匹配这个映射值,而不是用exists否定查询。示例:{ "query": { "bool": { "should": [ {"term": {"your_field_name": 0}}, {"terms": {"your_field_name": [1,2,3,4,5,6]}} ] } } } - 记得把
your_field_name替换成你实际要查询的字段名,minimum_should_match:1确保只要满足其中一个条件的文档就会被匹配到。
内容的提问来源于stack exchange,提问作者maral
相关产品推荐
相关产品推荐

