Elasticsearch:在脚本中访问嵌套文档属性

时间:2015-03-26 15:16:06

标签: elasticsearch

我将日志数据存储在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确实获得了所需的结果,但这对于我的数据集中的生产来说太慢了。

我能想象的唯一简单(快速)解决方案是在存储之前计算平均值,并将它们存储在实际列表中,但这感觉不对。

1 个答案:

答案 0 :(得分:0)

elasticsearch尚不支持聚合聚合结果。显然,有一个名为reducers的概念正在为2.0开发。我建议看看scripted metric aggregations。基本上,您可以通过使用脚本自己控制集合和计算方面来创建自己的聚合。

有关此聚合的示例,请查看以下问题:Elasticsearch: Possible to process aggregation results?