Elasticsearch 入门到精通-时间日期类型

本文详细讲解了Elasticsearch中如何处理日期类型,包括字符串、毫秒和秒表示,UTC时间的运用,自定义日期格式,索引与提交日期一致性,以及解决Kibana时间偏差的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

日期类型(Date datatype)

JSON 没有日期类型,因此在 Elasticsearch 中可以表达成:

  • 日期格式化的字符串,比如: “2015-01-01” 或者 “2015/01/01 12:10:30”;
  • 毫秒级别的 long 类型
  • 秒级别的 integer 类型,

比如: 1515150699465, 1515150699;
实际上不管日期以何种格式写入,在 ES 内部都会先换成 UTC 时间并存储为 long 类型。

date 类型在 Elasticsearch 展示的格式有下面几种:

  • 将日期时间格式化后的字符串,如 "2015-01-01" 或者 "2015/01/01 12:10:30"
  • long 型的整数,意义是 milliseconds-since-the-epoch,翻译一下就是自 1970-01-01 00:00:00 UTC 以来经过的毫秒数。
  • int 型的整数,意义是 seconds-since-the-epoch, 是指自 1970-01-01 00:00:00 UTC 以来经过的秒数。

后两种的描述里都包含 UTC ,什么是 UTC 呢?

UTC(Universal Time Coordinated) 叫做世界统一时间,中国大陆和 UTC 的时差是 + 8 ,也就是 UTC+8。

不论 date 是什么展示格式,在 Elasticsearch 内部存储时都是转换成 UTC,并且把时区也会计算进去,从而得到 milliseconds-since-the-epoch 并作为存储的格式。

在查询日期时,会执行下面的过程:

  1. 转换成 long 整形格式的范围(range) 查询
  2. 得到聚合的结果
  3. 将结果中的 date 类型(long 整型数据)根据 date format 字段转换回对应的展示格式

日期格式可以自定义,如果没有指定的话会使用以下的默认格式:
“strict_date_optional_time||epoch_millis”

date 类型的查询在内部转为 long 处理,聚合返回的结果再根据字段定义的格式转为字符串输出。

date类型是包含时区信息的,如果我们没有在json代表日期的字符串中显式指定时区,对es来说没什么问题,

但是如果通过kibana显示es里的数据时,就会出现问题,数据的时间会晚8个小时。因为kibana从es里读取的date类型数据,没有时区信息,

kibana会默认当作0时区来解析,但是kibana在通过浏览器展示的时候,会通过js获取当前客户端机器所在的时区,也就是东八区,

所以kibana会把从es得到的日期数据减去8小时。这里就会导致kibana经常遇到的“数据时间延迟8小时”的问题。

所以最佳实践方案就是:我们在往es提交日期数据的时候,直接提交带有时区信息的日期字符串,如:“2016-07-15T12:58:17.136+0800”。

##索引中定义的日期格式与提交数据的日期格式要一致,否则会报错。

注: 日期将始终呈现为字符串,即使它们最初是在 JSON 文档中作为 long 串提供的。

日期格式自定义,如果没有格式指定,它会使用以下默认设置:

"strict_date_optional_time||epoch_millis"

如:

PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "date": {
          "type": "date" 
        }
      }
    }
  }
}

PUT my_index/_doc/1
{ "date": "2015-01-01" } 

PUT my_index/_doc/2
{ "date": "2015-01-01T12:10:30Z" } 

PUT my_index/_doc/3
{ "date": 1420070400001 } 

GET my_index/_search
{
  "sort": { "date": "asc"} 
}

注:sort 返回为数组,值均为毫秒时间戳

多日期格式设置

PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "date": {
          "type":   "date",
          "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
        }
      }
    }
  }
}

设置参数

  • boost 默认 1.0
  • doc_values 默认 true
  • format 默认 strict_date_optional_time||epoch_millis
  • locale
  • ignore_malformed 是否忽略非正常格式的值,默认 false,抛出异常
  • index 是否可被查询 默认 true
  • null_value 默认值 null
  • store 默认 false

常用 format

  • epoch_millis
  • epoch_second

参考

1.Date datatype | Elasticsearch Guide [6.4] | Elastic
2.format | Elasticsearch Guide [6.4] | Elastic

elasticsearch是一个基于Lucene搜索引擎构建的开源分布式搜索和分析引擎。它被广泛用于构建实时搜索、日志分析、文档存储和大数据分析等应用。 要从入门精通elasticsearch,你可以按照以下步骤进行学习: 1. 安装与配置:首先,你需要下载并安装elasticsearch。然后,你可以根据你的需求进行配置,如设置集群和节点、调整内存和磁盘限制等。 2. 索引与搜索:学习如何创建索引,将数据添加到elasticsearch中。你可以使用REST API或一些客户端库来进行索引和搜索操作。了解如何构建查询语句、使用过滤器、排序和分页等功能。 3. 映射与分析:深入了解elasticsearch的映射和分析功能。映射定义了索引中的字段类型和属性,而分析则负责对文本进行分词、处理和转换。学习如何创建自定义映射和分析器,以满足你的特定需求。 4. 聚合与分析:掌握elasticsearch的聚合功能,用于对索引中的数据进行统计、分组和计算。了解各种聚合类型,如词项聚合、范围聚合、日期直方图等,并学会使用聚合管道进行复杂的数据分析。 5. 高级特性:深入研究elasticsearch的一些高级特性,如倒排索引、分片和副本、分布式搜索、近实时搜索等。了解如何处理大规模数据集和高并发请求,以及如何优化性能和可靠性。 6. 监控与管理:学习如何监控elasticsearch集群的状态和性能,并进行适当的管理和维护工作。了解如何配置和使用监控工具,如Elasticsearch集群监控插件、Kibana等。 7. 故障排除与优化:掌握常见的elasticsearch故障排除技巧,如日志分析、错误处理和调优。学习如何识别和解决性能问题,如慢查询、内存溢出、磁盘使用过高等。 8. 生态系统与扩展:了解elasticsearch的生态系统,并探索一些常用的扩展工具和库,如Logstash、Kibana、Beats等。学习如何与其他技术栈集成,如使用elasticsearch作为后端存储的应用程序等。 以上是elasticsearch入门精通的大致路径,你可以根据自己的兴趣和需求进行深入学习和实践。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值