【问题标题】:Get date value in update query elasticsearch painless在更新查询弹性搜索无痛中获取日期值
【发布时间】:2021-01-13 13:56:49
【问题描述】:

我正在尝试获取两个日期的毫秒值并将它们减去另一个日期。 当我像doc['begin_time'].value.toInstant().toEpochMilli() 一样使用ctx._sourse.begin_time.toInstant().toEpochMilli() 时,它给了我运行时错误。 和ctx._source.begin_time.date.getYear()(像这样Update all documents of Elastic Search using existing column value)给我运行时错误消息

  "ctx._source.work_time = ctx._source.begin_time.date.getYear()",
  "                                              ^---- HERE"

如果此代码正常工作doc['begin_time'].value.toInstant().toEpochMilli(),我会得到什么类型的ctx._source。 我无法在无痛的文档中找到如何正确获取值。 begin_time 是日期 100%。

那么,如何编写脚本来获取两个日期之间的差异并将其写入另一个整数?

【问题讨论】:

    标签: elasticsearch elasticsearch-painless


    【解决方案1】:

    如果您仔细观察,链接问题中的脚本语言位于 groovy 中,但不再受支持。我们现在(2021)使用的是painless

    这里的要点是 ctx._source 属性是原始 JSON —— 这意味着日期将是字符串或整数(取决于格式),而不是 java.util.Date 或您可以调用的任何其他数据类型 @987654328 @ 在。这意味着我们必须先解析该值。

    因此,假设您的 begin_time 格式为 yyyy/MM/dd,您可以执行以下操作:

    POST myindex/_update_by_query
    {
      "query": {
        "match_all": {}
      },
      "script": {
        "source": """
          DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd");
          LocalDate begin_date = LocalDate.parse(ctx._source.begin_time, dtf);
          
          ctx._source.work_time = begin_date.getYear()
        """
      }
    }
    

    顺便说一句,_update_by_query 脚本上下文(什么是可访问的,什么不是)是 documented here,并且在无痛中使用 datetime 是很好的 documented here

    【讨论】:

    • 谢谢!现在我清楚地理解了为什么在文档中弹性显示我的 java 代码。
    • 很好——我很高兴现在更清楚了。嘿,我正在写一本充满这样见解的手册。您可以let me know您想更好地理解 ES 的哪些部分。
    猜你喜欢
    • 2019-12-22
    • 2022-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    相关资源
    最近更新 更多