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 字段:
注意,当索引中不存在日期字段的映射定义时,如果日期格式为 yyyy-MM-dd(ISO日期格式)或 yyyy/MM/dd(非 ISO 日期格式),Elasticsearch 会成功解析文档。然而,一旦我们为日期创建了映射定义,那么传入文档的日期格式就必须符合我们在映射定义中指定的格式。
我们可以根据实际需求更改日期的格式。除了使用默认的 ISO 格式(yyyy-MM-dd),我们还可以在创建字段时为该字段指定自定义的日期格式:
传入的文档现在可以将 departure_date_time 字段设置为:
除了以字符串形式提供日期,还可以使用数值格式——自纪元(1970 年 1 月 1 日)以来的秒数或毫秒数。以下映射定义设置了 3 种不同格式的日期:
我们可以使用 range 查询来指定日期。例如,以下代码片段检索给定日期上午 5:00 至 5:30 之间计划的航班:
最后,我们可以通过声明所需的格式,在单个字段上接受多种日期格式:
如果字符串值符合 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种不同的格式 }
相关文章
- Elasticsearch date_range类型的用法(附带实例)
- Elasticsearch分页查询的2种实现方式
- Elasticsearch bool查询的用法(附带实例)
- Elasticsearch must子句的用法(附带实例)
- Elasticsearch keyword、constant_keyword和wildcard类型的用法(附带实例)
- Elasticsearch介绍(非常详细)
- Elasticsearch是什么(非常详细)
- Elasticsearch到底是什么(非常详细)
- Elasticsearch使用QueryBuilder查询(附带实例)
- Elasticsearch聚合查询详解(附带实例)