我将日志数据存储在elasticsearch中,我的记录以及其他数据包含值列表。首先,我用弹性的常规数组来表示这些值列表,但很快就意识到扁平化与Lucene中的倒排索引相结合,使得[1,1,1,1,5]等列表上的平均聚合出现了完全错误因为倒排索引只包含[1,5]。显然avg([1,5])与avg([1,1,1,1,5])不同。
寻求解决方案我转向嵌套文档,这些文档不会使数据变平。
我现在将我的嵌套文档放在elasticsearch中查找以下内容:
"nested_documents": [
{ "list1": 1, "list2": 2},
{ "list1": 3, "list2": 4}
]
使用嵌套聚合,我可以进行聚合,例如:
"aggs": {
"nested_aggregation": {
"nested": {
"path": "nested_documents"
},
"aggs": {
"average_of_list1": {
"avg": {
"field": "nested_documents.list1"
}
}
}
}
现在,它为整个数据集提供了正确的结果。但是,我也有其他要求。
我想实现像max(avg(nested_documents.list1))这样的东西,即我希望得到嵌套文档字段的平均值。我想我可以使用脚本来实现这一点,但我找不到在脚本中访问嵌套文档的方法。我使用script和_source确实获得了所需的结果,但这对于我的数据集中的生产来说太慢了。
我能想象的唯一简单(快速)解决方案是在存储之前计算平均值,并将它们存储在实际列表中,但这感觉不对。
答案 0 :(得分:0)
elasticsearch尚不支持聚合聚合结果。显然,有一个名为reducers的概念正在为2.0开发。我建议看看scripted metric aggregations。基本上,您可以通过使用脚本自己控制集合和计算方面来创建自己的聚合。
有关此聚合的示例,请查看以下问题:Elasticsearch: Possible to process aggregation results?