如何在Elasticsearch中更新指定范围内的timestamp时间戳字段
Elasticsearch 批量修正时间戳单位错误方案
你可以使用Elasticsearch内置的_update_by_query接口实现符合筛选条件的文档批量更新,操作语句如下:
{ "query": { "range": { "message.timestamp": { "gte": "+50798-06-20T00:27:37" } } }, "script": { "lang": "painless", "source": "ctx._source.message.timestamp = (long)(ctx._source.message.timestamp / 1000)" } }
注意事项
- 把请求路径中的
你的索引名替换为你实际要操作的索引名称,不推荐直接操作全集群所有索引,尽量限定索引范围降低风险。 - 脚本中加
(long)强制类型转换是为了避免除法后出现小数,如果你存储的时间戳允许浮点数可以去掉该转换。 - 操作前建议先执行小批量测试验证效果,仅更新10条匹配数据的语句如下:
{ "max_docs": 10, "query": { "range": { "message.timestamp": { "gte": "+50798-06-20T00:27:37" } } }, "script": { "lang": "painless", "source": "ctx._source.message.timestamp = (long)(ctx._source.message.timestamp / 1000)" } }
执行后查询这10条数据确认修正结果符合预期后,再执行全量更新操作。
- 如果匹配的文档量级很大(超过10万条),建议添加
wait_for_completion=false参数让任务异步执行,避免请求超时:
{ "query": { "range": { "message.timestamp": { "gte": "+50798-06-20T00:27:37" } } }, "script": { "lang": "painless", "source": "ctx._source.message.timestamp = (long)(ctx._source.message.timestamp / 1000)" } }
执行后会返回任务ID,你可以通过任务ID查询执行进度。
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

