카디널리티 집계는 단일 숫자 메트릭 집계다. 개수와 유사하지만 중복된 값을 제외하고 고유한 값에 대한 개수를 집계한다.
⚠️ 카디널리티 집계는 성능에 큰 영향을 줄 수 있기 때문에 정확한 값을 제공하지는 않고 근사치를 제공한다.
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%의 정확도를 자랑한다.
precision_threshold * 8byte 를 사용하므로 상황에 따라 조절을 하면 된다. 디폴트는 3000 이다.해시 기반으로 작동하므로 미리 해시값을 구해두면 성능이 향상된다. 해시 계산에는 murmur3 알고리즘이 사용되는데, 색인할때 이 해시값을 미리 계산하기 위해서는 murmur3 플러그인이 설치되어 있어야하고 type 세팅이 되어야한다. (https://www.elastic.co/guide/en/elasticsearch/reference/7.6/search-aggregations-metrics-cardinality-aggregation.html#_pre_computed_hashes)
백분위 수 집계는 다중 숫자 메트릭이다. 숫자 필드 값의 퍼센타일(백분위수) 구간 분포(히스토그램)를 집게한다.
GET apache-web-log/_search?size=0
{
"aggs": {
"bytes_percentiles": {
"percentiles": {
"field": "bytes"
}
}
}
}
그러면 bytes의 퍼센타일 집계를 응답한다.