Date 字段类型
> 文档中心 > 文档中心 > INFINI Easysearch > 功能手册 > 文档建模 > 字段类型 > 日期字段类型 > Date 字段类型

Date 字段类型 #

在 Easysearch 中,日期可以表示为以下几种形式:

  1. 一个长整型值,对应自纪元以来的毫秒数(必须为非负数)。日期在内部以此形式存储。
  2. 一个格式化的字符串。
  3. 一个整数值,对应自纪元以来的秒数(必须为非负数)。

要表示日期范围,可以使用 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_timeT 开头的格式,包括两位数小时、两位数分钟、两位数秒、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_millisT 开头的格式,包括两位数小时、两位数分钟、两位数秒和时区偏移,不包含毫秒。"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"
      }
    }
  }
}

日期计算 #

日期字段类型支持使用日期数学运算来指定查询中的时间段。例如,在 范围查询中的 gtgteltlte 参数,以及 日期范围聚合中的 fromto 参数,都可以接受日期数学表达式。

日期数学表达式包含一个固定日期,后面可以选择性地跟随一个或多个数学运算表达式。固定日期可以是 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:天 hH:小时 m:分钟 s:秒

示例表达式 #

以下表达式展示了日期数学运算的用法:

now+1M:自纪元以来当前日期和时间的毫秒数加 1 个月。

2022-05-18||/M:将日期 2022-05-18 舍入到该月份的开始,解析为 2022-05-01

2022-05-18T15:23||/h:将时间 15:232022-05-18 舍入到小时的开始,解析为 2022-05-18T15

2022-05-18T15:23:17.789||+2M-1d/d:将时间 15:23:17.7892022-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_date2022/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"
        }
      }
    ]
  }
}