我有一个 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.indexed
和script.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/