【问题标题】:Extract date (yyyyMMdd) from date field in ElasticSearch query从 ElasticSearch 查询中的日期字段中提取日期 (yyyyMMdd)
【发布时间】:2020-09-09 15:16:42
【问题描述】:

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

样本数据:

 "_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"
            }
        }
    ]

【问题讨论】:

    标签: elasticsearch elasticsearch-dsl elasticsearch-painless elasticsearch-scripting


    【解决方案1】:

    您可以使用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"
          }
        }
      ]
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-30
      • 2021-03-20
      • 2021-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多