原文网址: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 |