Elasticsearch的date類型和后端時間類型的轉換


參考:https://www.cnblogs.com/koushr/p/9498888.html

1. ES中date類型的表現形式

JSON中沒有date類型,ES中的date可以由下面3種方式表示:

  1. 格式化的date字符串,例如 "2018-01-01" 或者 "2018-01-01 12:00:00"

  2. 一個long型的數字,代表從1970年1月1號0點到現在的毫秒數

  3. 一個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_timedate_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類型

  1. 創建索引時指定date類型format為"yyyy-MM-dd HH:mm:ss",限制只能接受"yyyy-MM-dd HH:mm:ss"格式的date字符串

  2. 在代碼中把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
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM