Elasticsearch日期类型、常见时区问题

Date datatype

简介

存储格式

JSON 本身没有date类型,Elasticsearch将设置了时区的date转换为UTC时间,将没有设置时区的date直接设置为UTC时间,以long型时间戳存储。

查询统计

date类型查询,将date转换为long型时间戳查询;

date类型聚合,返回结果格式化date字符串;

ElasticSearch查询、存储,将date类型转换为UTC long型时间戳。

相同格式存储、查询(同是时间戳或同是格式化字符串),查询时间一致;查询、存储格式不一致,相差8个小时(GMT+08:00与UTC之间相差8小时)

示例

索引

PUT date_index { "settings": { "number_of_shards": 1, "number_of_replicas": 0 }, "mappings": { "test": { "properties": { "date": { "type": "date" } } } } }

查询

格式化date存储,时间戳查询

格式化date存储

POST /_bulk {"index":{"_index":"date_index","_type":"test", "_id":"1"}} {"date":"2020-01-01T00:00:00Z"} {"index":{"_index":"date_index","_type":"test", "_id":"2"}} {"date":"2020-01-01T08:00:00Z"} {"index":{"_index":"date_index","_type":"test", "_id":"3"}} {"date":"2020-01-01T16:00:00Z"} {"index":{"_index":"date_index","_type":"test", "_id":"4"}} {"date":"2020-01-01T23:00:00Z"} {"index":{"_index":"date_index","_type":"test", "_id":"5"}} {"date":"2020-01-02T00:00:00Z"} {"index":{"_index":"date_index","_type":"test", "_id":"6"}} {"date":"2020-01-02T08:00:00Z"} {"index":{"_index":"date_index","_type":"test", "_id":"7"}} {"date":"2020-01-02T16:00:00Z"} {"index":{"_index":"date_index","_type":"test", "_id":"8"}} {"date":"2020-01-02T23:00:00Z"}

时间戳查询

2020-01-01T16:00:00Z(UTC时间 = 东八区-8)

= 2020-01-02 00:00:00(默认东八区时间)

= 2020-01-02T00:00:00Z+08:00(东八区时间)

= 1577894400000

存储格式date类型转换为long型时间戳,查询格式date为long型时间戳,东八区时间戳和UTC时间戳相差8小时

request

POST date_index/_search { "query": { "range": { "date": { "gte": "1577894400000" } } }, "size": 1 }

response

{ "_index" : "date_index", "_type" : "test", "_id" : "3", "_score" : 1.0, "_source" : { "date" : "2020-01-01T16:00:00Z" } }

时间戳存储、格式化date查询

时间戳存储

POST /_bulk {"index":{"_index":"date_index","_type":"test", "_id":"1"}} {"date":"1577980800000"} {"index":{"_index":"date_index","_type":"test", "_id":"2"}} {"date":"1578009600000"} {"index":{"_index":"date_index","_type":"test", "_id":"3"}} {"date":"1578038400000"} {"index":{"_index":"date_index","_type":"test", "_id":"4"}} {"date":"1578063600000"} {"index":{"_index":"date_index","_type":"test", "_id":"5"}} {"date":"1578067200000"} {"index":{"_index":"date_index","_type":"test", "_id":"6"}} {"date":"1578096000000"} {"index":{"_index":"date_index","_type":"test", "_id":"7"}} {"date":"1578124800000"} {"index":{"_index":"date_index","_type":"test", "_id":"8"}} {"date":"1578150000000"}

格式化查询

request

POST date_index/_search { "query": { "range": { "date": { "gte": "2020-01-04T00:00:00Z" } } } }

response

{ "_index" : "date_index", "_type" : "test", "_id" : "6", "_score" : 1.0, "_source" : { "date" : "1578096000000" } }

1578096000000

= 2020-01-04 08:00:00(默认东八区时间)

= 2020-01-04T08:00:00Z+08:00(默认东八区时间)

=2020-01-04T00:00:00Z(UTC时间)

聚合

Elasticserch内存存储都是long型时间戳、UTC时间,想要获取本地时区的统计信息需要指定时区。

request

POST date_index/_search { "size": 0, "aggs": { "by_day": { "date_histogram": { "field": "date", "interval": "day", "time_zone": "+08:00" } } } }

response

{ "by_day" : { "buckets" : [ { "key_as_string" : "2020-01-01T00:00:00.000+08:00", "key" : 1577808000000, "doc_count" : 2 }, { "key_as_string" : "2020-01-02T00:00:00.000+08:00", "key" : 1577894400000, "doc_count" : 4 }, { "key_as_string" : "2020-01-03T00:00:00.000+08:00", "key" : 1577980800000, "doc_count" : 2 } ] } }

参考资料

https://www.elastic.co/guide/en/elasticsearch/reference/current/date.html

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值