一直對 elasticsearch 中的 date 類型認識比較模糊,並且在使用中又比較常見,此次決定多花些時間,完全弄懂它,但願能對用到的同窗提供幫助。html
注意:本文測試使用是 elasticsearch 6.3 版本,其餘版本規則可能有所變化,如遇到不兼容的狀況,還請參考 官方文檔git
elasticsearch 數據是以 JSON 格式存儲的,而 JSON中是並無 date 數據類型,所以 Elasticsearch 中雖然有 date 類型,但在展現時卻要轉化成另外的格式。json
date 類型在 Elasticsearch 展現的格式有下面幾種:api
後兩種的描述裏都包含 UTC ,什麼是 UTC 呢?app
UTC(Universal Time Coordinated) 叫作世界統一時間,中國大陸和 UTC 的時差是 + 8 ,也就是 UTC+8。elasticsearch
不論 date 是什麼展現格式,在 Elasticsearch 內部存儲時都是轉換成 UTC,而且把時區也會計算進去,從而獲得 milliseconds-since-the-epoch 並做爲存儲的格式。ide
在查詢日期時,會執行下面的過程:測試
Date 的格式化類型是能夠經過 format 來指定的,若是沒有指定,就會使用默認的格式:ui
"strict_date_optional_time||epoch_millis"
這表示什麼意思呢?翻譯
先來弄懂 strict_date_optional_time
A generic ISO datetime parser where the date is mandatory and the time is
optional. Full details here.
這是 elasticsearch 官網的解釋,表示只要是 ISO datetime parser 能夠正常解析的都是 strict_date_optional_time。都有哪些語法呢?
date-opt-time = date-element ['T' [time-element] [offset]] date-element = std-date-element | ord-date-element | week-date-element std-date-element = yyyy ['-' MM ['-' dd]] ord-date-element = yyyy ['-' DDD] week-date-element = xxxx '-W' ww ['-' e] time-element = HH [minute-element] | [fraction] minute-element = ':' mm [second-element] | [fraction] second-element = ':' ss [fraction] fraction = ('.' | ',') digit+
其中中括號內的都是可選的,可填可不填。以 std-date_element 舉個例子
2018-11-19 2018 2018-11
上面 3 種格式都知足要求。
除了 strict_date_optional_time ,還能夠是 epoch_millis 格式,即 epoch 以來的毫秒數。
舉個例子
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"}
上面的 PUT 請求中的 date 數據均知足默認的要求。
同一個 date 字段能夠指定多個 date 格式,只要使用 ||
分隔就能夠了。在索引,都會對 date 格式挨個進行匹配,直到找到匹配的格式爲止。
若是存儲時 date 格式爲 milliseconds-since-the-epoch ,在查詢時會將其轉換爲指定的第一個 date 格式。
舉個例子,有興趣的同窗可在 sense 中動手實踐下。
PUT my_index { "mappings": { "doc": { "properties": { "date": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" } } } } } PUT /my_index/doc/1 { "date": "2018-09-24 19:23:45" } PUT /my_index/doc/2 { "date": "2018-09-25" } GET my_index/_search { "query": { "match_all": {} } }
本文主要講解了 elsaticserach 中的 date 類型格式,語法及轉換過程。elasticsearch 中存儲 date 類型統一使用 milliseconds-since-the-epoch 格式,展現時根據不一樣格式而區分。