Elasticsearch用Painless更新无关字段时报timestamp解析异常
Elasticsearch更新文档@timestamp字段解析异常解决方案
异常产生原因
- 查询操作仅读取已经索引处理完成的字段数据,不会重新解析
_source中的原始字段值,因此不会触发格式校验;而更新操作需要先加载完整的_source内容,对所有字段重新做类型匹配和解析,因此会触发报错。 - 写入原始文档时,
@timestamp的原始值以科学计数法格式的浮点数/字符串(如报错中提到的1.638642742E12)存入了_source,你配置的epoch_millis日期格式解析器默认仅支持纯数字格式的毫秒值,无法识别科学计数法格式的数值,最终解析失败抛出异常。 - 写入时未报错是因为ES索引层自动将科学计数法的数值隐式转换为long类型的毫秒值完成了索引构建,但
_source中仍然保留了写入时的原始格式内容。
解决方案
临时解决单次更新问题
执行更新时在无痛脚本中先转换@timestamp的格式,避免解析报错:
POST /data_hip/_update/1638643727.0 { "script": { "source": """ ctx._source.avgmer = 4; // 将科学计数法格式的timestamp转换为long类型的毫秒值 ctx._source['@timestamp'] = (long)Double.parseDouble(ctx._source['@timestamp'].toString()); """ } }
永久解决同类问题
二选一即可:
- 修改
@timestamp字段映射,新增对浮点型毫秒值的适配,修改后的映射如下:
"@timestamp": { "type": "date", "format": "epoch_millis||strict_epoch_millis" }
- 重建全量索引,写入新索引时将所有
@timestamp字段统一转换为纯数字格式的毫秒值,从根源上避免后续再出现同类解析异常。
内容的提问来源于stack exchange,提问作者Tommie Jones
相关产品推荐
相关产品推荐

