집계 실행

edit

집계는 데이터를 그룹화하고 통계치를 얻는 기능입니다. SQL GROUP BY 및 SQL 집계 기능과 대략 같다고 보면 가장 쉽게 이해할 수 있습니다. Elasticsearch에서는 하나의 응답에서 검색 적중을 반환하는 검색을 실행함과 동시에 그와는 별도로 집계 결과를 반환할 수 있습니다. 즉 간결한 API를 사용하여 쿼리와 여러 집계를 실행하고 두 작업(또는 둘 중 하나)의 결과를 한꺼번에 얻어 네트워크 왕복을 피할 수 있다는 점에서 강력하고 효율적입니다.

먼저 이 예는 주를 기준으로 모든 계정을 그룹화하고 내림차순(기본 설정)으로 상위 10개(기본 설정) 주를 반환합니다.

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword"
      }
    }
  }
}

위 집계는 개념상 다음 SQL과 비슷합니다.

SELECT state, COUNT(*) FROM bank GROUP BY state ORDER BY COUNT(*) DESC

다음은 응답의 일부입니다.

{
  "took": 29,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits" : {
    "total" : 1000,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "group_by_state" : {
      "doc_count_error_upper_bound": 20,
      "sum_other_doc_count": 770,
      "buckets" : [ {
        "key" : "ID",
        "doc_count" : 27
      }, {
        "key" : "TX",
        "doc_count" : 27
      }, {
        "key" : "AL",
        "doc_count" : 25
      }, {
        "key" : "MD",
        "doc_count" : 25
      }, {
        "key" : "TN",
        "doc_count" : 23
      }, {
        "key" : "MA",
        "doc_count" : 21
      }, {
        "key" : "NC",
        "doc_count" : 21
      }, {
        "key" : "ND",
        "doc_count" : 21
      }, {
        "key" : "ME",
        "doc_count" : 20
      }, {
        "key" : "MO",
        "doc_count" : 20
      } ]
    }
  }
}

ID(아이다호)에 계정 27개, TX(텍사스)에 계정 27개, AL(앨라배마)에 계정 25개가 있습니다.

응답에서 집계 결과만 보고 싶기 때문에 검색 적중을 표시하지 않도록 `size=0`을 설정했습니다.

이 예는 앞의 집계를 바탕으로 주별 평균 계정 잔액을 계산합니다. 여기서도 개수를 기준으로 내림차순 정렬하여 상위 10개 주만 선택합니다.

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword"
      },
      "aggs": {
        "average_balance": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}

group_by_state 집계 내에 average_balance 집계를 어떻게 중첩시켰는지 보십시오. 이는 모든 집계의 공통 패턴입니다. 데이터에서 필요한 피벗 요약을 얻고자 임의로 집계 내에 집계를 중첩시킬 수 있습니다.

앞의 집계를 바탕으로 평균 잔액 내림차순으로 정렬해보겠습니다.

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword",
        "order": {
          "average_balance": "desc"
        }
      },
      "aggs": {
        "average_balance": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}

이 예는 연령대(20-29, 30-39, 40-49)를 기준으로, 그 다음에는 성별을 기준으로 삼아 그룹화하고 연령대, 성별 기준 평균 계정 잔액을 구하는 방법을 보여줍니다.

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "group_by_age": {
      "range": {
        "field": "age",
        "ranges": [
          {
            "from": 20,
            "to": 30
          },
          {
            "from": 30,
            "to": 40
          },
          {
            "from": 40,
            "to": 50
          }
        ]
      },
      "aggs": {
        "group_by_gender": {
          "terms": {
            "field": "gender.keyword"
          },
          "aggs": {
            "average_balance": {
              "avg": {
                "field": "balance"
              }
            }
          }
        }
      }
    }
  }
}

다른 여러 집계 기능도 있지만 여기서 자세히 다루지는 않겠습니다. 더 자세히 알아보고 싶다면 집계 참조 가이드가 좋은 출발점이 될 것입니다.