Elasticsearch加载索引仪表盘时280个分片3个失败报错如何修复?
问题根因
本次报错本质是Elasticsearch的Painless脚本运行时异常,具体触发逻辑如下:
- 你在可视化的聚合规则中使用了脚本
doc['user.followers_count'].value > 9999 ? 1 : 0对用户是否为万粉账号做标记 nbs_comprehend-2021-w41索引中存在部分文档没有user.followers_count字段,直接调用.value读取不存在的字段值时,ES会抛出illegal_state_exception- 这批缺字段的文档恰好分布在3个分片上,因此查询时触发3个分片失败,其余277个分片的文档均包含该字段,查询正常返回
- 可视化数据展示正常是因为ES默认会返回所有成功分片的聚合结果,失败分片对应的数据量占比极低,因此你感知不到数据偏差。
修复方案
- 方案1:调整Painless脚本逻辑(最便捷,推荐)
新增字段存在性判断逻辑,适配缺字段的场景,可根据业务需求给缺字段的文档设置默认归属值,示例如下(缺字段时默认归为非万粉账号):doc['user.followers_count'].size() == 0 ? 0 : doc['user.followers_count'].value > 9999 ? 1 : 0 - 方案2:补全索引字段(彻底解决,推荐)
执行批量更新操作,给索引中所有缺失user.followers_count的文档补充默认值(比如0),同时在数据写入链路增加字段校验,确保新写入的文档都包含该字段,从根源避免同类问题。 - 方案3:屏蔽报错提示(临时应急,不推荐)
若暂时无法调整脚本或数据,可在Kibana高级设置中关闭分片失败的弹窗提示,但该方案没有解决实际问题,后续其他查询仍可能触发同类报错。
内容的提问来源于stack exchange,提问作者Kelly
相关产品推荐
相关产品推荐

