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
}
}
}
}
我知道有些小伙伴看到上图就已经懵了,其实这玩意和你写的java代码没任何关系。这是es的查询语言,是放在es-head插件里面去查的写法。你根本不用管···
3 时间范围查询
3.1 简单查询示例
需求: 查询网站中最近一天的数据:
GET website/_search
{
"query": {
"range": {
"post_date": {
"gte": "now-1d/d", // 当前时间的上一天, 四舍五入到最近的一天
"lt": "now/d" // 当前时间, 四舍五入到最近的一天
}
}
}
}
我想说的开始来了:你的java代码不管用的什么方式最后es查询的方式都是用的上图的格式。query是查询的方式,range就是范围的意思,post_date是你选的es里面的哪一个属性来查询。
这里我要说的是这个值就是所谓的post_date的类型非常重要!!如果你用的这个值得类型不是date那么后面的《时间数学》表达式是不能生效的!!
3.2 关于时间的数学表达式(date-math)
Elasticsearch中时间可以表示为now
, 也就是系统当前时间, 也可以是以||
结尾的日期字符串表示.
在日期之后, 可以选择一个或多个数学表达式:
+1h
—— 加1小时;-1d
—— 减1天;/d
—— 四舍五入到最近的一天.- ****这个地方并没全部列举出来,是的,你想的没错-1M就是减一个月,-5y就是减5年。你想怎么写就怎么写,注意有大小写区分!!***
- 我举点例子:
- now-1y/d =》当前时间减一年后的时间四舍五入到最近的一天
- now+8h/M =》当前时间加8个小时,按月份算。
下面是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月.
日期缺失:你的日期中缺失哪里,es会自动给你填充初始值,初始值是1970年1月1日。
时区问题:还有个时区问题,你输入的时间和es中的时间是有时区误差的具体自己尝试判断吧
其他写法:我查看es官方文档,时间后面加||也可以加时间数学表达式,我还是举个例子吧 =》"2022.08.03||-1M/M" 这样写也是没问题的。这里说一下那个+-后面的参数值我目前没测出来有上限,应该是可以随便写的-1,-20,-50应该都是可以的。
版本原因:这里我看es文档各个版本应该都没什么问题,只有低版本的好像也在用这个格式"2022.08.03\|\|-1M/M" 多了\\,但是没什么影响。实在不放心的话去看官方吧。
官方文档如下:
更多推荐
所有评论(0)