相关文章推荐
不要命的自行车  ·  使用近似与精确kNN实现向量检索-检索分析服 ...·  1 周前    · 
失落的炒粉  ·  2024年温州国际部\国际学校课程、学费大汇 ...·  6 月前    · 
深情的馒头  ·  冰汽时代 - 萌娘百科_万物皆可萌的百科全书·  1 年前    · 
高大的红薯  ·  赏金秋,赞发展——上海交大老干部浦江郊野公园 ...·  1 年前    · 
跑龙套的小狗  ·  vs2015如何安装vsix扩展工具_无法确 ...·  1 年前    · 
没有腹肌的开水瓶  ·  9月慕尼黑车展亮相,比亚迪宋PLUS冠军版海 ...·  2 年前    · 
Code  ›  【ES实战】初探ES date类型的时区机制_java es 设置时区
date elasticsearch
https://blog.csdn.net/weixin_43820556/article/details/129305626
打篮球的蛋挞
1 年前
  • 初探ES date类型的时区机制
    • 验证场景
      • date字段类型指定唯一字符串的日期格式(非默认)
      • date类型采用默认的格式
      • date类型采用混合时间格式
      • `time_zone`参数对写入时 是否有作用

      ES默认date类型的 format格式为: strict_date_optional_time||epoch_millis 。

      时间范围查询示例

      gt:大于

      gte:大于等于

      lt:小于

      lte:小于等于

      GET _search
          "query": {
              "range" : {
                      "gte": "01/01/2012",
                      "lte": "2013",
                      "format": "dd/MM/yyyy||yyyy"
      

      date字段类型指定唯一字符串的日期格式(非默认)

      # 创建索引-指定单一的日期格式,不指定时区。
      PUT gudongtest001
          "settings": {
              "number_of_replicas": 0
          "mappings": {
              "_doc": {
                  "properties": {
                      "date": {
                          "type": "date",
                          "format": "yyyy-MM-dd HH:mm:ss",
                          "store": true
                      "message": {
                          "type": "keyword"
      # 写入数据
      PUT gudongtest001/_doc/1
      { "date": "2023-02-28 00:01:10","message":"trying out Elasticsearch" } 
      PUT gudongtest001/_doc/2
      { "date": "2023-02-28 09:01:10","message":"trying out Elasticsearch" } 
      PUT gudongtest001/_doc/3
      { "date": "2023-02-28 18:01:10","message":"trying out Elasticsearch" } 
      # 不满足日期格式的数据无法写入了
      PUT gudongtest001/_doc/4
      { "date": "1677722733000","message":"trying out Elasticsearch" } 
      # 正常查询与显示
      GET gudongtest001/_search
          "query": {
              "range" : {
                  "date" : {
                      "gte" : "2023-02-28 00:01:10"
      # 查询过程中进行format -1677513670000在东八区的时间为2023-02-28 00:01:10
      GET gudongtest001/_search
          "query": {
              "range" : {
                  "date" : {
                      "gte" : "1677513670000",
                      "format": "epoch_millis"
      # 以上查询数据是没问题的
      

      date类型采用默认的格式

      PUT gudongtest002
          "settings": {
              "number_of_replicas": 0
          "mappings": {
              "_doc": {
                  "_all": {
                      "enabled": false
                  "properties": {
                      "date": {
                          "type": "date",
                          "store": true
                      "message": {
                          "type": "keyword"
      # 写入数据
      # 不支持非UTC格式的数据写入
      PUT gudongtest002/_doc/1
      { "date": "2023-02-28 00:01:10","message":"trying out Elasticsearch" } 
      PUT gudongtest002/_doc/1
      { "date": "1677513670000","message":"trying out Elasticsearch" } 
      PUT gudongtest002/_doc/2
      { "date": "1677546070000","message":"trying out Elasticsearch" } 
      PUT gudongtest002/_doc/3
      { "date": "1677578470000","message":"trying out Elasticsearch" } 
      # 查询数据
      GET gudongtest002/_search
          "query": {
              "range" : {
                  "date" : {
                      "gte" : "1677513670000"
      # 查询数据 id:1的记录没有查询到
      GET gudongtest002/_search
          "query": {
              "range" : {
                  "date" : {
                      "gte" : "2023-02-28 00:01:10",
                       "format": "yyyy-MM-dd HH:mm:ss"
      # 查看数据存储情况
      GET gudongtest002/_search
          "stored_fields": [
              "date"
          "query": {
              "match_all": {}
      ## id:2 date:"2023-02-28T01:01:10.000Z"  1677546070000
      ## id:1 date:"2023-02-27T16:01:10.000Z"  1677513670000
      ## id:3 date:"2023-02-28T10:01:10.000Z"  1677578470000
      ### 可以发现 对于unixtime时间戳在存入ES的时候,采用的是0时区。索引id1在es中的时间不满足查询条件,所以没有查询到。
      # 查询是带上时区,这个时区是作于用存储数据的,并未是查询条件。
      GET gudongtest002/_search
          "query": {
              "range" : {
                  "date" : {
                      "gte" : "2023-02-28 00:01:10",
                       "format": "yyyy-MM-dd HH:mm:ss",
                       "time_zone": "+08:00"
      

      date类型采用混合时间格式

      PUT gudongtest003
          "settings": {
              "number_of_replicas": 0
          "mappings": {
              "_doc": {
                  "_all": {
                      "enabled": false
                  "properties": {
                      "date": {
                          "type": "date",
                          "format": "yyyy-MM-dd HH:mm:ss||epoch_millis",
                          "store": true
                      "message": {
                          "type": "keyword"
      # 满足任一格式既可以写入
      PUT gudongtest003/_doc/1
      { "date": "2023-02-28 00:01:10","message":"trying out Elasticsearch" } 
      PUT gudongtest003/_doc/2
      { "date": "1677513670000","message":"trying out Elasticsearch" } 
      PUT gudongtest003/_doc/3
      { "date": "1677546070000","message":"trying out Elasticsearch" } 
      PUT gudongtest003/_doc/4
      { "date": "1677578470000","message":"trying out Elasticsearch" } 
      # 使用时间戳查询没问题
      GET gudongtest003/_search
          "query": {
              "range" : {
                  "date" : {
                      "gte" : "1677513670000"
      # 使用字符串查询--会出现同样的问题-查询的时候需要增加上时区,即查询条件时间代表的时区
      GET gudongtest003/_search
          "stored_fields": [
              "date"
          "query": {
              "range": {
                  "date": {
                      "gte": "2023-02-28 00:01:10",
                      "time_zone": "+08:00"
      # 上述查询的时候_id为2的记录查询不到
      GET gudongtest003/_doc/2/_explain
          "query": {
              "range": {
                  "date": {
                      "gte": "2023-02-28 00:01:10",
                      "lt": "2023-03-01 00:01:10"
          "_index": "gudongtest003",
          "_type": "_doc",
          "_id": "2",
          "matched": false,
          "explanation": {
              "value": 0,
              "description": "date:[1677542470000 TO 1677628869999] doesn't match id 0",
              "details": []
      1677542470000(2023-02-28 08:01:10) to 1677628869999(2023-03-01 08:01:09)
      # 查询时,查询条件的时间字符转成的,采用的是0时区。而id2中date是1677513670000,就无法满足了。
      

      time_zone参数对写入时 是否有作用

      PUT gudongtest004
          "settings": {
              "number_of_replicas": 0
          "mappings": {
              "_doc": {
                  "_all": {
                      "enabled": false
                  "properties": {
                      "date": {
                          "type": "date",
                          "format": "yyyy-MM-dd HH:mm:ss",
                          "store": true
                      "message": {
                          "type": "keyword",
                          "doc_values": false
      #写入数据
      PUT gudongtest004/_doc/1
          "date": "2023-02-28 00:01:10",
          "message": "trying out Elasticsearch",
          "time_zone": "+08:00"
      PUT gudongtest004/_doc/2
          "date": "2023-02-28 00:01:10",
          "message": "trying out Elasticsearch"
      PUT gudongtest004/_doc/3
      { "date": "1677546070000","message":"trying out Elasticsearch" } 
      PUT gudongtest004/_doc/4
      { "date": "1677546070000","message":"trying out Elasticsearch","time_zone": "+08:00" } 
      # 查看数据存储情况
      GET gudongtest004/_search
          "stored_fields": [
              "date"
          "query": {
              "match_all": {}
      ## id:2 date:"2023-02-28 00:01:10"  1677546070000
      ## id:1 date:"2023-02-28 00:01:10"  1677513670000
      ## id:3 date:"2023-02-28 01:01:10"  1677546070000
      ## id:4 date:"2023-02-28 01:01:10"  1677546070000
      ### "time_zone": "+08:00" 形式的时区参数无效
      #有作用的方式之一
      POST gudongtest004/_doc/5
        "date":"2019-12-11T08:00:00+08:00"
      
      • 创建索引的时候无法指定时区
      • 采用单一字符串格式时,写入和查询是可以忽略时区。
      • ES内部的时区是0时区
      • 写入字符串没问题,写入时间戳时会少八个小时(因为我们在东八区)
      • 在时间戳与字符串格式混用的场景下,最好查询时,统一以时间戳作为查询条件。
      • 混用多个字符串格式没有问题,尽量不要混时间戳

      彩蛋:在_ingest中结合timezone控制写入时区

      PUT _ingest/pipeline/chage_utc_to_asiash
        "processors": [
            "date" : {
              "field" : "my_time",
              "target_field": "my_time", 
              "formats" : ["yyyy-MM-dd HH:mm:ss"],
              "timezone" : "Asia/Shanghai"
      PUT gudongtest005
          "settings": {
              "default_pipeline": "chage_utc_to_asiash",
              "number_of_replicas": 0
          "mappings": {
              "_doc": {
                  "properties": {
                      "my_time": {
                          "type": "date"
      PUT gudongtest005/_doc/1
        "my_time": "2021-08-09 08:07:16"
      GET gudongtest005/_search
          "query": {
              "match_all": {}
       "my_time": "2021-08-09T08:07:16.000+08:00"
      				
      Elasticsearch数据格式插件 Elasticsearch数据格式插件提供了一项功能,使您可以将搜索结果的响应下载为JSON以外的其他几种格式。 支持的格式为CSV,Excel,JSON(批量),JSON(对象列表)和GeoJSON。 问题/问题 $ $ES_HOME/bin/elasticsearch-plugin install org.codelibs:elasticsearch-dataformat:7.6.0 支持的输出格式 该插件可让您以所需格式下载数据。 默认情况下,将返回100首匹配。 您可以自定义使用from和size查询参数返回的匹配。 如
      最近在存储数据到es中,总会有各种各样的问题,找遍了全网,也没有发现一个总结的比较好的,特此个人总结一下。 1.在使用log(elk,logstash)存储数据到elk时,因为用的是带时区的方法,也就是: yyyy-MM-dd'T'HH:mm:ss:SSS'Z' 这种格式,默认是UTC时间,东八区需要+8小时,所以在打日志的时候存储其他时间时: 时间不要以这种格式: yyyy-MM-...
      开发中,我们可能需要将时区类的时间转换成我们能够理解的且表示正常的date类型(这些场景在数据库时间字段比较常见,如mongo和es,他们储存的时候时间是0时区表示),实例如下: String time = "2020-09-27T03:57:30.003Z"; String timeStart = time.replace("Z", " UTC"); System.out.println(timeStart); SimpleDateFormat format
      需求,日志收集的时候,时间格式是国际标准时间格式。形如yyyy-MM-dd'T'HH:mm:ss.SSS。 (2023-12-05T02:45:50.282Z)这个时区也不对,那如何将此类型的时间,进行格式化呢? 本篇文章体统一个案例,可以格式化各种类型的时间,已经调整到各个时区。
      本文主要讲解Elasticsearch中date类型数据的底层存储原理,以及对带时区日期字符串和不带时区的日期字符串如何在ES底层存储进行验证。对于直接存储Long类型时间戳,不作过多描述。 1.1 Date类型数据的存储 UTC(Universal Time Coordinated) 叫做世界统一时间,中国大陆所用的时间是东8区时间,比UTC时间超前8小时。即与 UTC 的时差是 +8 ,也就是 UTC+8。 在Elasticsearch内部,不论 date 是什么展示格式,所有date类型数据 我们在做 Java 开发过程中其实很少关心时区的问题,因为这个一般都使用系统默认的东八区了,所以在存储时间和查询时间时感觉不到时区的存在,以及可能会发生的问题。但是有 ES(Elasticsearch)开发经验的朋友可能或多或少都遇到或者处理过 ES 中的日期类型的时区问题,当遇到此类问题时可能也会很快解决,因为网上教程很多,如何设置、如何指定日期格式,等等,但是并不见得会深度研究。 当然,对于一个一直对时区、什么GMT+8、UTC总是一知半解的我来说,总是感觉... 就不重复了,简单总结下我的几点感受吧: 1. 不要直接下载spark源码再checkout[release到]分支,跟直接下载的release包比起来,很多文件不一样,尤其是pom,我今天就是深受其害,改了半天依赖最后还是编译失败了,但是,通过release包编译直接成功!!!没有任务多余的操作。 2. 很惭愧,写了几年代码也搞了几年大数据,源码编译的经历却很少,在windows上就更好了,之前一直疑惑都是sh文件我在win上咋弄啊,但又不想自己折腾docker或者虚拟机,今天才知道可以使用git!!! 总之,太感谢大佬了,向大佬致敬,活到老学到老 。。。 请允许我贴个完整的编译日志: `https://gitee.com/xiaofeng24/source-code-compile.git`
 
推荐文章
不要命的自行车  ·  使用近似与精确kNN实现向量检索-检索分析服务 Elasticsearch版-阿里云
1 周前
失落的炒粉  ·  2024年温州国际部\国际学校课程、学费大汇总!-学校大全网
6 月前
深情的馒头  ·  冰汽时代 - 萌娘百科_万物皆可萌的百科全书
1 年前
高大的红薯  ·  赏金秋,赞发展——上海交大老干部浦江郊野公园“三看”活动成功举行-上海交通大学党委组织部
1 年前
跑龙套的小狗  ·  vs2015如何安装vsix扩展工具_无法确定操作。必须指定vsix的安装路径-CSDN博客
1 年前
没有腹肌的开水瓶  ·  9月慕尼黑车展亮相,比亚迪宋PLUS冠军版海外定名海豹U|新车评网|m.xincheping.com
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号