Elasticsearch 通过脚本清洗时间格式数据

文章目录

实例

实例,将utc时间转换为东8时区时间并存储时间戳

POST user_at_index_sc/_update_by_query
{
  "query": {
    "range": {
      "at_time_long": {
        "lte": 3000
      }
    }
  },
   "script": {
    "source": """
      def src_time = ctx._source['at_time'];
      if (/^\d{4}-\d{1,2}-\d{1,2} {1}\d{1,2}:\d{1,2}:\d{1,2}$/.matcher(src_time).find()) {
        def t = LocalDateTime.parse(src_time, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        ctx._source.at_time_long = t.atZone(ZoneId.of("America/Los_Angeles")).toInstant().toEpochMilli();
      }
      
      if (/^\d{4}-\d{1,2}-\d{1,2}T{1}\d{1,2}:\d{1,2}:\d{1,2}.\d{3}Z$/.matcher(src_time).find()) {
        def t = LocalDateTime.parse(src_time, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"));
        ctx._source.at_time_long = t.atZone(ZoneId.of("UTC")).toInstant().toEpochMilli();
        ctx._source.at_time = t.atZone(ZoneId.of("UTC")).withZoneSameInstant(ZoneOffset.ofHours(8)).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));        
      }
      
    """,
    "lang": "painless"
  }
}

POST /_scripts/painless/_execute
{
  "script": {
    "source": """
      def test = params.at_time;
      if (/^\d{4}-\d{1,2}-\d{1,2} {1}\d{1,2}:\d{1,2}:\d{1,2}$/.matcher(test).find()) {
        def t = LocalDateTime.parse(params.at_time, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        return t.atZone(ZoneId.of("America/Los_Angeles")).toInstant().toEpochMilli();        
      }
      if (/^\d{4}-\d{1,2}-\d{1,2}T{1}\d{1,2}:\d{1,2}:\d{1,2}.\d{3}Z$/.matcher(test).find()) {
        def t = LocalDateTime.parse(params.at_time, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"));
        return t.atZone(ZoneId.of("UTC")).toInstant().toEpochMilli();        
      }
      return 0;
      """,
    "params": {
      "at_time": "2019-05-24T06:16:27.000Z"
    }
  }
}

持久化脚本

POST _scripts/user_like_time_script
{
  "script": {
    "source": """
      def src_time = ctx._source['at_time'];
      if (/^\d{4}-\d{1,2}-\d{1,2} {1}\d{1,2}:\d{1,2}:\d{1,2}$/.matcher(src_time).find()) {
        def t = LocalDateTime.parse(src_time, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        ctx._source.at_time_long = t.atZone(ZoneId.of("America/Los_Angeles")).toInstant().toEpochMilli();
      }
      
      if (/^\d{4}-\d{1,2}-\d{1,2}T{1}\d{1,2}:\d{1,2}:\d{1,2}.\d{3}Z$/.matcher(src_time).find()) {
        def t = LocalDateTime.parse(src_time, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"));
        ctx._source.at_time_long = t.atZone(ZoneId.of("UTC")).toInstant().toEpochMilli();
        ctx._source.at_time = t.atZone(ZoneId.of("UTC")).withZoneSameInstant(ZoneOffset.ofHours(8)).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));        
      }
      
    """,
    "lang": "painless"
  }
}

使用时简化只需要指定id
POST user_at_index_sc/_update_by_query
{
  "query": {
    "range": {
      "at_time_long": {
        "lte": 3000
      }
    }
  },
  "script": {
    "id": "user_like_time_script"
  }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值