在 ElasticSearch 中使用带有脚本的术语聚合(动态脚本被禁用时)

Using Terms Aggregation with a script in ElasticSearch (while dynamic scripting is disabled)

我正在 ElasticSearch 中执行包含以下代码的查询:

"aggs": {
  "day_of_week": {
    "terms": {
      "script": "def myDate = new DateTime(doc['timestamp'].date); myDate.withZone(DateTimeZone.forID(timeZoneInfo)).getDayOfWeek()"
      "size": 0
    }
  }
}

问题是出于安全原因,动态脚本现在默认被禁用,因此这将失败并显示错误 "ScriptException[dynamic scripting for [groovy] disabled]"。有关动态脚本的更多信息,请参阅此页面:https://www.elastic.co/blog/running-groovy-scripts-without-dynamic-scripting

我知道解决此问题的建议方法是使用脚本文件。不幸的是,这似乎不受条款聚合的支持(它只对过滤器有效吗?)。

任何帮助解决这个问题将不胜感激,因为出于安全目的我真的不能启用动态脚本。

所以看起来这是可能的 - 我只是使用了不正确的格式。在我的例子中,我创建了一个名为 "date_time_zoned_hour_of_day" 的 groovy 脚本文件并将其添加到 elasticsearch/config/scripts。

代码如下:

"aggs": {
  "day_of_week": {
    "terms": {
      "script": "date_time_zoned_hour_of_day",
      "params": {
          "timeZone": "America/Vancouver"
      },
      "size": 0
    }
  }
}