You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ElasticSearch中使用当前时间过滤integer_range类型字段

结论

可以实现,无需手动传入当前时间,通过Elasticsearch内置时间变量结合Painless脚本即可完成过滤。

实现逻辑

你的availableHours字段采用「周几10000 + 小时100 + 分钟」的整数编码存储为integer_range类型,只需要在查询时动态将ES内部的当前时间转换为相同规则的整数编码,再判断该编码是否落在任意一个availableHours区间内即可。

参考查询语句

GET 替换为你的索引名称/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "script": {
            "script": {
              "lang": "painless",
              "source": """
                // 按需调整为你业务使用的时区,示例为东8区(Asia/Shanghai)
                ZonedDateTime currentTime = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
                // 按照「周几/小时/分钟」规则生成对应编码
                int currentCode = currentTime.getDayOfWeek().getValue() * 10000 + currentTime.getHour() * 100 + currentTime.getMinute();
                // 校验当前编码是否命中任意一个可访问时间区间
                return doc['availableHours'].stream().anyMatch(range -> range.contains(currentCode));
              """
            }
          }
        }
      ]
    }
  }
}

注意事项

  • 时区配置需要和你存入availableHours数据时使用的时区保持一致,若业务使用UTC时区,将ZoneId.of("Asia/Shanghai")替换为ZoneId.of("UTC")即可
  • 若使用的ES版本较低不支持ZonedDateTime,可以替换为Calendar类实现相同的编码计算逻辑
  • 查询每次执行都会自动获取ES节点的当前时间计算,完全不需要手动传入时间参数

内容的提问来源于stack exchange,提问作者o_O

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 16:15:00