Cardinality Aggregation
특정 필드에 대해 유니크한 값들만 갯수를 세는 방식을 의미한다.
알고리즘
ES(Elastic Search)는 HyperLogLog++ 알고리즘을 활용해 유니크 값을 세게 되는데, 정확한 값이 아닌 근사값을 활용하여 메모리 효율성 및 퍼포먼스를 개선한다.
문제는 이 정확도가 100%가 아니라는 점이다. ES측에서는 precision threshold를 100으로 낮게 잡더라도 relative error가 1~6% 내외라고 무시할만하다고 하는데, 사용측 입장에서는 난감하기 그지 없다.
실제로 기본설정 상태에서 15,000여 개의 값에 대해 Unique Count를 조회했더니 실제와 200개 가까이 차이가 났다. 1.3% 정도 차이가 있는 셈인데 아주 정확한 Unique Count를 확인해야 한다면 이는 불편함이 아닐 수 없다.
Precision control
다만 precision control이 불가능하지는 않다. threshold 값을 적절히 조절하면 보다 정확하게 측정 가능하다.
아래처럼 설정 가능하며 default는 3,000이다. 최대 40,000까지 지원되며, threshold보다 작은 값에 대해서는 정확한 계산이 이뤄진다.
{
"precision_threshold": 10000
}
결론
따라서, Unique Count를 사용해야할 경우, threshold를 적절히 조절하거나, 서드파티 애플리케이션을 통해 집계 작업을 진행하는 것이 좋다.