首页/数据/NoSQL 速查/range 范围查询(数值与日期)
Elasticsearch89 条

range 范围查询(数值与日期)

range 用 gt/gte/lt/lte 表达开闭区间,日期支持 now-1d/d 这类日期数学表达式;跨时区查询可加 time_zone,格式不标准时用 format 指定。

NoSQL 速查数据更新于 2026-10-13

range 范围查询

range 用 gt / gte / lt / lte 表达数值与日期区间,布尔、字符串、ip 字段同样适用(也可用 from / to 简写)。日期字段支持 now、now-1d/d、2026-01-01||+1M 这类日期数学表达式与取整符号,跨时区查询用 time_zone 对齐口径。不满足字段默认格式时可用 format 指定解析方式,条件放进 filter 子句后不参与评分。

基本信息

比较符gt / gte / lt / lte,也可写 from / to
日期表达式now、now-1d、now/d、2026-01-01||+1M
取整符号/d 按天、/h 按小时、/M 按月取整
时区time_zone 参数,未指定按 UTC 计算
格式format 指定日期解析格式
评分放在 filter 子句时不参与相关性评分

典型使用场景

  • 价格或评分区间筛选,配合排序做商品列表
  • 时间范围检索:最近 7 天、昨天、本月等口径
  • 结算类统计:按自然日或自然月圈定数据范围
  • 日志查询时先按时间范围收窄,再做聚合
  • 库存与数量筛选,排除无货或缺货记录
  • 数据保留策略联查:找出超过保留期的文档

示例

示例
GET /products/_search
{
  "query": {
    "range": { "price": { "gte": 3000, "lte": 8000 } }        # 数值闭区间
  }
}

GET /logs/_search
{
  "query": {
    "range": {
      "@timestamp": {
        "gte": "now-1d/d",                                   # 昨天零点
        "lt": "now/d",                                       # 今天零点
        "time_zone": "+08:00"                                # 按东八区口径取整
      }
    }
  }
}

日期表达式读法

写法含义说明
now当前时刻未取整,按毫秒计算
now-1d24 小时前相对当前时刻
now-1d/d昨天的零点先算偏移再按天取整
now/d今天零点日界线按 time_zone 决定
now-1h/h上一个整点小时级分桶常用
2026-01-01||+1M日期加一个月表达式可叠加运算
日期取整符号很关键:now/d 是今天零点,now 是当前时刻;做自然日统计必须带取整符号,否则区间会随查询时间漂移。
默认时区是 UTC,业务按东八区结算时必须显式写 time_zone,否则日界线会相差 8 小时,跨天数据统计出错。
字符串形式的日期若不符合字段声明的 format 会解析失败或无命中;写入前统一格式,或显式指定 format 与字段定义保持一致。

易错点

  • 默认按 UTC 计算日界线,业务时区为东八区却不写 time_zone,跨天统计会整体偏 8 小时
  • now 不带取整符号时区间随查询时刻变化,同一报表两次执行结果不一致
  • 把字符串日期与 date 类型字段比较会因类型不匹配而无命中,字段类型要先确认
  • range 写在 must 里会白算评分,纯筛选条件应放进 filter 子句
  • 数值区间上下界写反(gte 大于 lte)不会报错但永远查不到数据,条件方向要复查

数据来源与参考

  • Elasticsearch Guide: Range query
  • Elasticsearch Guide: Date math
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌