본문 바로가기
IT/Elasticsearch

Elasticsearch 검색 - Aggregation

by 최고영회 2020. 9. 14.
728x90
반응형
SMALL

데이터를 그룹화하고 통계를 얻고자 할 때 사용하는 Aggregation

RDBMS에서 GROUP BY SUM 과 같은 역할을 말한다.

[Metric 집계]

숫자타입으로 동작하며 주어진 컨텍스트에서 숫자필드의 집계값을 계산하는데 사용한다.

- sum, avg, max, min

- 날짜별 결과건수 합계 데이터 가져오기 예제

"aggs": { 
  "date_over": { 
    "terms": { 
      "field": "date", 
      "order": { 
        "_key":"asc" 
      } 
    }, 
    "aggs": { 
      "count":{ 
        "sum":{ 
          "field": "rtnCount" 
        } 
      } 
    } 
  } 
}

결과 예제

 {
   "took": 1, 
   "timed_out": false, 
   "_shards": { 
     "total": 1, 
     "successful": 1, 
     "skipped": 0, 
     "failed": 0 
   }, 
   "hits": { 
     "total": { 
       "value": 10000, 
       "relation": "gte" 
     }, 
     "max_score": null, 
     "hits": [] 
   }, 
   "aggregations": { 
     "date_over": { 
       "doc_count_error_upper_bound": 0, 
       "sum_other_doc_count": 65000, 
       "buckets": [ 
         { 
           "key": 1599523200000, 
           "key_as_string": "2020-09-08T00:00:00.000Z", 
           "doc_count": 30700, 
           "count": { 
             "value": 3.67341396E8 
           } 
         }, 
         { 
           "key": 1599609600000, 
           "key_as_string": "2020-09-09T00:00:00.000Z", 
           "doc_count": 10600, 
           "count": { 
             "value": 1.26873604E8 
           } 
         }, 
         { 
           "key": 1599696000000, 
           "key_as_string": "2020-09-10T00:00:00.000Z", 
           "doc_count": 99000, 
           "count": { 
             "value": 1.187078416E9 
           } 
         } 
       ] 
     } 
   } 
 }

stats 키워드를 이용하면 min, max, avg, sum 을 한번에 확인할 수 있다.

{
  "aggs": { 
    "rtnCount_stats": { 
      "stats": { 
        "field": "rtnCount" 
      } 
    }, 
    "size": 0 
  }
}

---- 결과 일부 
"aggs": { 
  "rtnCount_stats": { 
    "count": 219600, 
    "min": 5520.0, 
    "max": 18041.0, 
    "avg": 11985.39507741348, 
    "sum": 2.631992759E9 
  } 
}

"extends_stats" 키워드 이용시 위 정보 외에 제곱, 분산, 표준편차, 표준편차 구간도 함께 확인 가능하다.

[Bucket 집계]

사실 위에서 살펴본 `날짜별 결과건수 합계 데이터 가져오기 예제` 가 Bucket 집계를 이용한 것이다.

그리고 집계 결과 안에서 다시 집계를 하기 때문에 Pipeline 집계도 함께 이용했다.

Bucket key로 식별되는 bucket에서 데이터를 분할하여 그룹화 하는 것. 즉 SQL의 GROUP BY.

{
  "aggs": { 
    "date_over": {        // 집계 이름 (마음대로 지정) 
      "terms": {          // Terms 집계 
        "field": "date",  // 집계 대상 Field (date 라는 이름의 필드로 집계) 
        "order": {        // 집계 대상 Field 의 값으로 ordering 
          "_key":"asc" 
        } 
      }, 
      "aggs": {           // 집계된(그룹핑된) 데이터를 다시 한번 집계 
        "count":{         // 집계 이름 (마음대로 지정) 
          "sum":{         // 집계 구분 
            "field": "rtnCount" // 집계 대상 Field (날짜별로 그룹핑하고 rtnCount 필드의 sum 을 구함 
          } 
        } 
      } 
    } 
  }
}

당연히 집계는 query 와 함께 사용하여 전체 데이터가 아닌 필요한 데이터에 대해서만 집계 할 수 있다.

위 쿼리에 아래 필터를 추가 하면 2020년 9월 데이터에 대해서만 집계 한다.

"query": { 
  "bool": { 
    "filter": [ 
      { 
        "range" : { 
          "date" : { 
            "gte" : "2020-09-01", 
            "lte": "2020-09-14" 
          } 
        } 
      } 
    ] 
  } 
}

위 집계 외 여러 집계들도 존재한다.

아직까지(초반 공부) 내가 필요로 하는 집계 내용은 아니기에 간단히 정리만 한다.

- Histogram 집계 : 숫자데이터를 100~200, 200~300, ... 등 분할 범위로 bucket화 하는 방법

"aggs": { "by_count": { "histogram": { "field": "rtnCount", "interval": 100}}}

- Range 집계 : 범위를 from, to로 지정 (to만 지정할 경우 지정한 값까지 해당하는 모든 document를 포함)

"aggs": { "by_"count": {"range": {"filed": "rtnCount", "ranges": [{"to": 1000}, {"from": 1000, "to": 2400}, {"from": 2400, "to":30000}]}}}

728x90
반응형
LIST