es查询时间long转date_ES 22 - Elasticsearch中如何进行日期(数值)范围查询

本文介绍了如何在Elasticsearch中进行日期和数值范围查询,包括符号含义、时间数学表达式、日期格式化和时区调整。示例展示了如何查询最近一天发布的博客和价格在40至80的商品。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 范围查询的符号

符号

含义

gte

greater-than or equal to, 大于或等于

gt

greater-than, 大于

lte

less-than or equal to, 小于或等于

lt

less-than, 小于

2 数值范围查询

需求: 查询商品中40 <= price <= 80的文档:

GET book_shop/_search

{

"query": {

"range": {

"price": {

"gte": 40,

"lte": 80,

"boost": 2.0// 设置得分的权重值(提升值), 默认是1.0

}

}

}

}

3 时间范围查询

3.1 简单查询示例

需求: 查询网站中最近一天发布的博客:

GET website/_search

{

"query": {

"range": {

"post_date": {

"gte": "now-1d/d",// 当前时间的上一天, 四舍五入到最近的一天

"lt": "now/d"// 当前时间, 四舍五入到最近的一天

}

}

}

}

3.2 关于时间的数学表达式(date-math)

Elasticsearch中时间可以表示为now, 也就是系统当前时间, 也可以是以||结尾的日期字符串表示.

在日期之后, 可以选择一个或多个数学表达式:

+1h —— 加1小时;

-1d —— 减1天;

/d —— 四舍五入到最近的一天.

下面是Elasticsearch支持数学表达式的时间单位:

表达式

含义

表达式

含义

y

M

w

星期

d

h

小时

H

小时

m

分钟

s

说明: 假设系统当前时间now = 2018-10-01 12:00:00 :

now+1h: now的毫秒值 + 1小时, 结果是: 2018-10-01 13:00:00.

now-1h: now的毫秒值 - 1小时, 结果是: 2018-10-01 11:00:00.

now-1h/d: now的毫秒值 - 1小时, 然后四舍五入到最近的一天的起始, 结果是: 2018-10-01 00:00:00.

2018.10.01||+1M/d: 2018-10-01的毫秒值 + 1月, 再四舍五入到最近一天的起始, 结果是: 2018-11-01 00:00:00.

3.3 关于时间的四舍五入

对日期中的日、月、小时等 进行四舍五入时, 取决于范围的结尾是包含(include)还是排除(exclude).

向上舍入: 移动到舍入范围的最后一毫秒;

向下舍入: 一定到舍入范围的第一毫秒.

举例说明:

① "gt": "2018-12-18||/M" —— 大于日期, 需要向上舍入, 结果是2018-12-31T23:59:59.999, 也就是不包含整个12月.

② "gte": "2018-12-18||/M" —— 大于或等于日期, 需要向下舍入, 结果是 2018-12-01, 也就是包含整个12月.

③ "lt": "2018-12-18||/M" —— 小于日期, 需要向上舍入, 结果是2018-12-01, 也就是不包含整个12月.

④ "lte": "2018-12-18||/M" —— 小于或等于日期, 需要向下舍入, 结果是2018-12-31T23:59:59.999, 也就是包含整个12月.

4 日期格式化范围查询(format)

格式化日期查询时, 将默认使用日期field中指定的格式进行解析, 当然也可以通过format参数来覆盖默认配置.

示例:

GET website/_search

{

"query": {

"range": {

"post_date": {

"gte": "2/1/2018",

"lte": "2019",

"format": "dd/MM/yyyy||yyyy"

}

}

}

}

注意: 如果日期中缺失了部分年、月、日, 缺失的部分将被填充为unix系统的初始值, 也就是1970年1月1日.

比如, 将dd指定为format, 像"gte": 10将转换为1970-01-10T00:00:00.000Z.

5 时区范围查询(time_zone)

如果日期field的格式允许, 也可以通过在日期值本身中指定时区, 从而将日期从另一个时区的时间转换为UTC时间, 或者为其指定特定的time_zone参数.

示例:

GET website/_search

{

"query": {

"range": {

"post_date": {

"gte": "2018-01-01 00:00:00",

"lte": "now",

"format": "yyyy-MM-dd hh:mm:ss",

"time_zone": "+1:00"

}

}

}

}

ES中的日期类型必须按照UTC时间格式存储, 所以, 上述的2018-01-01 00:00:00将被转换为2017-12-31T23:00:00 UTC.

另外需要注意的是, now是不受time_zone影响的.

版权声明

感谢阅读, 如果文章有帮助或启发到你, 点个[好文要顶👆] 或 [推荐👍] 吧😜

本文版权归博主所有, 欢迎转载, 但 [必须在文章页面明显位置标明原文链接], 否则博主保留追究相关人员法律责任的权利.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值