首页 > 编程笔记 > 通用技能 阅读:2

Elasticsearch中的date日期类型(附带实例)

Elasticsearch 提供了 date 数据类型来支持基于日期的索引和搜索操作。日期字段被视为结构化数据,因此可以在排序、过滤和聚合中使用。

如果字符串值符合 ISO 8601 日期标准,Elasticsearch 会解析该值并推断其为日期。也就是说,日期值的预期格式是 yyyy-MM-dd 或 yyyy-MM-ddTHH:mm:ss(包含时间部分)。

JSON 没有日期类型,因此文档中的日期以字符串形式表示。Elasticsearch 会解析这些字符串,并以适当的方式建立索引。例如,像 "article_date":"2021-05-01" 或 "article_date": "2021-05-01T15:45:50" 这样的值会被视为日期并索引为 date 类型,因为该值符合 ISO 8601 日期标准。

与其他数据类型一样,我们可以在映射定义期间创建一个 date 类型的字段。下面的实例为航班文档创建了一个 departure_date_time 字段:
PUT flights
{
  "mappings": {
    "properties": {
      "departure_date_time":{
        "type": "date"
      }
    }
  }
}
在索引航班文档时,设置 "departure_date_time":"2021-08-06"(或带有时间部分的 "2021-08-06T05:30:00")将按预期用日期索引该文档。

注意,当索引中不存在日期字段的映射定义时,如果日期格式为 yyyy-MM-dd(ISO日期格式)或 yyyy/MM/dd(非 ISO 日期格式),Elasticsearch 会成功解析文档。然而,一旦我们为日期创建了映射定义,那么传入文档的日期格式就必须符合我们在映射定义中指定的格式。

我们可以根据实际需求更改日期的格式。除了使用默认的 ISO 格式(yyyy-MM-dd),我们还可以在创建字段时为该字段指定自定义的日期格式:
PUT flights
{
  "mappings": {
    "properties": {
      "departure_date_time":{
        "type": "date",
        "format": "dd-MM-yyyy||dd-MM-yy"   ←---  日期可以使用以下两种格式之一
      }
    }
  }
}

传入的文档现在可以将 departure_date_time 字段设置为:
"departure_date_time" :"06-08-2021"
或:
"departure_date_time" :"06-08-21"

除了以字符串形式提供日期,还可以使用数值格式——自纪元(1970 年 1 月 1 日)以来的秒数或毫秒数。以下映射定义设置了 3 种不同格式的日期:
{
  ...
  "properties": {
    "string_date":{ "type": "date", "format": "dd-MM-yyyy" },
    "millis_date":{ "type": "date", "format": "epoch_millis" },
    "seconds_date":{ "type": "date", "format": "epoch_second"}
  }
}
给定的日期在内部被转换为自纪元以来以毫秒为单位存储的 long 值,相当于 epoch_millis。

我们可以使用 range 查询来指定日期。例如,以下代码片段检索给定日期上午 5:00 至 5:30 之间计划的航班:
"range": {   ←---  range查询获取两个日期之间的文档
  "departure_date_time": {
    "gte": "2021-08-06T05:00:00",  ←---  时间范围在上午5:00至5:30之间文档
    "lte": "2021-08-06T05:30:00"
    }
}

最后,我们可以通过声明所需的格式,在单个字段上接受多种日期格式:
"departure_date_time":{
  "type": "date",
  "format": "dd-MM-yyyy||dd/MM/yyyy||yyyy-MM-dd||yyyy/MM/dd"   ←---  在字段上设置4种不同的格式
}

相关文章