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

时间:2016-04-05 10:33:56

标签: java elasticsearch groovy

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

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

3.java delegates

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

"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 } ] } 元素缩减为inline。这仍然导致破解聚合
  • 返回日期字段本身的return 1。结果value - 结果应为数字
  • 检查ES配置设置。我已为ClassCastExceptionscript.engine.groovy.{file|indexed|inline}.{aggs|mapping|search|update|plugin}script.inlinescript.indexed启用了所有内容。
  • 检查2.0 breaking aggregation changes但似乎没有相关内容。

我知道我可以在查询本身(而不是聚合部分)中运行具有该过滤器的单独查询,这将允许我在没有脚本的情况下进行聚合。关键是我有十几个不同的聚合,这些聚合采用相同的搜索结果集并执行不同类型的过滤(和聚合)。多次运行相同的查询会产生反效果,不可接受

据我所知,使用在版本1.4.4中有效,但在2.2.0版本中不再有效。

这是一个错误吗?或者也许可以不同地重新实现相同的逻辑,例如,通过Bucket Script Aggregation,还是其他任何一种?

1 个答案:

答案 0 :(得分:2)

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

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

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

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

希望它会有所帮助。

问候。