Date 字段类型 #
在 Easysearch 中,日期可以表示为以下几种形式:
- 一个长整型值,对应自纪元以来的毫秒数(必须为非负数)。日期在内部以此形式存储。
- 一个格式化的字符串。
- 一个整数值,对应自纪元以来的秒数(必须为非负数)。
要表示日期范围,可以使用 date range 字段类型。
代码样例 #
创建一个有两种日期格式的 date 字段
PUT testindex
{
"mappings" : {
"properties" : {
"release_date" : {
"type" : "date",
"format" : "strict_date_optional_time||epoch_millis"
}
}
}
}
参数说明 #
下表列出了日期字段类型支持的参数,所有参数均为可选项。
参数 | 描述 | 默认值 |
---|---|---|
boost | 浮点值,指定字段对相关性评分的权重。值大于 1.0 增加相关性,0.0 到 1.0 降低相关性。 | 1.0 |
doc_values | 布尔值,指定是否将字段存储到磁盘,以便用于聚合、排序或 script 脚本操作。 | false |
format | 用于解析日期的格式。 | strict_date_time_no_millis || strict_date_optional_time || epoch_millis |
ignore_malformed | 布尔值,指定是否忽略格式错误的值而不抛出异常。 | false |
index | 布尔值,指定字段是否可搜索。 | true |
locale | 指定基于区域和语言的日期表示格式。 | ROOT(区域和语言中立的本地设置) |
meta | 接受字段的元数据。 | |
null_value | 指定替代 null 的值,必须与字段类型一致。如果未指定,字段值为 null 时会被视为缺失值。 | null |
store | 布尔值,指定字段值是否单独存储并可从 _source 字段外检索。 | false |
格式 #
Easysearch 提供内置的日期格式,但您也可以自定义日期格式。
您可以指定多个日期格式,并使用 ||
将它们分隔开。
内置格式 #
大多数日期格式都有一个以 strict_
开头的对应格式。当格式以 strict_
开头时,日期必须严格符合格式中指定的位数要求。例如,如果格式设置为 strict_year_month_day
("yyyy-MM-dd"
),月份和日期必须是两位数字。因此,"2020-06-09"
是有效的,而 "2020-6-9"
是无效的。
Epoch 时间定义为 1970 年 1 月 1 日 00:00:00 UTC。
y:年份。
Y:基于周的年份。
M:月份。
w:年的序数周,从 01 到 53。
d:日期(天)。
D:年的序数日,从 001 到 365(闰年为 366)。
e:周的序数日,从 1(星期一)到 7(星期日)。
H:小时,从 0 到 23。
m:分钟。
s:秒。
S:秒的小数部分。
Z:时区偏移(例如,+0400;-0400;-04:00)。
数字化日期格式 #
格式名称 | 描述 | 示例 |
---|---|---|
epoch_millis | 自纪元以来的毫秒数。最小值为 -2⁶³,最大值为 2⁶³ − 1。 | 1553391286000 |
epoch_second | 自纪元以来的秒数。最小值为 -2⁶³ ÷ 1000,最大值为 (2⁶³ − 1) ÷ 1000。 | 1553391286 |
基础日期格式 #
基本日期格式的各个组成部分之间没有分隔符。例如:“20190323”。
格式名称 | 描述 | 模式和示例 |
---|---|---|
Dates | ||
basic_date_time | 基本日期和时间格式,以 T 分隔。 | "yyyyMMddTHHmmss.SSSZ" "20190323T213446.123-04:00" |
basic_date_time_no_millis | 不含毫秒的基本日期和时间格式,以 T 分隔。 | "yyyyMMddTHHmmssZ" "20190323T213446-04:00" |
basic_date | 包含四位数年份、两位数月份和两位数日期的基本格式。 | "yyyyMMdd" "20190323" |
Times | ||
basic_time | 包含小时、分钟、秒、毫秒和时区偏移的时间格式。 | "HHmmss.SSSZ" "213446.123-04:00" |
basic_time_no_millis | 不含毫秒的基本时间格式。 | "HHmmssZ" "213446-04:00" |
T times | ||
basic_t_time | 以 T 开头的基本时间格式。 | "THHmmss.SSSZ" "T213446.123-04:00" |
basic_t_time_no_millis | 以 T 开头的不含毫秒的基本时间格式。 | "THHmmssZ" "T213446-04:00" |
Ordinal dates | ||
basic_ordinal_date_time | 完整的序数日期和时间格式。 | "yyyyDDDTHHmmss.SSSZ" "2019082T213446.123-04:00" |
basic_ordinal_date_time_no_millis | 不含毫秒的完整序数日期和时间格式。 | "yyyyDDDTHHmmssZ" "2019082T213446-04:00" |
basic_ordinal_date | 包含四位数年份和三位数年内序数日期的格式。 | "yyyyDDD" "2019082" |
Week-based dates | ||
basic_week_date_time strict_basic_week_date_time | 以 T 分隔的完整周日期和时间格式。 | "YYYYWwweTHHmmss.SSSSSSSSSZ" "2019W126213446.123-04:00" |
basic_week_date_time_no_millis strict_basic_week_date_time_no_millis | 不含毫秒的基本周日期和时间格式,以 T 分隔。 | "YYYYWwweTHHmmssZ" "2019W126213446-04:00" |
basic_week_date strict_basic_week_date | 包含四位数年份、两位数周编号和一位数周内天编号的完整周日期格式,以 W 分隔。 | "YYYYWwwe" "2019W126" |
完整日期格式 #
完整日期格式的各个组成部分,日期部分使用 -
作为分隔符,时间部分使用 :
作为分隔符。 例如:"2019-03-23T21:34"
。
日期 #
格式名称 | 描述 | 模式和示例 |
---|---|---|
date_optional_time / strict_date_optional_time | 通用日期和时间格式,年份必需,月份、日期和时间可选。时间用 T 分隔。 | 多种格式:2019--03--23T21:34:46.123456789--04:00 2019-03-23T21:34:46 2019-03-23T21:34 2019 |
strict_date_optional_time_nanos | 通用日期和时间格式,年份必需,月份、日期和时间可选。如果指定时间,必须包含小时、分钟和秒;秒的小数部分可选,最多 9 位,精度为纳秒,时间用 T 分隔。 | 多种格式:2019-03-23T21:34:46.123456789-04:00 2019-03-23T21:34:46 2019 |
date_time / strict_date_time | 完整日期和时间,以 T 分隔,包含毫秒和时区偏移。 | "yyyy-MM-ddTHH:mm:ss.SSSZ" 2019-03-23T21:34:46.123-04:00 |
date_time_no_millis / strict_date_time_no_millis | 完整日期和时间,不包含毫秒,以 T 分隔。 | "yyyy-MM-dd'T'HH:mm:ssZ" 2019-03-23T21:34:46-04:00 |
datehour_minute_second_fraction / strict* | 完整日期、小时、分钟、秒以及 1 到 9 位的小数秒,以 T 分隔。 | "yyyy-MM-ddTHH:mm:ss.SSSSSSSSS" 2019-03-23T21:34:46.123456789 2019-03-23T21:34:46.1 |
datehour_minute_second_millis / strict* | 包含日期、小时、分钟、秒和 3 位毫秒,以 T 分隔。 | "yyyy-MM-ddTHH:mm:ss.SSS" 2019-03-23T21:34:46.123 |
datehour_minute_second / strict* | 包含日期、小时、分钟和秒,以 T 分隔。 | "yyyy-MM-ddTHH:mm:ss" 2019-03-23T21:34:46 |
datehour_minute / strict* | 包含日期、小时和分钟,以 T 分隔。 | "yyyy-MM-ddTHH:mm" 2019-03-23T21:34 |
datehour / strict* | 包含日期和小时,以 T 分隔。 | "yyyy-MM-ddTHH" 2019-03-23T21 |
date / strict_date | 包含年、月、日。 | "yyyy-MM-dd" 2019-03-23 |
year_month_day / strict_year_month_day | 与日期格式相同,包含年、月、日。 | "yyyy-MM-dd" 2019-03-23 |
year_month / strict_year_month | 包含年和月。 | "yyyy-MM" 2019-03 |
year / strict_year | 仅包含年份。 | "yyyy" 2019 |
rfc3339_lenient | 兼容 RFC3339 的日期格式,支持多种模式并解析速度更快。 | "2019" 2019-03 2019-03-23 2019-03-23T21:34Z 2019-03-23T21:34:46.123456789-04:00 |
时间 #
格式名称 | 描述 | 模式和示例 |
---|---|---|
time / strict_time | 两位数小时、两位数分钟、两位数秒、1 到 9 位小数秒和时区偏移。 | "HH:mm:ss.SSSSSSSSSZ" 21:34:46.123456789-04:00 21:34:46.1-04:00 |
time_no_millis / strict_time_no_millis | 两位数小时、两位数分钟、两位数秒和时区偏移,不包含毫秒。 | "HH:mm:ssZ" 21:34:46-04:00 |
hour_minute_second_fraction / strict_hour_minute_second_fraction | 两位数小时、两位数分钟、两位数秒以及 1 到 9 位小数秒。 | "HH:mm:ss.SSSSSSSSS" 21:34:46.1 21:34:46.123456789 |
hour_minute_second_millis / strict_hour_minute_second_millis | 两位数小时、两位数分钟、两位数秒以及 3 位毫秒。 | "HH:mm:ss.SSS" 21:34:46.123 |
hour_minute_second / strict_hour_minute_second | 两位数小时、两位数分钟和两位数秒。 | "HH:mm:ss" 21:34:46 |
hour_minute / strict_hour_minute | 两位数小时和两位数分钟。 | "HH:mm" 21:34 |
hour / strict_hour | 两位数小时。 | "HH" 21 |
时区 #
格式名称 | 描述 | 模式和示例 |
---|---|---|
t_time / strict_t_time | 以 T 开头的格式,包括两位数小时、两位数分钟、两位数秒、1 到 9 位小数秒和时区偏移。 | "THH:mm:ss.SSSSSSSSSZ" T21:34:46.123456789-04:00 T21:34:46.1-04:00 |
t_time_no_millis / strict_t_time_no_millis | 以 T 开头的格式,包括两位数小时、两位数分钟、两位数秒和时区偏移,不包含毫秒。 | "THH:mm:ssZ" T21:34:46-04:00 |
完整时间 #
格式名称 | 描述 | 模式和示例 |
---|---|---|
ordinal_date_time / strict_ordinal_date_time | 完整的序数日期和时间格式,以 T 分隔,包含毫秒和时区偏移。 | "yyyy-DDDTHH:mm:ss.SSSZ" 2019-082T21:34:46.123-04:00 |
ordinal_date_time_no_millis / strict_ordinal_date_time_no_millis | 完整的序数日期和时间格式,以 T 分隔,不包含毫秒,仅包含时区偏移。 | "yyyy-DDDTHH:mm:ssZ" 2019-082T21:34:46-04:00 |
ordinal_date / strict_ordinal_date | 完整的序数日期格式,包含四位数年份和三位数年内序号日期。 | "yyyy-DDD" 2019-082 |
基于周的时间 #
格式名称 | 描述 | 模式和示例 |
---|---|---|
week_date_time / strict_week_date_time | 基于周的完整日期和时间,以 T 分隔。包含四位数年份、两位数周编号、一位数周内天编号、时间和时区偏移,时间可包含 1-9 位小数秒。 | "YYYY-Www-eTHH:mm:ss.SSSSSSSSSZ" 2019-W12-6T21:34:46.1-04:00 2019-W12-6T21:34:46.123456789-04:00 |
week_date_time_no_millis / strict_week_date_time_no_millis | 基于周的完整日期和时间,以 T 分隔,不包含毫秒。包含四位数年份、两位数周编号、一位数周内天编号、时间和时区偏移。 | "YYYY-Www-eTHH:mm:ssZ" 2019-W12-6T21:34:46-04:00 |
week_date / strict_week_date | 基于周的完整日期,包含四位数年份、两位数周编号和一位数周内天编号。 | "YYYY-Www-e" 2019-W12-6 |
weekyear_week_day / strict_weekyear_week_day | 包含四位数基于周的年份、两位数周编号和一位数天编号的日期格式。 | "YYYY-'W'ww-e" 2019-W12-6 |
weekyear_week / strict_weekyear_week | 包含四位数基于周的年份和两位数周编号的日期格式。 | "YYYY-Www" 2019-W12 |
weekyear / strict_weekyear | 包含四位数基于周的年份。 | "YYYY" 2019 |
定制格式 #
您可以为日期字段创建自定义格式。例如,以下请求将日期格式指定为常见的 "MM/dd/yyyy"
格式:
PUT testindex
{
"mappings" : {
"properties" : {
"release_date" : {
"type" : "date",
"format" : "MM/dd/yyyy"
}
}
}
}
索引写入一个日期文档
PUT testindex/_doc/21
{
"release_date" : "03/21/2019"
}
在搜索精确日期时,需要使用与指定格式相同的日期格式:
GET testindex/_search
{
"query" : {
"match": {
"release_date" : {
"query": "03/21/2019"
}
}
}
}
范围查询默认使用字段的映射格式。您也可以通过提供 format
参数,以不同的格式指定日期范围:
GET testindex/_search
{
"query": {
"range": {
"release_date": {
"gte": "2019-01-01",
"lte": "2019-12-31",
"format": "yyyy-MM-dd"
}
}
}
}
日期计算 #
日期字段类型支持使用日期数学运算来指定查询中的时间段。例如,在
范围查询中的 gt
、gte
、lt
和 lte
参数,以及
日期范围聚合中的 from
和 to
参数,都可以接受日期数学表达式。
日期数学表达式包含一个固定日期,后面可以选择性地跟随一个或多个数学运算表达式。固定日期可以是 now
(自纪元以来的当前日期和时间,以毫秒为单位),或者以 ||
结尾的字符串,用于指定日期(例如,2022-05-18||
)。日期必须采用
默认格式(默认为 strict_date_time_no_millis||strict_date_optional_time||epoch_millis
)。
如果字段映射中指定了多个日期格式,Easysearch 将使用第一个格式将纪元时间值(毫秒)转换为字符串。 如果字段映射未指定格式,Easysearch 将使用
strict_date_optional_time
格式将纪元时间值转换为字符串。
日期数学运算支持以下数学运算符
运算符 | 描述 | 示例 |
---|---|---|
+ | 加法 | +1M :增加 1 个月。 |
- | 减法 | -1y :减少 1 年。 |
/ | 向下舍入 | /h :舍入到当前小时的开始。 |
日期数学运算支持以下时间单位:
y
:年M
:月w
:周d
:天h
或H
:小时m
:分钟s
:秒
示例表达式 #
以下表达式展示了日期数学运算的用法:
now+1M
:自纪元以来当前日期和时间的毫秒数加 1 个月。
2022-05-18||/M
:将日期 2022-05-18
舍入到该月份的开始,解析为 2022-05-01
。
2022-05-18T15:23||/h
:将时间 15:23
于 2022-05-18
舍入到小时的开始,解析为 2022-05-18T15
。
2022-05-18T15:23:17.789||+2M-1d/d
:将时间 15:23:17.789
于 2022-05-18
加 2 个月减 1 天,然后舍入到当天的开始,解析为 2022-07-17
。
在范围查询中使用日期运算 #
以下示例展示了在 范围查询中使用日期数学运算。
创建一个叫 release_date
的日期字段索引:
PUT testindex
{
"mappings" : {
"properties" : {
"release_date" : {
"type" : "date"
}
}
}
}
写入两个文档:
PUT testindex/_doc/1
{
"release_date": "2022-09-14"
}
PUT testindex/_doc/2
{
"release_date": "2022-11-15"
}
以下查询搜索 release_date
从 2022/09/14
的前 2 个月到后 1 天范围内的文档。最后的时间范围会被四舍五入到 2022/09/14 当天的开始时间:
GET testindex/_search
{
"query": {
"range": {
"release_date": {
"gte": "2022-09-14T15:23||/d",
"lte": "2022-09-14||+2M+1d"
}
}
}
}
返回内容包含两个文档:
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "testindex",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"release_date" : "2022-11-14"
}
},
{
"_index" : "testindex",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"release_date" : "2022-09-14"
}
}
]
}
}