如何在Elasticsearch中筛选含空字段的文档?字段为二维数组
用Filter筛选Elasticsearch中含空二维数组字段的文档
可以通过filter实现需求,但你之前用terms查询空字符串的写法不对,因为二维数组的空值不会被索引为空字符串,所以匹配不到目标文档。
问题原因
Elasticsearch对二维数组的索引逻辑:
- 若字段是空数组
[],不会生成任何索引条目; - 若字段是嵌套空数组
[[]],同样不会被索引成空字符串; - 你的
terms: {documents: [""]}是在匹配数组中包含空字符串元素的文档,而非空数组本身。
正确的Filter实现方式
针对二维数组字段的几种空场景(字段不存在、空数组、所有子数组为空),可以组合以下filter条件:
{ "query": { "bool": { "filter": { "bool": { "should": [ // 匹配字段完全不存在的文档 { "bool": { "must_not": { "exists": { "field": "documents" } } } }, // 匹配字段为空数组 [] 的文档 { "script": { "script": "doc['documents'].size() == 0" } }, // 匹配二维数组中所有子数组都是空的文档(如 [[]]、[[], []]) { "script": { "script": "doc['documents'].every(arr -> arr.isEmpty())" } } ], "minimum_should_match": 1 } } } } }
对应的Curl请求示例
curl -X GET -H "Content-Type: application/json" "http://localhost.blahblah/my_index/_search" -d '{ "query": { "bool": { "filter": { "bool": { "should": [ { "bool": { "must_not": { "exists": { "field": "documents" } } } }, { "script": { "script": "doc['\''documents'\''].size() == 0" } }, { "script": { "script": "doc['\''documents'\''].every(arr -> arr.isEmpty())" } } ], "minimum_should_match": 1 } } } } }'
补充说明
- 如果你的业务场景只需要匹配某一种空情况(比如仅空数组),可以删除其他不需要的
should分支; - Script查询需要确保Elasticsearch允许脚本执行(默认已开启,若未开启需修改
elasticsearch.yml中的script.allowed_types等配置)。
内容的提问来源于stack exchange,提问作者raph mwanza
相关产品推荐
相关产品推荐

