Elasticsearch数据类型

Scroll Down

1.Elasticsearch数据存储形式

Elasticsearch中的文档以JSON进行存储。

2.数据类型

2.1.Date类型

参考文档:https://www.elastic.co/guide/en/elasticsearch/reference/6.5/date.html

由于JSON没有date类型,所以ES有以下几种形式:

  1. 格式化的时间字符串:“2015-01-01”、“2015/01/01 12:10:30”。
  2. 秒、毫秒时间戳。

ES内部会根据时区将时间转换为UTC,并以long类型的毫秒时间戳存储

对时间类型进行查询时,ES会把query中的时间转为long类型的时间戳进行范围查询(range)。查询结果会按时间字段的格式转回字符串进行显示,且日期字段返回的都是字符串(格式化时间、时间戳)

2.1.1.指定时间格式

时间类型的字段,可以在mapping中指定format来配置时间格式。支持多种时间格式,中间用||分隔。查询时,数据会按各自匹配的格式进行显示。毫秒时间戳会格式化为第一种格式进行显示

PUT my_index
{
  "mappings": {
    "myType": {
      "properties": {
        "date": {
          "type":   "date",
          "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
        }
      }
    }
  }
}

不指定format时,时间字段默认格式为strict_date_optional_time||epoch_millis同时支持格式化字符串和毫秒时间戳。

2.1.2.插入数据

PUT myIndex/myType/1
{ "date": "2015-01-01" }

PUT myIndex/myType/3
{ "date": 1420070400001 }

PUT myIndex/myType/2
{ "date": "2015-01-01T12:10:30Z" }

2.1.3.排序

可以指定sort来对时间字段进行排序

GET /myIndex/_search
{
  "sort": { "date": "asc"}
}

排序的结果中,sort内返回的时间是毫秒时间戳,不会进行格式化

"hits" : [
      {
        "_index" : "myIndex",
        "_type" : "type",
        "_id" : "wXGLZoEBxPuH796bBird",
        "_score" : null,
        "_source" : {
          "date" : "2022-05-01"
        },
        "sort" : [
          1651363200000
        ]
      }