데이터를 그룹화하고 통계를 얻고자 할 때 사용하는 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}]}}}
'IT > Elasticsearch' 카테고리의 다른 글
Elasticsearch - Aggregation - extended_stats (0) | 2020.09.15 |
---|---|
Elasticsearch - Aggregation - date historgram (0) | 2020.09.15 |
ElasticSearch - kibana (visualize 분석) (0) | 2020.09.09 |
Elasticsearch 검색 (Query DSL) (0) | 2020.09.09 |
Elasticsearch 설치 (0) | 2020.09.02 |