从ElasticSearch查询的日期字段中提取日期yyyyMMdd

问题描述

我的索引有一个日期字段,格式为2020-01-04T05:00:06.870000Z。在ES查询响应中,我需要yyyyMMdd形式的日期,所以20200104。我尝试使用脚本查询并分别提取了日期,月份和年份。我如何在_source中将它们串联起来,得到number形式的yyyyMMdd

样本数据:

 "_source": {
    "updated": "2020-01-04T05:00:06.870000Z"
  }
  "_source": {
    "updated": "2020-01-04T09:00:08.870000Z"
  }
  "_source": {
    "updated": "2019-12-04T01:00:06.870000Z"
  }
}

查询

"sort" : [
        { 
            "_script": {
                "type": "number","script": {
                    "lang": "painless","source": "doc['updated'].value.getYear()"  
//similarly use getMonthOfYear() and getDayOfMonth(). How to concatenate and convert to number ?
                },"order": "desc"
            }
        }
    ]

解决方法

您可以使用String.format正确填写数字,然后在结果上Integer.parseInt

或者,您可以执行以下操作:

GET dates/_search
{
  "sort": [
    {
      "_script": {
        "type": "number","script": {
          "lang": "painless","source": """
            Integer.parseInt(
              DateTimeFormatter
                .ofPattern("yyyyMMdd")
                .withZone(ZoneOffset.UTC)
                .format(Instant.ofEpochMilli(
                  doc['updated'].value.millis)
                ));
          """
        },"order": "desc"
      }
    }
  ]
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...