如何在弹性搜索中聚合和汇总从子级到父级的值

时间:2016-01-21 19:51:01

标签: elasticsearch aggregation rollup

我是Elastic Search的新手,我正在尝试找出如何处理此处介绍的方案。我有一个架构,其中文档可能包含数据,如

{ 
   "country":"US",
   "zone": "East",
   "cluster": "Cluster1",
   "time_taken": 4500,
   "status": 0
},
{ 
   "country":"US",
   "zone": "East",
   "cluster": "Cluster1",
   "time_taken": 5000,
   "status": 0
},
{ 
   "country":"US",
   "zone": "East",
   "cluster": "Cluster1",
   "time_taken": 5000,
   "status": 1
},
{ 
   "country":"US",
   "zone": "East",
   "cluster": "Cluster2",
   "time_taken": 5000,
   "status": 0
}

其中status = 0表示成功,1表示失败

我希望以一种方式显示结果,它可以反映具有“成功”值的层次结构,如

  • US / East / Cluster1 = 66%(基本上是2次成功,1次失败)
  • US / East / Cluster2 = 100%(基本上是1次成功)
  • 美国/东部= 75%
  • US = 75%

或者,如果还有一种方法可以将成功和失败情景的平均时间分布在这个层次结构中,如上所述,那将是很好的。

1 个答案:

答案 0 :(得分:0)

我认为terms aggregation应该为你完成工作。

为了满足您的第一个查询示例(每个群集的成功率为%),请尝试以下方法:

{
  "aggs": {
    "byCluster": {
      "terms": {
        "field": "cluster"
      },
      "aggs": {
        "success_or_fail": {
          "terms": {
            "field": "status"
          }
        }
      }
    }
  }
}

这会返回如下所示的结果:

"aggregations": {
      "byCluster": {
         "doc_count_error_upper_bound": 0,
         "sum_other_doc_count": 0,
         "buckets": [
            {
               "key": "cluster1",
               "doc_count": 3,
               "success_or_fail": {
                  "doc_count_error_upper_bound": 0,
                  "sum_other_doc_count": 0,
                  "buckets": [
                     {
                        "key": 0,
                        "doc_count": 2
                     },
                     {
                        "key": 1,
                        "doc_count": 1
                     }
                  ]
               }
            },
            {
               "key": "cluster2",
               "doc_count": 1,
               "success_or_fail": {
                  "doc_count_error_upper_bound": 0,
                  "sum_other_doc_count": 0,
                  "buckets": [
                     {
                        "key": 0,
                        "doc_count": 1
                     }
                  ]
               }
            }
         ]
      }
   }

您可以将doc_count作为" success_or_fail"的0桶。 (任意名称)聚合并将其除以相应群集的doc_count。这将为您提供每个群集的成功百分比。 (2/3代表" cluster1" 1/3代表" cluster2")。

可以使用相同类型的聚合来按" country"进行分组。和"区"。

<强>更新

您还可以在&#34; success_or_fail&#34;旁边嵌套avg聚合。 terms聚合,以达到您所寻找的平均时间。

如:

{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "byCluster": {
      "terms": {
        "field": "cluster"
      },
      "aggs": {
        "success_or_fail": {
          "terms": {
            "field": "status"
          },
          "aggs": {
            "avg_time_taken": {
              "avg": {
                "field": "time_taken"
              }
            }
          }
        }
      }
    }
  }
}