[Elasticsearch] 전체 개수 가져오기

[원본 링크]

그냥 검색 결과만을 가져온다면 문제가 없지만, 검색결과의 개수를 전부 가져와서 쓸 일이 있을 경우, 약간 신경을 써줘야 하는 부분이 있다.

그냥 적당한 개수의 항목만을 검색하는 경우에는 문제가 없다.

저기서 hits.total.value값으로 잘 던져서 주기 때문이다.

하지만 여기엔 큰 한계가 있는데...

10000개를 넘는 값은 셀 수 없다는 것이다.

이건 elasticsearch의 근본적인 구조와도 직결된 문제인데, 사실 엘라스틱서치는 검색을 할때 모든 항목을 한번에 가져오지는 않는다.
기본적으로 페이징을 통해 적절히 잘라서 처리하는데, 이 페이징 사이즈의 기본값이 10000이다. 그래서 count도 10000까지밖에 세지 못하는 것이다.

이걸 해결하는데는 몇가지 방법이 있는데...
페이징 사이즈를 늘리는건 성능에 심각한 결함을 부를 수 있으니 차치하겠다.




track_total_hits 값

이걸 전달하면 페이징 개수를 고려하지 않고 매칭되는 모든 항목을 추적한다.
그래서 전체값을 항상 확인할 수 있다.

10000개가 넘을 때는 속도가 비교적 느려질 수는 있지만,
10000개를 넘지 않는 경우에는 알아서 조건을 무시해서 효율적으로 동작한다.




count API 사용

이건 개수 획득만을 위한 전용 API다.
딱 개수만을 가져오는 경우라면 대체로 이게 더 효율적이다.

GET or POST "인덱스명/_count"의 형태로 호출할 수 있으며,
대체로 _search와 유사한 형식으로 호출할 수 있다.

그럼 동일하게 잘 가져올 것이다.



참조
https://stackoverflow.com/questions/49704784/elasticsearch-limit-count-result
https://stackoverflow.com/questions/66858457/elasticsearch-count-api-vs-searchapi-with-track-total-hits-set-to-true