Cardinality (카디널리티) 집계

카디널리티 집계는 단일 숫자 메트릭 집계다. 개수와 유사하지만 중복된 값을 제외하고 고유한 값에 대한 개수를 집계한다.

⚠️ 카디널리티 집계는 성능에 큰 영향을 줄 수 있기 때문에 정확한 값을 제공하지는 않고 근사치를 제공한다.

GET apache-web-log/_search?size=0
{
  "query": {
    "term": {
      "geoip.country_name.keyword": "United States"
    }
  },
  "aggs": {
    "us_cadinality": {
      "cardinality": {
        "field": "geoip.city_name.keyword"
      }
    }
  }
}
# 결과
{
  ...
  "aggregations" : {
    "us_cadinality" : {
      "value" : 206
    }
  }
}

근사치 계산

카디널리티 집계는 HyperLogLog++ 알고리즘을 기반으로 동작한다. 이 알고리즘을 해시를 기반으로 카운팅을 수행하며 다음과 같은 특징이 있다.

정확도는 precision_threshold 옵션으로 설정이 가능하다. 0~40000의 값을 설정가능하며, 일반적으로 카디널리티가 precision 보다 작은 경우 거의 100%의 정확도를 자랑한다.

해시 기반으로 작동하므로 미리 해시값을 구해두면 성능이 향상된다. 해시 계산에는 murmur3 알고리즘이 사용되는데, 색인할때 이 해시값을 미리 계산하기 위해서는 murmur3 플러그인이 설치되어 있어야하고 type 세팅이 되어야한다. (https://www.elastic.co/guide/en/elasticsearch/reference/7.6/search-aggregations-metrics-cardinality-aggregation.html#_pre_computed_hashes)

Percentiles (백분위 수) 집계

백분위 수 집계는 다중 숫자 메트릭이다. 숫자 필드 값의 퍼센타일(백분위수) 구간 분포(히스토그램)를 집게한다.

GET apache-web-log/_search?size=0
{
  "aggs": {
    "bytes_percentiles": {
      "percentiles": {
        "field": "bytes"
      }
    }
  }
}

그러면 bytes의 퍼센타일 집계를 응답한다.