엘라스틱서치 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