如何统计Elasticsearch中tags为对象而非数组的异常文档数?
脚本查询统计法
直接用_count API结合Painless脚本筛选出text.tags为对象而非数组的文档,DSL如下:
GET /your_index/_count { "query": { "bool": { "filter": [ { "exists": { "field": "text.tags" } }, { "script": { "script": { "source": "if (params._source.text == null) { return false; } for (def item : params._source.text) { if (item.tags != null && !(item.tags instanceof List)) { return true; } } return false;", "lang": "painless" } } } ] } } }
逻辑说明
exists查询先过滤出包含text.tags字段的文档,缩小脚本执行范围- 脚本遍历
text数组的每个元素,检查其中的tags是否为非数组类型(即对象/Map),只要有一个元素符合就判定为异常文档
聚合统计法(适合需分组场景)
如果需要更结构化的统计结果,用聚合查询:
GET /your_index/_search { "size": 0, "aggs": { "invalid_tags_docs": { "filter": { "bool": { "filter": [ { "exists": { "field": "text.tags" } }, { "script": { "script": "if (params._source.text == null) { return false; } for (def item : params._source.text) { if (item.tags != null && !(item.tags instanceof List)) { return true; } } return false;" } } ] } } } } }
关键提示
- 替换
your_index为实际索引名称 - 脚本中加入
params._source.text == null的判断,避免空指针异常 - 确保集群允许Painless脚本执行(默认开启,若受限需调整
script.allowed_types配置)
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

