java - Elasticsearch 按日期聚合直方图不再适用于脚本

标签 java elasticsearch groovy

我有一个 ES 查询,它返回大约 26 个结果。

查询具有聚合直方图元素,如下所示:

"aggregations" : {
   "by_date" : {
      "date_histogram" : {
         "field" : "startDate",
         "interval" : "month"
      }
   }
}

搜索结果的聚合元素如下所示:

"aggregations": {
   "date_histogram": {
      "buckets":[
        {"key_as_string":"2016-01-01T00:00:00.000Z", "key":1451606400000, "doc_count":18},
        {"key_as_string":"2016-02-01T00:00:00.000Z", "key":1454284800000, "doc_count":8}
      ]
   }
}

到目前为止一切顺利。但我想要的是针对搜索结果执行一些脚本,以删除不符合某些条件的元素。所以我将其添加到查询中:

"aggregations" : {
   "by_date" : {
      "date_histogram" : {
         "field" : "startDate",
         "interval" : "month",
         "script" : {
            "inline" : "if (condition) {return 1} else {return 0}"
         }
   }
}

不幸的是,这会导致单个结果存储桶和聚合丢失:

"date_histogram": {
   "buckets": [
      {"key_as_string": "1970-01-01T00:00:00.000Z", "key": 0, "doc_count": 26 }
   ]
}

我尝试过什么:

  • 将脚本内联元素减少为仅返回1。这仍然会导致聚合失败
  • 返回日期字段本身的。结果 ClassCastException - 结果应该是一个数字
  • 检查 ES 配置设置。我已启用 script.engine.groovy.{file|indexed|inline}.{aggs|mapping|search|update|plugin} 以及 script.inline 的所有内容, script.indexedscript.aggs
  • 检查了2.0 breaking aggregation changes但似乎没有一个是相关的。

我知道我可以在查询本身(而不是聚合部分)中运行具有该过滤器的单独查询,这将允许我在没有脚本的情况下进行聚合。关键是我有十几个不同的聚合,它们采用同一组搜索结果并执行不同类型的过滤(和聚合)。多次运行相同的查询会适得其反,并且 Not Acceptable

据我所知,这个曾经可以在 1.4.4 版本中工作,但不再可以在 2.2.0 版本中工作。

这是一个错误吗?或者也许相同的逻辑可以以不同的方式重新实现,例如通过存储桶脚本聚合,还是任何其他方式?

最佳答案

您是否尝试过使用新的聚合框架以及 Groovy 样式脚本中的内联三元组?

我以前遇到过同样的问题,这就是我解决的方法。 您的聚合查询将如下所示:

"aggs": {
"2": {
  "date_histogram": {
    "field": "startDate",
    "interval": "month",
  },
  "aggs": {
    "1": {
      "sum": {
        "script": "((condition) ? 1 : 0)",
        "lang": "expression"
      }
    }
  }
}
}

请注意,您还可以尝试将脚本定义为 ElasticSearch 安装的脚本文件夹中的 .groovy 文件。

希望对您有所帮助。

问候。

关于java - Elasticsearch 按日期聚合直方图不再适用于脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36423910/

相关文章:

amazon-web-services - 如何在elasticsearch中查询非关键字字段

go - http.Post 数据二进制,golang 中的 curl 等价物

elasticsearch - 将 Elasticsearch 和 Kibana 配置文件传递给 docker 容器

java - 如何检查字符串是否与 Groovy 中的模式匹配

java - 向另一台设备发送通知

java - 我的正则表达式不起作用

java - java网络中的EOFException

java - Java 中复杂 getter 的命名约定

database - Groovy中的数据库时间转换

java - 获取所有登录我的网络应用程序restfb的人