Elasticsearch: date时间数据格式踩过的坑

1. 默认情况下

时间格式是可以自定义的,但是如果没有指定一个格式,它将使用默认的格式(时间格式里面必须包含年份,并且时间中的时分秒是可选的),例如格式:yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ or yyyy-MM-dd
说明一下:T表示分隔符,Z表示UTC世界标准时间,在标准时间上加8小时,就是北京时间
举例

#索引创建
PUT /my_test
{
  "mappings": {
    "properties": {
      "my_time":{
        "type": "date"
      }
    }
  }
}
#正确
PUT /my_test/_doc/1
{
  "my_time":"2015-01-01"
}
#正确
PUT /my_test/_doc/2
{
  "my_time":"2015-01-01T12:10:30Z"
}
#正确
PUT /my_test/_doc/3
{
  "my_time":"1420070400001"
}
#正确
PUT /my_test/_doc/4
{
  "my_time":"2015"
}
#错误
PUT /my_test/_doc/5
{
  "my_time":"2015-01-01 12:10:30"
}

2. 指定多个数据格式

#索引创建
PUT /my_test
{
  "mappings": {
    "properties": {
      "my_time":{
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||yyyyMMdd"
      }
    }
  }
}
#正确
PUT /my_test/_doc/1
{
  "my_time":"2015-05-05 23:10:30"
}
#正确
PUT /my_test/_doc/2
{
  "my_time":"2015-01-01 12:10:30"
}
#正确
PUT /my_test/_doc/3
{
  "my_time":"2016-01-01 12:10:30"
}
#正确
PUT /my_test/_doc/4
{
  "my_time":"20170228"
}
#正确
PUT /my_test/_doc/5
{
  "my_time":null
}

3. 执行查询

使用es执行range在date类型字段上的查询

  1. 假设当前时间为:2022-10-26 15:46:00
  2. es中有一条时间字段为2022-10-26 15:46:00的数据
  3. 使用range进行搜索近半年的数据,语句如下
GET /my_test/_search
{
  "sort": [
    {
      "_id": {
        "order": "asc"
      }
    }
  ], 
  "query": {
    "range": {
      "my_time": {
        "gte": "2022-10-26 15:46:00||-6M",
        "lte": "2022-10-26 15:46:00"
      }
    }
  }
}

详细参考:https://www.elastic.co/guide/en/elasticsearch/reference/7.12/query-dsl-range-query.html

猜你喜欢

转载自blog.csdn.net/qq_39198749/article/details/127532364