我有一个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
- 结果应为数字ClassCastException
,script.engine.groovy.{file|indexed|inline}.{aggs|mapping|search|update|plugin}
,script.inline
和script.indexed
启用了所有内容。我知道我可以在查询本身(而不是聚合部分)中运行具有该过滤器的单独查询,这将允许我在没有脚本的情况下进行聚合。关键是我有十几个不同的聚合,这些聚合采用相同的搜索结果集并执行不同类型的过滤(和聚合)。多次运行相同的查询会产生反效果,不可接受。
据我所知,使用在版本1.4.4中有效,但在2.2.0版本中不再有效。
这是一个错误吗?或者也许可以不同地重新实现相同的逻辑,例如,通过Bucket Script Aggregation,还是其他任何一种?
答案 0 :(得分:2)
您是否尝试过使用新的聚合框架和Groovy样式脚本中的内联三元组?
我之前遇到过同样的问题,这就是我解决它的方式。 您的聚合查询如下所示:
"aggs": {
"2": {
"date_histogram": {
"field": "startDate",
"interval": "month",
},
"aggs": {
"1": {
"sum": {
"script": "((condition) ? 1 : 0)",
"lang": "expression"
}
}
}
}
}
请注意,您也可以尝试将脚本定义为ElasticSearch安装的scripts文件夹中的.groovy文件。
希望它会有所帮助。
问候。