8.4 파이프라인 - Pipeline Aggregations
이 문서의 허가되지 않은 무단 복제나 배포 및 출판을 금지합니다. 본 문서의 내용 및 도표 등을 인용하고자 하는 경우 출처를 명시하고 김종민([email protected])에게 사용 내용을 알려주시기 바랍니다.
Aggregation 중에는 다른 metrics aggregation의 결과를 새로운 입력으로 하는 pipeline aggregation이 있습니다. pipeline 에는 다른 버킷의 결과들을 다시 연산하는 min_bucket, max_bucket, avg_bucket, sum_bucket, stats_bucket, 이동 평균을 구하는 moving_avg, 미분값을 구하는 derivative, 값의 누적 합을 구하는 cumulative_sum 등이 있습니다. Pipeline aggregation 은 "buckets_path": "<버킷 이름>" 옵션을 이용해서 입력 값으로 사용할 버킷을 지정합니다. 다음은 my_stations 에서 date_histogram을 이용해서 월별로 나눈 passangers 의 합계 sum을 다시 cumulative_sum을 이용해서 누적값을 구하는 예제입니다.
request
response
passangers 의 값을 입력으로 받는 cumulative_sum aggs 실행
1
GET my_stations/_search
2
{
3
"size": 0,
4
"aggs": {
5
"months": {
6
"date_histogram": {
7
"field": "date",
8
"interval": "month"
9
},
10
"aggs": {
11
"sum_psg": {
12
"sum": {
13
"field": "passangers"
14
}
15
},
16
"accum_sum_psg": {
17
"cumulative_sum": {
18
"buckets_path": "sum_psg"
19
}
20
}
21
}
22
}
23
}
24
}
Copied!
passangers 의 값을 입력으로 받는 cumulative_sum aggs 실행 결과
1
{
2
"took" : 7,
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
"months" : {
20
"buckets" : [
21
{
22
"key_as_string" : "2019-06-01T00:00:00.000Z",
23
"key" : 1559347200000,
24
"doc_count" : 2,
25
"sum_psg" : {
26
"value" : 7726.0
27
},
28
"accum_sum_psg" : {
29
"value" : 7726.0
30
}
31
},
32
{
33
"key_as_string" : "2019-07-01T00:00:00.000Z",
34
"key" : 1561939200000,
35
"doc_count" : 2,
36
"sum_psg" : {
37
"value" : 12699.0
38
},
39
"accum_sum_psg" : {
40
"value" : 20425.0
41
}
42
},
43
{
44
"key_as_string" : "2019-08-01T00:00:00.000Z",
45
"key" : 1564617600000,
46
"doc_count" : 2,
47
"sum_psg" : {
48
"value" : 11545.0
49
},
50
"accum_sum_psg" : {
51
"value" : 31970.0
52
}
53
},
54
{
55
"key_as_string" : "2019-09-01T00:00:00.000Z",
56
"key" : 1567296000000,
57
"doc_count" : 3,
58
"sum_psg" : {
59
"value" : 9054.0
60
},
61
"accum_sum_psg" : {
62
"value" : 41024.0
63
}
64
},
65
{
66
"key_as_string" : "2019-10-01T00:00:00.000Z",
67
"key" : 1569888000000,
68
"doc_count" : 1,
69
"sum_psg" : {
70
"value" : 971.0
71
},
72
"accum_sum_psg" : {
73
"value" : 41995.0
74
}
75
}
76
]
77
}
78
}
79
}
Copied!
위 결과에서 accum_sum_psg 결과에 sum_psg 값이 다음과 같이 계속 누적되어 더해지고 있는 것을 확인할 수 있습니다.
  • "accum_sum_psg" : { "value" : 7726.0} = 7726.0
  • "accum_sum_psg" : { "value" : 20425.0} = 7726.0 + 12699.0
  • "accum_sum_psg" : { "value" : 31970.0} = 7726.0 + 12699.0 + 11545.0
  • ...
서로 다른 버킷에 있는 값들도 bucket_path에 > 기호를 이용해서 "부모>자녀" 형태로 지정이 가능합니다. 다음은 sum_bucket 을 이용해서 mon>sum_psg 버킷에 있는 passangers 필드값의 합을 구하는 예제입니다.
request
response
다른 부모의 자녀 버킷에 있는 필드를 입력으로 받는 pipeline aggs
1
GET my_stations/_search
2
{
3
"size": 0,
4
"aggs": {
5
"mon": {
6
"date_histogram": {
7
"field": "date",
8
"interval": "month"
9
},
10
"aggs": {
11
"sum_psg": {
12
"sum": {
13
"field": "passangers"
14
}
15
}
16
}
17
},
18
"bucket_sum_psg": {
19
"sum_bucket": {
20
"buckets_path": "mon>sum_psg"
21
}
22
}
23
}
24
}
Copied!
다른 부모의 자녀 버킷에 있는 필드를 입력으로 받는 pipeline aggs 실행 결과
1
{
2
"took" : 4,
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
"mon" : {
20
"buckets" : [
21
{
22
"key_as_string" : "2019-06-01T00:00:00.000Z",
23
"key" : 1559347200000,
24
"doc_count" : 2,
25
"sum_psg" : {
26
"value" : 7726.0
27
}
28
},
29
{
30
"key_as_string" : "2019-07-01T00:00:00.000Z",
31
"key" : 1561939200000,
32
"doc_count" : 2,
33
"sum_psg" : {
34
"value" : 12699.0
35
}
36
},
37
{
38
"key_as_string" : "2019-08-01T00:00:00.000Z",
39
"key" : 1564617600000,
40
"doc_count" : 2,
41
"sum_psg" : {
42
"value" : 11545.0
43
}
44
},
45
{
46
"key_as_string" : "2019-09-01T00:00:00.000Z",
47
"key" : 1567296000000,
48
"doc_count" : 3,
49
"sum_psg" : {
50
"value" : 9054.0
51
}
52
},
53
{
54
"key_as_string" : "2019-10-01T00:00:00.000Z",
55
"key" : 1569888000000,
56
"doc_count" : 1,
57
"sum_psg" : {
58
"value" : 971.0
59
}
60
}
61
]
62
},
63
"bucket_sum_psg" : {
64
"value" : 41995.0
65
}
66
}
67
}
Copied!
이번 장에서는 Elasticsearch가 텍스트 검색엔진을 넘어 데이터 분석 엔진으로서의 기능을 가능하게 해 준 Aggregations 에 대해서 알아보았습니다. Aggregations 에는 다양한 값들을 연산하는 metrics, 범위나 종류 별로 값들을 분리하는 bucket, 그리고 다른 aggregation의 결과를 입력으로 받아 새로운 연산을 수행하는 pipeline 이 있습니다. 이 장에서는 주로 사용되는 aggregation들 위주로 기본적인 사용 방법에 대해 설명했습니다. 지금까지 설명한 것 외에도 수많은 종류의 aggregation 들이 있으니 공식 도큐먼트에서 확인 하시기 바랍니다.
Copy link