嵌套键/值对的弹性脚本聚合

时间:2017-04-13 08:34:22

标签: elasticsearch elasticsearch-plugin

我希望在弹性的嵌套数组中有一个键/值对的脚本聚合。返回的文件示例如下:

    "hits": [
      {
        "_index": "testdan",
        "_type": "year",
        "_id": "AVtXirjYuoFS95t7pfkg",
        "_score": 1,
        "_source": {
          "m_iYear": 2006,
          "m_iTopicID": 11,
          "m_People": [
            {
              "name": "Petrovic, Rade",
              "value": 3.70370364
            },
            {
              "name": "D. Kirovski",
              "value": 3.70370364
            }
]
}},
      {
        "_index": "testdan",
        "_type": "year",
        "_id": "AVtXirjYuoFS95t7pfkg",
        "_score": 1,
        "_source": {
          "m_iYear": 2007,
          "m_iTopicID": 11,
          "m_People": [
            {
              "name": "Petrovic, Rade",
              "value": 6.70370364
            },
            {
              "name": "D. Kirovski",
              "value": 2.70370364
            }
]
}}
]

我想在每个文档中聚合m_Person中每个人的平均值,如下所示:

Petrovic,Rade = 3.70370364 + 6.70370364 / 2 = 7.05 D. Kirovski = 3.70370364 + 2.70370364 / 2 = 5.05

平均值的除法应按名称出现的年数计算。例如,一年可能不会只显示一个名称。

如果由于没有人的唯一身份证而更加困难,我计划为每个人添加一个ID,但是你会如何编写脚本呢,而不是返回所有人,并且需要在前面循环 - 最后,我可以有一系列的人和他们的平均数?

2 个答案:

答案 0 :(得分:0)

您可以使用Kibana Scripted Fields来实现此类聚合。请参阅示例部分。这假设您使用的是Elasticsearch 5.0,因为脚本语言是无痛的。

答案 1 :(得分:0)

您可以非常轻松地使用嵌套聚合实现此目的。对于每一年,我们将汇总人们的姓名,然后计算每个人的平均价值。

{
  "size": 0,
  "aggs": {
    "years": {
      "terms": {
        "field": "m_iYear"
      },
      "aggs": {
        "names": {
          "nested": {
            "path": "m_People"
          },
          "aggs": {
            "names": {
              "terms": {
                "field": "m_People.name"
              },
              "aggs": {
                "average": {
                  "avg": {
                    "field": "m_People.value"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}