Elasticsearch语法知多少之Range query
熟悉ES范围查询,重点列举一些对日期和时间搜索的案例,旨在解决UTC和东八区的时区问题,精确定义时间范围。通过这些案例熟悉范围查询所使用的参数和注意事项。
目录
目标
熟悉ES范围查询,重点列举一些对日期和时间搜索的案例,旨在解决UTC和东八区的时区问题,精确定义时间范围。通过这些案例熟悉范围查询所使用的参数和注意事项。
ES版本信息
7.17.5
官方文档
Range Queryhttps://www.elastic.co/guide/en/elasticsearch/reference/7.17/query-dsl-range-query.html
相关术语
now
按照UTC时间格式的系统当前时间。UTC格式的时间比东八区(北京时间)慢8小时。例如:
东八区(北京时间) | UTC时间(now) |
2022-08-07 23:45:00 | 2022-08-07 15:45:00 |
from&to
可以用form和to进行范围搜索,from表示开始时间,to表示结束时间。特别注意:from是闭区间,等价于>=;to是开区间,等价于<。
gt>e<<e
- gt表示大于;
- gte表示大于或等于;
- lt表示小于;
- lte表示小于或等于。
创建相关的索引和文档(数据用于实战案例)
创建索引
PUT /date_db
{
"mappings": {
"properties": {
"createTime": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss"
},
"createDate": {
"type": "date",
"format": "yyyy-MM-dd"
},
"birthday": {
"type": "date",
"format": "MM-dd"
}
}
}
}
索引文档
PUT /date_db/_bulk
{"index":{"_id":"1"}}
{"birthday":"01-01","createTime":"2022-08-01 00:00:00","createDate":"2022-08-01"}
{"index":{"_id":"2"}}
{"birthday":"08-01","createTime":"2022-08-02 23:59:59","createDate":"2022-08-02"}
{"index":{"_id":"3"}}
{"birthday":"12-01","createTime":"2022-08-08 23:59:59","createDate":"2022-08-08"}
{"index":{"_id":"4"}}
{"birthday":"05-01","createTime":"2022-07-31 00:00:00","createDate":"2022-07-31"}
实战
基本语法
需求一:查询年龄在9-10之间(包含9和10)的文档。
GET /stu_db/_search
{
"query": {
"range": {
"age": {
"gte": 9,
"lte": 10
}
}
}
}
需求二:查询年龄在8-10之间(不包含8和10)的文档。
GET /stu_db/_search
{
"query": {
"range": {
"age": {
"gt": 8,
"lt": 10
}
}
}
}
检查时间范围的方法
问题&方法:query查询的结果集中并没有说明查询的时间范围,这对于不熟悉UTC时间格式的同学来说很不友好,但是在ES聚合时间查询的结果集中就有字段描述了时间范围。
案例:查询两年前的数据,时间范围精确到天。假如今天是2022-09-06,则查询的时间范围:2020-09-06<=时间范围<2021-09-06。
GET /date_db/_search
{
"size": 0,
"aggs": {
"range": {
"date_range": {
"field": "createTime",
"ranges": [
{
"from": "now+8h-2y/d",
"to": "now+8h-1y/d"
}
]
}
}
}
}
结果集
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 6,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"range" : {
"buckets" : [
{
"key" : "2020-09-06 00:00:00-2021-09-06 00:00:00",
"from" : 1.5993504E12,
"from_as_string" : "2020-09-06 00:00:00",
"to" : 1.6308864E12,
"to_as_string" : "2021-09-06 00:00:00",
"doc_count" : 1
}
]
}
}
}
查询今天的数据(精确单位:日)
分析
方法一:使用大于、小于、大于或等于,小于或等于进行范围搜索。
方法二:使用form和to进行范围搜索,from表示开始时间,to表示结束时间。
方法三(推荐):如果字段格式最精确的时间是日,如:yyyy-MM-dd,yyyyMMdd等,则推荐使用term(精准搜索)。
#查询今天的数据,精确单位:天。
GET /date_db/_search
{
"query": {
"range": {
"createDate": {
"gte": "now+8h/d",
"lte": "now+8h/d"
}
}
}
}
GET /date_db/_search
{
"query": {
"range": {
"createDate": {
"from": "now+8h/d",
"to": "now+8h/d"
}
}
}
}
GET /date_db/_search
{
"query": {
"term": {
"createDate": {
"value": "now+8h/d"
}
}
}
}
GET /date_db/_search
{
"query": {
"term": {
"createDate": "now+8h/d"
}
}
}
查询今天的数据(精确单位:小时)
分析
方法一:使用大于、小于、大于或等于,小于或等于进行范围搜索。
方法二:使用form和to进行范围搜索,from表示开始时间,to表示结束时间。
需求
查询今天00:00:00到当前时间(精确到小时)的数据。比如当前时间是"2022-08-08 01:06:45",则需要将2022-08-08 00至2022-08-08 01的数据查出来。
#查询今天的数据,精确单位:小时。
GET /date_db/_search
{
"query": {
"range": {
"createTime": {
"gte": "now+8h/d",
"lte": "now+8h/h"
}
}
}
}
GET /date_db/_search
{
"query": {
"range": {
"createTime": {
"from": "now+8h/d",
"to": "now+8h/h"
}
}
}
}
查询今天的数据(精确单位:分钟)
分析
方法一:使用大于、小于、大于或等于,小于或等于进行范围搜索。
方法二:使用form和to进行范围搜索,from表示开始时间,to表示结束时间。
需求
查询今天00:00:00到当前时间(精确到分钟)的数据。比如当前时间是"2022-08-08 01:06:45",则需要将2022-08-08 00:00至2022-08-08 01:06的数据查出来。
#查询今天的数据,精确单位:分钟。
GET /date_db/_search
{
"query": {
"range": {
"createTime": {
"gte": "now+8h/d",
"lte": "now+8h/m"
}
}
}
}
GET /date_db/_search
{
"query": {
"range": {
"createTime": {
"from": "now+8h/d",
"to": "now+8h/m"
}
}
}
}
查询今天的数据(精确单位:秒)
分析
方法一:使用大于、小于、大于或等于,小于或等于进行范围搜索。
方法二:使用form和to进行范围搜索,from表示开始时间,to表示结束时间。
需求
查询今天00:00:00到当前时间(精确到秒)的数据。比如(按照东八区计算):当前时间是"2022-08-08 01:06:45",则需要将2022-08-08 00:00:00至2022-08-08 01:06:45的数据查出来。
#查询今天的数据,精确单位:秒。
GET /date_db/_search
{
"query": {
"range": {
"createTime": {
"gte": "now+8h/d",
"lte": "now+8h/s"
}
}
}
}
GET /date_db/_search
{
"query": {
"range": {
"createTime": {
"from": "now+8h/d",
"to": "now+8h/s"
}
}
}
}
查询最近一周的数据
需求一
查询最近一周的数据,包含今天(精确到秒)。比如(按照东八区计算):现在是"2022-08-08 21:55:45",则查询的数据范围是:"2022-08-02 00:00:00"至"2022-08-08 21:55:45"。
GET /date_db/_search
{
"query": {
"range": {
"createTime": {
"from": "now+8h-6d/d",
"to": "now+8h"
}
}
}
}
GET /date_db/_search
{
"query": {
"range": {
"createTime": {
"gte": "now+8h-6d/d",
"lte": "now+8h"
}
}
}
}
需求二
查询最近一周的数据,包含今天(精确到天)。比如(按照东八区计算):现在是"2022-08-08 21:55:45",则查询的数据范围是:"2022-08-02 00:00:00"至"2022-08-08 23:59:59"。
GET /date_db/_search
{
"query": {
"range": {
"createTime": {
"from": "now+8h-6d/d",
"to": "now+8h/d"
}
}
}
}
GET /date_db/_search
{
"query": {
"range": {
"createTime": {
"gte": "now+8h-6d/d",
"lte": "now+8h/d"
}
}
}
}
需求三
查询最近一周的数据(前7天),不包含今天。比如(按照东八区计算):现在是"2022-08-08 21:55:45",则查询的数据范围是:"2022-08-01 00:00:00"至"2022-08-07 23:59:59"。
GET /date_db/_search
{
"query": {
"range": {
"createTime": {
"from": "now+8h-7d/d",
"to": "now+8h-1d/d"
}
}
}
}
GET /date_db/_search
{
"query": {
"range": {
"createTime": {
"from": "now+8h-1w/d",
"to": "now+8h-1d/d"
}
}
}
}
GET /date_db/_search
{
"query": {
"range": {
"createTime": {
"gte": "now+8h-7d/d",
"lte": "now+8h-1d/d"
}
}
}
}
GET /date_db/_search
{
"query": {
"range": {
"createTime": {
"gte": "now+8h-1w/d",
"lte": "now+8h-1d/d"
}
}
}
}
需求四
查询本周(自然周)的数据。这里推荐直接用精准搜索。
GET /date_db/_search
{
"query": {
"term": {
"createTime": "now+8h/w"
}
}
}
查询最近一月的数据
需求一
查询本月(自然月)的数据。这里推荐直接用精准搜索。
GET /date_db/_search
{
"query": {
"term": {
"createTime": "now+8h/M"
}
}
}
查询最近一年的数据
需求一
查询本年(自然年)的数据。这里推荐直接用精准搜索。
GET /date_db/_search
{
"query": {
"term": {
"createTime": "now+8h/y"
}
}
}
更多推荐
所有评论(0)