參考:https://www.cnblogs.com/koushr/p/9498888.html
1. ES中date類型的表現形式
JSON中沒有date類型,ES中的date可以由下面3種方式表示:
-
格式化的date字符串
,例如 "2018-01-01" 或者 "2018-01-01 12:00:00" -
一個
long型的數字
,代表從1970年1月1號0點到現在的毫秒數
-
一個
integer型的數字
,代表從1970年1月1號0點到現在的秒數
2. ES中date類型的存儲形式
在ES內部,date被轉為UTC(UTC是世界統一之間,中國與該時間存在8小時時差)並被存儲為一個長整型數字
,代表從1970年1月1號0點到現在的毫秒數
date類型字段上的查詢
會在內部被轉為對long型值的范圍查詢,查詢的結果類型是字符串
。
假如插入的時候,值是"2018-01-01",則返回"2018-01-01"
假如插入的時候,值是"2018-01-01 12:00:00",則返回"2018-01-01 12:00:00"
假如插入的時候,值是1514736000000,則返回"1514736000000"。(進去是long型,出來是String型)
3. ES中對date類型格式化
date 格式可以在 put mapping 的時候用 format 參數指定,如果不指定的話,則啟用默認格式。
默認格式是"strict_date_optional_time||epoch_millis"
。這表明只接受符合"strict_date_optional_time"
格式的字符串值,或者long型數字。
strict_date_optional_time
是date_optional_time
的嚴格級別,這個嚴格指的是年份、月份、天必須分別以4位、2位、2位表示,不足兩位的話第一位需用0補齊。不滿足這個格式的日期字符串是放不進es中的。
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+
實測后:
僅支持"yyyy-MM-dd"、"yyyyMMdd"、"yyyyMMddHHmmss"、"yyyy-MM-dd HH:mm:ss"、"yyyy-MM-ddTHH:mm:ss"、"yyyy-MM-ddTHH:mm:ss.SSS"、"yyyy-MM-ddTHH:mm:ss.SSSZ"格式。
epoch_millis
約束值必須大於等於Long.MIN_VALUE
,小於等於Long.MAX_VALUE
date類型字段除了type參數必須指定為date外,還有一個常用的參數 format 。可以通過該參數來顯式指定ES接受的date格式,如果有多個的話,多個date格式需用||分隔。之后index/create/update操作時,將依次匹配,如果匹配到合適的格式,則會操作成功,並且查詢時,該文檔該字段也會以該格式展示。否則,操作不成功。如
PUT my_index
{
"mappings": {
"_doc": {
"properties": {
"updated_date": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
}
}
}
4. Java操作ES date類型
-
創建索引時指定date類型
format為"yyyy-MM-dd HH:mm:ss"
,限制只能接受"yyyy-MM-dd HH:mm:ss"格式的date字符串 -
在代碼中把Date實例或者LocalDateTime實例先轉化為 "yyyy-MM-dd HH:mm:ss"格式的字符串后再存進去,這樣取出來時也是"yyyy-MM-dd HH:mm:ss"格式。
使用Springboot注解實操:
@Field(type = FieldType.Date,
format = DateFormat.custom,
pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING,
pattern = "yyyy-MM-dd HH:mm:ss",
timezone = "GMT+8")
private LocalDateTime createdTime;
將對象實例存入ES中:
CustomFile customFile = new CustomFile();
……
customFile.setCreatedTime(LocalDateTime.now());
……
fileRepository.save(customFile); // 將該對象保存到ES中
在Kibana中查詢插入結果:
{
"_index" : "custom_file",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"id" : "1",
"fileName" : "第一個文件.doc",
"fileContent" : "##########",
"createdTime" : "2020-10-06 17:20:21",
"deleted" : false
}
}