日期类型(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 并作为存储的格式。
在查询日期时,会执行下面的过程:
- 转换成 long 整形格式的范围(range) 查询
- 得到聚合的结果
- 将结果中的 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
- epoch_millis
- epoch_second
1.Date datatype | Elasticsearch Guide [6.4] | Elastic
2.format | Elasticsearch Guide [6.4] | Elastic