我是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表示失败
我希望以一种方式显示结果,它可以反映具有“成功”值的层次结构,如
或者,如果还有一种方法可以将成功和失败情景的平均时间分布在这个层次结构中,如上所述,那将是很好的。
答案 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"
}
}
}
}
}
}
}
}