ES--Mapping之日期时间类型

发布于:2025-03-23 ⋅ 阅读:(24) ⋅ 点赞:(0)

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