繁体   English   中英

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

[英]Elasticsearch aggregation histogram by date no longer works with script

我有一个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 }
   ]
}

我尝试了什么:

  • 将脚本inline元素减少为仅return 1 这仍然会导致聚合失败
  • 日期字段本身的返回value 结果ClassCastException结果应为数字
  • 检查ES配置设置。 我已经为script.engine.groovy.{file|indexed|inline}.{aggs|mapping|search|update|plugin} ,以及script.inlinescript.indexedscript.aggs启用了所有功能。
  • 检查了2.0破坏性的聚合更改,但似乎没有任何相关性。

我知道我可以运行在查询本身(而不是聚合部分)中具有该过滤器的单独查询,这将使我无需脚本即可进行聚合。 关键是我有许多不同的聚合,它们采用相同的搜索结果集并进行不同类型的过滤(和聚合)。 多次运行相同的查询会适得其反,并且不可接受

据我所知,这曾经在1.4.4版中起作用,但在2.2.0版中不再起作用。

这是错误吗? 还是可以以不同的方式重新实现相同的逻辑,例如通过Bucket Script Aggregation或其他方式?

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

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

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

请注意,您还可以通过在ElasticSearch安装的scripts文件夹中将脚本定义为.groovy文件来进行尝试。

希望对您有所帮助。

问候。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM