ES 22 - Elasticsearch中如何进行日期(数值)范围查询
Posted shoufeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES 22 - Elasticsearch中如何进行日期(数值)范围查询相关的知识,希望对你有一定的参考价值。
目录
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
影响的.
参考资料
版权声明
出处: 博客园 马瘦风的博客(https://www.cnblogs.com/shoufeng)
感谢阅读, 如果文章有帮助或启发到你, 点个[好文要顶??] 或 [推荐??] 吧??
本文版权归博主所有, 欢迎转载, 但 [必须在文章页面明显位置标明原文链接], 否则博主保留追究相关人员法律责任的权利.
以上是关于ES 22 - Elasticsearch中如何进行日期(数值)范围查询的主要内容,如果未能解决你的问题,请参考以下文章