使用无痛脚本将Elasticsearch生产集群中的Datetime字段增加一天



我在调试yyyy-MM-dd格式的生产级弹性搜索索引日期时间字段时遇到了困难;我想把日期时间字段更新/增加一天例如:2009-07-01我想把索引中所有文档的日期时间字段都更新到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":{}}
}

感谢社区的任何建议

在完成文档后,以下内容对我有效,您不必无痛地调用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":{}}
}

您会遇到异常,因为您的日期没有任何时间。您需要使用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字段之前再次格式化日期。

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

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

相关内容

  • 没有找到相关文章

最新更新