ElasticSearch时间类型的坑!究竟如何选择使用的格式?
在使用 ElasticSearch 作为数据存储时,日期字段常常是我们进行查询和分析的关键数据之一。尤其是在处理时间戳时,ElasticSearch 提供了灵活的时间格式支持,可以处理多种不同的时间格式。本文将探讨当设置多个时间格式时,ElasticSearch 是如何决定使用哪个格式的,并分析可能出现的潜在问题。
ElasticSearch 时间字段的定义
在 ElasticSearch 中,时间字段通常会定义为 date
类型。这种类型允许我们指定时间格式,帮助 ElasticSearch 解析并存储时间数据。通过 mappings
来定义时间字段时,可以指定一个或多个时间格式。
支持的常用时间格式
ElasticSearch 支持多种时间格式,使得我们可以方便地处理各种不同来源的数据。常见的几种时间格式包括:
1. yyyy-MM-dd HH:mm:ss
这种格式表示一个具体的时间点,包括年月日、小时、分钟、秒。例如,2022-03-15 12:30:45
。
2. yyyy-MM-dd
这种格式只包含年月日,不包括具体的时间部分。例如,2022-03-15
。
3. epoch_millis
epoch_millis
表示毫秒级的时间戳,指从 1970-01-01 00:00:00 UTC
到当前时间的毫秒数。例如,1672531200000
表示 2023-01-01 00:00:00 UTC
。
4. epoch_second
epoch_second
表示秒级的时间戳,指从 1970-01-01 00:00:00 UTC
到当前时间的秒数。例如,1672531200
表示 2023-01-01 00:00:00 UTC
。
如何设置多个格式
在 ElasticSearch 中,可以通过在 mappings
中为日期字段指定多个格式,来支持不同的时间表示方式。通过使用 ||
运算符,可以将多个格式结合起来,ElasticSearch 会尝试按顺序匹配每个格式。
以下是一个完整的例子,展示了如何为日期字段设置多个格式:
在这个配置中这个字段支持了四种时间格式:
-
1.
yyyy-MM-dd HH:mm:ss
-
2.
yyyy-MM-dd
-
3.
epoch_millis
(毫秒级时间戳) -
4.
epoch_second
(秒级时间戳)
ElasticSearch 如何选择时间格式
那么如果当我们写入一个时间戳,到底使用的是epoch_millis
还是epoch_second
呢?
在这里很多朋友可能说,10 位的时间戳是epoch_second
秒级时间戳,13 位的是epoch_millis
毫秒级时间戳。
那么问题来了,当我们写入 1 时,它算哪个类型呢?
先说结论:实际它不是按照位数判断的,当向 ElasticSearch 中写入时间数据时,它会按照配置的格式顺序进行匹配,找到第一个符合格式的规则进行解析。
我们来实际验证一下
写入一条数据
POST /example_index/_doc{ "first_login_time": 1672531200}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">
评论记录:
回复评论: