ES创建索引设置时间字段,配合Java对象进行插入及查询
索引创建及数据类
首先ES中要有一个索引,如果没有的话,直接往某个不存在的索引中插入数据,ES会自动分析你给出的数据,进而生成一个索引;虽然数据插入了,但是这个索引的字段(properties)可能并不是你想要的类型。例如我们插入一个对象,其中有个Java中的Date类型,那么会根据你最终给ES的数据内容,生成一个简单的属性,比如你如果给的是字符串“2024-04-15 08:00:00”,那么最终生成的字段属性就是文本(text)。所以最好是先建立索引,再插入数据。
其次我们设置一个时间字段之后,ES默认会以时间戳的方式来尝试解析你给ES的数据,那么很有可能我们给ES的数据并不是long类型的时间戳,比如我们会有使用字符串时间的可能性,这点不能完全否认。那么在此列出一种让ES解析时间字符串的方式:创建索引时,告诉ES时间字段的格式(format)
我们在这里创建某索引,其中包含一个时间字段作为例子:
PUT /new_index_name
{
"mappings": {
"properties": {
"createTime": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss"
}
}
}
}
那么向这个时间索引中插入Java对象时
你完全可以在某个class的createTime属性上设置自动格式化的注解
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
因为你配置了索引字段的format
ES可以根据你最终给出的数据来计算出正确的时间
查询时间范围
我们既然插入或者说保存了某些数据
那么我们大概率需要考虑一下查询
时间范围查询是个非常常见的需求
具体的查询语法有很多种
这里只列举一种作为举例
GET your_index_name/_search
{
"query": {
"bool": {
"must": [
{
"range": {
"createTime": {
"from": "2024-04-15 00:00:00",
"to": "2024-04-15 23:59:59",
"time_zone": "+08:00"
}
}
}
]
}
}
}
你可能注意到这里额外写了一个 time_zone 属性
是的因为Elasticsearch默认的时区是UTC
所以直接查询会导致时间范围偏移8小时
我们需要额外配置这个时区属性让ES查出正确的结果
这个在ES提供的JavaSDK中也是有相应方法的
使用方式如出一辙
在此就不多描述了
浙公网安备 33010602011771号