ELK

ELK 엘라스틱서치 Metric Aggregation(메트릭 어그리게이션)

1. 엘라스틱서치 Metric 어그리게이션(Metric Aggregation)

Aggregation ?

Elasticsearch 는 검색엔진으로 개발되었지만 지금은 로그분석을 비롯해 다양한 목적의데이터 시스템으로 사용되고 있습니다. Elasticsearch가 이렇게 다양한 용도로 활용이 될 수 있는 이유는 데이터를 단순히 검색만 하는 것이 아니라 여러가지 연산을 할 수 있는 Aggregation 기능이 있기 때문입니다

메트릭 어그리게이션(Metric Aggregation)?
가장 흔하게 사용되는 metrics aggregations 은 min, max, sum, avg aggregation 입니다. 순서대로 명시한 필드의 최소, 최대, 합, 평균 값을 가져오는 aggregation 입니다.
엘라스틱서치안에 있는 Document안에 있는 값을 조합을 통하여 값을 핸들링할때 사용하는 컨셉이라고 할 수 있습니다.

메트릭 어그리게이션(Metric Aggregation) 구조

1
2
3
4
5
6
7
8
9
10
11
GET my_stations/_search
{
"size": 0,
"aggs": {
"all_passangers": {
"sum": {
"field": "passangers"
}
}
}
}

Data

1
2
3
4
{ "index" : { "_index" : "basketball", "_type" : "record", "_id" : "1" } }
{"team" : "Chicago Bulls","name" : "Michael Jordan", "points" : 30,"rebounds" : 3,"assists" : 4, "submit_date" : "1996-10-11"}
{ "index" : { "_index" : "basketball", "_type" : "record", "_id" : "2" } }
{"team" : "Chicago Bulls","name" : "Michael Jordan","points" : 20,"rebounds" : 5,"assists" : 8, "submit_date" : "1996-10-11"}

Data Insert

1
2
curl -XPOST -H 'Content-Type:application/json' 'localhost:9200/_bulk' --data-binary @simple_basketball.json
{"took":58,"errors":false,"items":[{"index":{"_index":"basketball","_type":"record","_id":"1","_version":2,"result":"updated","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":2,"_primary_term":1,"status":200}},{"index":{"_index":"basketball","_type":"record","_id":"2","_version":2,"result":"updated","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":3,"_primary_term":1,"status":200}}]}%

다음과 같은 데이터를 -XPOST 옵션과 --data-binary를 통해 넣어주겠습니다.
평균값을 넣어주는 json파일의 형식을 조회해오면 다음과 같은 값들을 넣을 수 있습니다.

평균값 json 조회

1
curl -XGET localhost:9200/_search\?pretty --data-binary @avg_point_aggs.json

평균값 json 조회 결과

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
curl -XGET -H 'Content-Type:application/json' 'localhost:9200/_search?pretty' --data-binary @avg_points_aggs.json
{
"took" : 21,
"timed_out" : false,
"_shards" : {
"total" : 7,
"successful" : 7,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 50,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"avg_score" : {
"value" : 25.0
}
}
}

다음과 같이 정상적으로 Metric Aggregation을 사용하여 평균값을 구한것을 확인할 수 있습니다.

최댓값 구하기

Data

1
2
3
4
5
6
7
8
9
10
{
"size" : 0,
"aggs" : {
"max_score" : {
"max" : {
"field" : "points"
}
}
}
}

최댓값 조회

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
curl -XGET -H 'Content-Type:application/json' 'localhost:9200/_search?pretty' --data-binary @max_points_aggs.json
{
"took" : 36,
"timed_out" : false,
"_shards" : {
"total" : 7,
"successful" : 7,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 50,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"max_score" : {
"value" : 30.0
}
}
}

다음과 같이 정상적으로 Metric Aggregation을 사용하여 최댓값을 구한것을 확인할 수 있습니다.

최솟값 구하기

Data

1
2
3
4
5
6
7
8
9
10
{
"size" : 0,
"aggs" : {
"min_score" : {
"min" : {
"field" : "points"
}
}
}
}

최솟값 조회

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
curl -XGET -H 'Content-Type:application/json' 'localhost:9200/_search?pretty' --data-binary @min_points_aggs.json
{
"took" : 268,
"timed_out" : false,
"_shards" : {
"total" : 7,
"successful" : 7,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 50,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"min_score" : {
"value" : 20.0
}
}
}

다음과 같이 정상적으로 Metric Aggregation을 사용하여 최솟값을 구한것을 확인할 수 있습니다.

모든합(SUM) 구하기

Data

1
2
3
4
5
6
7
8
9
10
11
{
"size" : 0,
"aggs" : {
"sum_score" : {
"sum" : {
"field" : "points"
}
}
}
}

모든합 조회

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
curl -XGET -H 'Content-Type:application/json' 'localhost:9200/_search?pretty' --data-binary @sum_points_aggs.json
{
"took" : 17,
"timed_out" : false,
"_shards" : {
"total" : 7,
"successful" : 7,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 50,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"sum_score" : {
"value" : 50.0
}
}
}

다음과 같이 정상적으로 Metric Aggregation을 사용하여 모든합을 구한것을 확인할 수 있습니다.

모든값 목록 (STAT) 구하기

Data

1
2
3
4
5
6
7
8
9
10
{
"size" : 0,
"aggs" : {
"stats_score" : {
"stats" : {
"field" : "points"
}
}
}
}

모든값 목록 (STAT) 구하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
curl -XGET -H 'Content-Type:application/json' 'localhost:9200/_search?pretty' --data-binary @stat_points_aggs.json
{
"took" : 66,
"timed_out" : false,
"_shards" : {
"total" : 7,
"successful" : 7,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 50,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"stats_score" : {
"count" : 2,
"min" : 20.0,
"max" : 30.0,
"avg" : 25.0,
"sum" : 50.0
}
}
}

다음과 같이 정상적으로 Metric Aggregation을 사용하여 모든 연사결과의 목록을 구한것을 확인할 수 있습니다.

Reference

https://esbook.kimjmin.net/08-aggregations/8.1-metrics-aggregations