【发布时间】:2015-05-30 16:34:44
【问题描述】:
我将日志数据存储在 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)) 之类的东西,即我想获得嵌套文档字段的平均值。我想我可以使用脚本来实现这一点,但我找不到在脚本中访问嵌套文档的方法。我确实使用脚本和 _source 达到了预期的结果,但这太慢了,无法在我的数据集上用于生产。
我能想到的唯一简单(且快速)的解决方案是在存储之前计算平均值,并将它们存储在实际列表中,但这感觉不对。
【问题讨论】:
标签: elasticsearch