ES--Mapping之日期时间类型
原文网址:ES--Mapping之日期时间类型-CSDN博客
简介
本文介绍ElasticSearch的Mapping之日期时间类型。
官网地址:format | Elasticsearch Guide [8.17] | Elastic
类型概述
在ES里,date的格式可以被指定的,如果没有指定,默认是:“strict_date_optional_time || epoch_millis”(strict_date_optional_time或者epoch_millis)。
epoch_millis
epoch_millis就是从开始纪元(1970-01-01 00:00:00 UTC)开始的毫秒数(long型)。1970以前的时间也可以,值是负数。
如:2020/8/31 14:57:56是常用的日期格式,它距离1970-01-01 00:00:00 有 1598857076000豪秒。所以可以用1598857076000表示2020/8/31 14:57:56。
strict_date_optional_time
strict_date_optional_time是date_optional_time的严格级别,这个严格指的是:年、月、日必须以4位、2位、2位表示,不足两位的话第一位需用0补齐。常见格式如下:
- yyyy
- yyyyMM
- yyyyMMdd
- yyyyMMddHHmmss
- yyyy-MM
- yyyy-MM-dd
- yyyy-MM-dd'T'HH:mm:ss dd
- yyyy-MM-dd'T'HH:mm:ss.SSS
- yyyy-MM-dd'T'HH:mm:ss.SSSZ
Z"表示时区,例:
东八区:2025-03-03T21:41:43.026+0800;2025-03-03T21:41:43.026+08:00;
如果以2025-03-03T21:41:43.026+0800写入ES,ES里最终是这种结构:2025-03-03T13:41:43.026Z。也就是说:ES会以0时区去存!
指定日期格式
如果插入了不支持的日期格式,就会报错,比如,插入2025-03-03 19:17:43,报错信息为:Elasticsearch exception [type=illegal_argument_exception, reason=failed to parse date field [2025-03-03 19:17:43] with format [strict_date_optional_time||epoch_millis]]
解决方法是,修改ES的索引定义,支持更多日期格式,例如:
PUT /test_date_index
{
"mappings":{
"properties":{
"birthday":{
"type":"date",
"format":"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||strict_date_optional_time||epoch_millis"
}
}
}
}
上边这个请求,就把test_data_index这个索引的birthday字段进行了修改,支持多种格式。
kibana里边,可以指定时间字段,用于筛选和排序等:
如果时间字段对不上,那么右上角会没有时间筛选按钮!
代码写法
如果要在Java代码里指定时间格式,这样写:
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone="GMT+8")
@Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private OffsetDateTime logTime;
字符含义大全
ES由java语言编写,里面使用的java中的时间日期格式类如下:
(这是Java里DateTimeFormatter类的一段注释)
Symbol | Meaning | Presentation | Examples |
G | era | text | AD; Anno Domini; A |
u | year | year | 2004; 04 |
y | year-of-era | year | 2004; 04 |
D | day-of-year | number | 189 |
M/L | month-of-year | number/text | 7; 07; Jul; July; J |
d | day-of-month | number | 10 |
Q/q | quarter-of-year | number/text | 3; 03; Q3; 3rd quarter |
Y | week-based-year | year | 1996; 96 |
w | week-of-week-based-year | number | 27 |
W | week-of-month | number | 4 |
E | day-of-week | text | Tue; Tuesday; T |
e/c | localized day-of-week | number/text | 2; 02; Tue; Tuesday; T |
F | week-of-month | number | 3 |
a | am-pm-of-day | text | PM |
h | clock-hour-of-am-pm (1-12) | number | 12 |
K | hour-of-am-pm (0-11) | number | 0 |
k | clock-hour-of-am-pm (1-24) | number | 0 |
H | hour-of-day (0-23) | number | 0 |
m | minute-of-hour | number | 30 |
s | second-of-minute | number | 55 |
S | fraction-of-second | fraction | 978 |
A | milli-of-day | number | 1234 |
n | nano-of-second | number | 987654321 |
N | nano-of-day | number | 1234000000 |
V | time-zone ID | zone-id | America/Los_Angeles; Z; -08:30 |
z | time-zone name | zone-name | Pacific Standard Time; PST |
O | localized zone-offset | offset-O | GMT+8; GMT+08:00; UTC-08:00; |
X | zone-offset ‘Z’ for zero | offset-X | Z; -08; -0830; -08:30; -083015; -08:30:15; |
x | zone-offset | offset-x | +0000; -08; -0830; -08:30; -083015; -08:30:15; |
Z | zone-offset | offset-Z | +0000; -0800; -08:00; |
p | pad next | pad modifier | 1 |
' | escape for text | delimiter | |
'' | single quote | literal ‘ | |
[ | optional section start | ||
] | optional section end | ||
# | reserved for future use | ||
{ | reserved for future use | ||
} | reserved for future use |