一、日期格式
1.1 簡介
JSON沒有date
類型,但我們可以把以下類型作為日期時間存入ES。
類型 | 說明 |
---|---|
字符串 | 日期格式的字符串,如"2015-01-01"或"2015/01/01 12:10:30" |
長整型 | 從開始紀元(1970-01-01 00:00:00 UTC)開始的毫秒數(shù)
|
整型 | 從開始紀元(1970-01-01 00:00:00 UTC)開始的秒數(shù)
|
上面的UTC(Universal Time Coordinated) 叫做世界統(tǒng)一時間,中國大陸和 UTC 的時差是 + 8 ,也就是 UTC+8。在ES內(nèi)部,時間以毫秒數(shù)(long型)存儲,而展現(xiàn)有多種format格式。
date
的格式可以被指定的,如果沒有指定,默認“strict_date_optional_time || epoch_millis”
(strict_date_optional_time
或者epoch_millis
)。
1.2 什么是epoch_millis?
-
epoch_millis
就是從開始紀元(1970-01-01 00:00:00 UTC
)開始的毫秒數(shù)(long型)。 - 1970以前的時間也可以, 值是負數(shù)。
如下圖,2020/8/31 14:57:56
是常用的日期格式,它距離1970-01-01 00:00:00
有 1598857076000豪秒。所以可以用1598857076000表示2020/8/31 14:57:56
。
1.3 什么是strict_date_optional_time?
strict_date_optional_time
是date_optional_time
的嚴格級別,這個嚴格指的是年份、月份、天必須分別以4位、2位、2位表示,不足兩位的話第一位需用0補齊。常見格式如下:
yyyy
yyyyMM
yyyyMMdd
yyyyMMddHHmmss
yyyy-MM
yyyy-MM-dd
-
yyyy-MM-ddTHH:mm:ss
dd后面有個T
yyyy-MM-ddTHH:mm:ss.SSS
yyyy-MM-ddTHH:mm:ss.SSSZ
工作常見到是yyyy-MM-dd HH:mm:ss
,但ES默認不支持這格式,我們可以在format
里自定義支持它。上面最后一個里大寫的"Z"表示時區(qū)。
二、實驗
2.1 測試date類型
新增一個索引,設(shè)置birthday是date格式。
#ES7去掉了type,所以mappings下面一層不用寫“_doc”
PUT /test_date_index
{
"mappings":{
"properties":{
"birthday":{
"type":"date"
}
}
}
}
測試存入時間格式
PUT test_date_index/_doc/0
{
"birthday":"2020-08"
}
PUT test_date_index/_doc/1
{
"birthday":"2020-08-31"
}
PUT test_date_index/_doc/2
{
"birthday":"2020-08-31T14:32"
}
PUT test_date_index/_doc/3
{
"birthday":"2020-08-31T14:32:11"
}
PUT test_date_index/_doc/4
{
"birthday":"1598857076000"
}
#1970以前的時間也可以, 值是負數(shù)
PUT test_date_index/_doc/5
{
"birthday":"1955-08-31T14:32:11"
}
2.2 測試錯誤的格式:yyyy-MM-ddTHH:mm:s
因為秒只有1位,左側(cè)沒有補0,所以不是合法格式。
#插入yyyy-MM-ddTHH:mm:s格式
PUT test_date_index/_doc/3
{
"bithday":"2020-08-31T14:32:1"
}
結(jié)果報錯:
"type" : "illegal_argument_exception",
"reason" : "failed to parse date field [2020-08-31T14:32:1] with format [strict_date_optional_time||epoch_millis]",
2.3 測試錯誤的格式:yyyy-MM-dd HH:mm:ss
#插入yyyy-MM-dd HH:mm:ss格式
PUT /test_date_index/_doc/3
{
"birthday": "2020-03-01 16:29:41"
}
結(jié)果報錯:
"caused_by": {
"type": "illegal_argument_exception",
"reason": "Invalid format: \"2020-03-01 16:29:41\" is malformed at \" 16:29:41\""
}
#插入 yyyy-MM-ddTHH:mm:ss格式,ES返回成功
PUT /test_date_index/_doc/4
{
"birthday": "2020-03-01T16:29:41"
}
三、混合日期格式
date類型,還支持一個參數(shù)format
,它讓我們可以自己定制化日期格式。
比如format
配置了格式A||格式B||格式C
,插入一個值后,會從左往右匹配,直到有一個格式匹配上。
舉例:你想一個字段同時支持yyyy-MM-dd HH:mm:ss
、yyyy-MM-dd
、epoch_millis
這3種格式,沒有問題,只需在format
上設(shè)置這3個格式,它們在ES內(nèi)部都是按照long
類型存儲的。
#重建索引
PUT /test_date_index
{
"mappings":{
"properties":{
"birthday":{
"type":"date",
"format":"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
}
}
PUT /test_date_index/_doc/1
{
"birthday": "2020-03-01 16:29:41"
}
PUT /test_date_index/_doc/2
{
"birthday": "2020-02-29"
}
#2020/03/01 17:44:09的毫秒級時間戳
PUT /test_date_index/_doc/3
{
"birthday": 1583055849000
}
四、date_nanos,支持納秒
date
類型支持到毫秒
,如果特殊情況下用到納秒
得用date_nanos
類型。文章來源:http://www.zghlxwxcb.cn/news/detail-820191.html
#創(chuàng)建一個index,其date字段是date_nanos類型,支持納秒
PUT my_index?include_type_name=true
{
"mappings": {
"_doc": {
"properties": {
"date": {
"type": "date_nanos"
}
}
}
}
}
#和普通的date類型一樣,可以存strict_date_optional_time||epoch_millis這些格式的
#不過在es內(nèi)部是存的長整型是納秒單位的
PUT my_index/_doc/1
{ "date": "2015-01-01" }
#存一個具體到納秒的值
PUT my_index/_doc/2
{ "date": "2015-01-01T12:10:30.123456789Z" }
#存的是整型,說明是秒,換成日期就是2015/1/1 8:0:0
#但是在es內(nèi)部,會以納秒為單位的long類型存儲
PUT my_index/_doc/3
{ "date": 1420070400 }
GET my_index/_search
{
"sort": { "date": "asc"}
}
五、性能優(yōu)化
- 如果不在日期時間字段上做排序、聚合和script腳本操作,可以設(shè)置
doc_value
為false。 - 如果不在日期時間字段上做檢索,只是做展示用,可以設(shè)置
index
為false。
如果本文對您有幫助,就給亞瑟王點個贊??吧文章來源地址http://www.zghlxwxcb.cn/news/detail-820191.html
到了這里,關(guān)于【Elasticsearch教程11】Mapping字段類型之日期時間date date_nanos的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!