【问题标题】:Elasticsearch: Accessing nested document attributes in scriptElasticsearch:访问脚本中的嵌套文档属性
【发布时间】: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


    【解决方案1】:

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

    查看以下问题以获取此聚合的示例:Elasticsearch: Possible to process aggregation results?

    【讨论】:

    • 感谢您的回答,但我并没有尝试在聚合上完成聚合,而是在数组或嵌套文档上进行平均聚合,具有多次出现的相同值。正如我写的那样,我也尝试用脚本来完成这个,问题是倒排索引只包含唯一值(即一个集合而不是我的列表)。一个可行的解决方案是将 doc_values = true 添加到映射中。
    猜你喜欢
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    相关资源
    最近更新 更多