8.3 하위 - sub-aggregations
이 문서의 허가되지 않은 무단 복제나 배포 및 출판을 금지합니다. 본 문서의 내용 및 도표 등을 인용하고자 하는 경우 출처를 명시하고 김종민([email protected])에게 사용 내용을 알려주시기 바랍니다.
Bucket Aggregation 으로 만든 버킷들 내부에 다시 "aggs" : { } 를 선언해서 또다른 버킷을 만들거나 Metrics Aggregation 을 만들어 사용이 가능합니다. 다음은 terms aggregation을 이용해서 생성한 stations 버킷 별로 avg aggregation을 이용해서 passangers 필드의 평균값을 계산하는 avg_psg_per_st 을 생성하는 예제입니다.
request
response
terms aggs 아래에 avg aggs 사용
1
GET my_stations/_search
2
{
3
"size": 0,
4
"aggs": {
5
"stations": {
6
"terms": {
7
"field": "station.keyword"
8
},
9
"aggs": {
10
"avg_psg_per_st": {
11
"avg": {
12
"field": "passangers"
13
}
14
}
15
}
16
}
17
}
18
}
Copied!
terms aggs 아래에 avg aggs 사용 결과
1
{
2
"took" : 3,
3
"timed_out" : false,
4
"_shards" : {
5
"total" : 1,
6
"successful" : 1,
7
"skipped" : 0,
8
"failed" : 0
9
},
10
"hits" : {
11
"total" : {
12
"value" : 10,
13
"relation" : "eq"
14
},
15
"max_score" : null,
16
"hits" : [ ]
17
},
18
"aggregations" : {
19
"stations" : {
20
"doc_count_error_upper_bound" : 0,
21
"sum_other_doc_count" : 0,
22
"buckets" : [
23
{
24
"key" : "강남",
25
"doc_count" : 5,
26
"avg_psg_per_st" : {
27
"value" : 5931.2
28
}
29
},
30
{
31
"key" : "불광",
32
"doc_count" : 1,
33
"avg_psg_per_st" : {
34
"value" : 971.0
35
}
36
},
37
{
38
"key" : "신촌",
39
"doc_count" : 1,
40
"avg_psg_per_st" : {
41
"value" : 3912.0
42
}
43
},
44
{
45
"key" : "양재",
46
"doc_count" : 1,
47
"avg_psg_per_st" : {
48
"value" : 4121.0
49
}
50
},
51
{
52
"key" : "종각",
53
"doc_count" : 1,
54
"avg_psg_per_st" : {
55
"value" : 2314.0
56
}
57
},
58
{
59
"key" : "홍제",
60
"doc_count" : 1,
61
"avg_psg_per_st" : {
62
"value" : 1021.0
63
}
64
}
65
]
66
}
67
}
68
}
Copied!
stations 버킷들 별로 avg_psg_per_st 라는 aggregation이 실행된 것을 확인할 수 있습니다. 버킷 안에 또 다른 하위 버킷을 만드는 것도 가능합니다. 다음은 terms aggregation 을 이용해서 line.keyword 별로 lines 버킷을 만들고 그 안에 또다시 terms aggregation을 이용한 stations_per_lines 버킷을 만든 예제입니다.
request
response
terms aggs 아래에 하위 terms aggs 사용
1
GET my_stations/_search
2
{
3
"size": 0,
4
"aggs": {
5
"lines": {
6
"terms": {
7
"field": "line.keyword"
8
},
9
"aggs": {
10
"stations_per_lines": {
11
"terms": {
12
"field": "station.keyword"
13
}
14
}
15
}
16
}
17
}
18
}
Copied!
terms aggs 아래에 하위 terms aggs 사용 결과
1
{
2
"took" : 1,
3
"timed_out" : false,
4
"_shards" : {
5
"total" : 1,
6
"successful" : 1,
7
"skipped" : 0,
8
"failed" : 0
9
},
10
"hits" : {
11
"total" : {
12
"value" : 10,
13
"relation" : "eq"
14
},
15
"max_score" : null,
16
"hits" : [ ]
17
},
18
"aggregations" : {
19
"lines" : {
20
"doc_count_error_upper_bound" : 0,
21
"sum_other_doc_count" : 0,
22
"buckets" : [
23
{
24
"key" : "2호선",
25
"doc_count" : 6,
26
"stations_per_lines" : {
27
"doc_count_error_upper_bound" : 0,
28
"sum_other_doc_count" : 0,
29
"buckets" : [
30
{
31
"key" : "강남",
32
"doc_count" : 5
33
},
34
{
35
"key" : "신촌",
36
"doc_count" : 1
37
}
38
]
39
}
40
},
41
{
42
"key" : "3호선",
43
"doc_count" : 3,
44
"stations_per_lines" : {
45
"doc_count_error_upper_bound" : 0,
46
"sum_other_doc_count" : 0,
47
"buckets" : [
48
{
49
"key" : "불광",
50
"doc_count" : 1
51
},
52
{
53
"key" : "양재",
54
"doc_count" : 1
55
},
56
{
57
"key" : "홍제",
58
"doc_count" : 1
59
}
60
]
61
}
62
},
63
{
64
"key" : "1호선",
65
"doc_count" : 1,
66
"stations_per_lines" : {
67
"doc_count_error_upper_bound" : 0,
68
"sum_other_doc_count" : 0,
69
"buckets" : [
70
{
71
"key" : "종각",
72
"doc_count" : 1
73
}
74
]
75
}
76
}
77
]
78
}
79
}
80
}
Copied!
각 호선별로 역 버킷이 생성된 것을 확인할 수 있습니다. 두 번째 하위 aggregations 안에 또 다른 metrics aggregations를 입력하는 것도 가능합니다.
하위 버킷이 깊어질수록 elasticsearch 가 하는 작업량과 메모리 소모량이 기하급수적으로 늘어나기 때문에 예상치 못한 오류를 발생 시킬수도 있습니다. 보통은 2레벨의 깊이 이상의 버킷은 생성하지 않는 것이 좋습니다.
Copy link