时间范围查询
简单示例
json
GET /_search
{
"query": {
"range": {
"timestamp": {
"gte": "now-1d/d", // 当前时间的上一天, 四舍五入到最近的一天
"lte": "now/d" // 当前时间, 四舍五入到最近的一天
}
}
}
}
关于时间的数学表达式(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
关于时间的四舍五入
对日期中的日、月、小时等 进行四舍五入时, 取决于范围的结尾是包含(include)还是排除(exclude).
向上舍入: 移动到舍入范围的最后一毫秒;
向下舍入: 一定到舍入范围的第一毫秒.
举例说明:
① "gt": " 2014-11-18||/M" ------ 大于日期, 需要向上舍入, 结果是 2014-12-01T00:00:00.000
, 也就是不包含整个11月.
② "gte": "2014-11-18||/M" ------ 大于或等于日期, 需要向下舍入, 结果是 2014-11-01T00:00:00.000
, 也就是包含整个11月.
③ "lt": "2014-11-18||/M" ------ 小于日期, 需要向上舍入, 结果是2014-10-31T23:59:59.999
, 也就是不包含整个11月.
④ "lte": "2014-11-18||/M" ------ 小于或等于日期, 需要向下舍入, 结果是2014-11-30T23:59:59.999
, 也就是包含整个11月.
日期格式化范围查询(format)
格式化日期查询时, 将默认使用日期field中指定的格式进行解析, 当然也可以通过format参数来覆盖默认配置.
示例:
json
GET website/_search
{
"query": {
"range": {
"post_date": {
"gte": "2/1/2018",
"lte": "2019",
"format": "dd/MM/yyyy||yyyy" \\这里的||表示或
}
}
}
}
注意: 如果日期中缺失了部分年、月、日, 缺失的部分将被填充为如下默认值:
shell
MONTH_OF_YEAR: 01
DAY_OF_MONTH: 01
HOUR_OF_DAY: 23
MINUTE_OF_HOUR: 59
SECOND_OF_MINUTE: 59
NANO_OF_SECOND: 999_999_999
如果format为 yyyy-MM
, Elasticsearch 将 2099-12
转成 2099-12-01T23:59:59.999_999_999Z
. 没写全的format部分用默认值取代。
参考
【官方】date数学计算
【官方】date的range查询
【官方】format格式
Elasticsearch中如何进行日期(数值)范围查询