使用无痛脚本在 Elasticsearch 生产集群中将日期时间字段增加一天

Incrementing Datetime field by one day in Elasticsearch Production Cluster using painless script

我在调试 yyyy-MM-dd 格式的生产级 Elastic Search Index 日期时间字段时遇到困难,我想 update/increment 一天前的日期时间字段,例如 - 2009-07-01 i想要将索引中的所有文档更新为 2009-07-02。

我也想知道我是否必须使用重新索引 api 或通过查询更新 api

目前我尝试使用以下无痛脚本更新文档,但它不起作用

POST klaprod-11042022/_update_by_query


{
  "script": {
    "source": "def df = DateTimeFormatter.ofPattern('yyyy-MM-dd');def tmp = LocalDateTime.parse(ctx._source.debate_section_date,df);ctx._source.debate_section_date=tmp.plusDays(1);",
    "lang": "painless"
  },
  "query": {"match_all":{}}
}

感谢社区的任何建议

您遇到异常,因为您的日期不包含任何时间。您需要使用 LocalDateatStartOfDay() 方法来添加一天。

POST datecheck/_update_by_query
{
  "script": {
    "source": "def df = DateTimeFormatter.ofPattern('yyyy-MM-dd');def tmp = LocalDate.parse(ctx._source.date,df).atStartOfDay();ctx._source.date=tmp.plusDays(1);",
    "lang": "painless"
  },
  "query": {"match_all":{}}
}

这将生成日期加上一个日期并加上时间。因此,如果您不需要时间,则可以在脚本中设置 ctx._source.date 字段之前再次格式化日期。

I also want to know whether i have to use the re index api or update by query api

如果要将数据复制到新索引,则可以使用 reindex api 否则 _update_by_query 将用于相同的索引更新。

阅读文档后,以下内容对我有用,您不必轻松调用 DateTimeFormatter,因为 LocalDate 可以解析原始 yyyy-MM-dd 格式的日期时间字符串

POST klaprod-11042022/_update_by_query
{
  "script": {
    "source": "def tmp = LocalDate.parse(ctx._source.debate_section_date);ctx._source.debate_section_date=tmp.plusDays(1);",
    "lang": "painless"
  },
  "query": {"match_all":{}}
}