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

如何在Elasticsearch查询中获取当前日期并计算星期数?

解决Elasticsearch查询中获取当前周数并匹配的问题

针对你遇到的now在query脚本中无法生效的问题,这里提供几个实用的解决思路:

方案1:客户端计算周数后通过参数传递

在发起ES请求前,先在业务代码里计算出当前日期的周数,再将这个值作为脚本参数传入查询。这种方式避免了在ES脚本中处理时间,性能更稳定。

示例请求:

{
  "_source": "false",
  "query": {
    "script": {
      "script": {
        "source": "doc['record_created_at'].value.getWeekOfWeekyear() == params.currentWeek",
        "params": {
          "currentWeek": 35 // 替换为客户端计算好的当前周数
        }
      }
    }
  },
  "aggs": {
    "Current Week Demos": {
      "value_count": {
        "field": "_id"
      }
    }
  }
}

方案2:在Painless脚本中直接获取当前时间(注意时区)

Elasticsearch的Painless脚本支持调用Java日期API,可直接在脚本中获取当前时间并计算周数,但要确保时区和record_created_at字段的时区一致,避免匹配错误。

示例请求:

{
  "_source": "false",
  "query": {
    "script": {
      "script": "doc['record_created_at'].value.getWeekOfWeekyear() == ZonedDateTime.now(ZoneId.of('UTC')).get(WeekFields.ISO.weekOfWeekYear())"
    }
  },
  "aggs": {
    "Current Week Demos": {
      "value_count": {
        "field": "_id"
      }
    }
  }
}

提示:如果record_created_at使用其他时区,将UTC替换为对应时区ID(比如Asia/Shanghai)。

方案3:使用日期范围查询替代脚本(性能最优)

脚本查询性能通常不如原生范围查询,可利用Elasticsearch的日期数学表达式直接匹配当前周的文档,完全不需要脚本:

示例请求:

{
  "_source": "false",
  "query": {
    "range": {
      "record_created_at": {
        "gte": "now/w", // 当前周的起始时间(默认周一,可通过ES索引配置调整周起始)
        "lte": "now/w+1w-1ms" // 当前周的结束时间
      }
    }
  },
  "aggs": {
    "Current Week Demos": {
      "value_count": {
        "field": "_id"
      }
    }
  }
}

说明:若需要周日作为周起始,可在ES索引设置中调整week_start参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 09:42:40