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點到現在的秒數
在es內部,date被轉為UTC,並被存儲為一個長整型數字,代表從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型)
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-ddTHH:mm:ss"、"yyyy-MM-ddTHH:mm:ss.SSS"、"yyyy-MM-ddTHH:mm:ss.SSSZ"格式,不支持常用的"yyyy-MM-dd HH:mm:ss"等格式。注意,"T"和"Z"是固定的字符,在獲取"yyyy-MM-ddTHH:mm:ss"、"yyyy-MM-ddTHH:mm:ss.SSS"、"yyyy-MM-ddTHH:mm:ss.SSSZ"格式字符串值時,不能直接以前面格式格式化date,而是需要多次格式化date並且拼接得到。
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" } } } } }
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"格式。