elasticsearch percentiles aggregation error

개발새발·2023년 1월 21일
0

elasticsearch

목록 보기
43/54

aggregation 을 사용하여 쿼리를 날리는 곳에서 특정 인덱스에 아래와 같은 에러가 생겼다. 그래서 이게 뭐지? 하고 찾아보게 됐다.

에러

{\"error\":{\"root_cause\":[{\"type\":\"array_index_out_of_bounds_exception\",\"reason\":\"The value -3.21E8 is out of bounds for histogram, current covered range [8192.0, 1.44115188075855872E17) cannot be extended any further.\\nCaused by: java.lang.ArrayIndexOutOfBoundsException: Negative values cannot be recorded\"}

원인은?

원인을 찾다가 보니 아래처럼 percentiles aggregation 쿼리문을 사용하고 있는 곳에서 hdr 라는 단어를 발견했다.

{
            'size' => 0,
            'query' => {
                'bool' => {
                    'filter' => {
                        'bool' => {
                            'must' => []
                        }
                    }
                }
           },
            "aggs" => {
                "price" => {
                    "percentiles" => {
                        "field" => "price",
                        "percents" => [20, 40, 60, 80, 99.9], 
                        "hdr" => {"number_of_significant_value_digits" =>  3},
                    }
                }
            }
}

찾아보니 hdr 은 HDRHistogram 이라는 것이였는데, 이는 사용자가 지정한 구간을 내부적으로 더 세부적으로 나눠 미리 선언된 버킷에 저장하게 된다. 그 후 해당 버킷에 있는 값을 사용하여 계산하게 된다.

이때, HDRHistogram는 양수값만 지원하기 떄문에 음수값이 전달되면 오류가 발생하게 되는데, 쿼리에 대한 응답값에 음수가 존재하고 있었다… (ㅠㅠ)


해결

HDRHistogram을 사용하는 필드가 가격..필드이기에 일단 음수값이 있다는 것이 성립하지 않는다. 그래서 데이터를 보정하고, 데이터가 들어올 때 만약 가격이 음수로 들어온 데이터가 있다면 노출하지 않는 데이터로 처리하기로 했다.


cc. https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-percentile-aggregation.html

profile
발새발개

0개의 댓글