본문 바로가기
👩‍💻TIL/엘라스틱서치

[ElasticSearch] QueryPhaseExecutionException: Result window is too large 에러

by devuna 2020. 4. 2.
728x90

[ElasticSearch] QueryPhaseExecutionException: Result window is too large 에러

org.elasticsearch.search.query.QueryPhaseExecutionException: Result window is too large, 
from + size must be less than or equal to: [10000] but was [232131].
See the scroll api for a more efficient way to request large data sets. 
This limit can be set by changing the [index.max_result_window] index level setting.

오전까지 잘되던 검색 api에서 갑자기 오류가 발생했다.

어려운 엘라스틱서치의 세계....😂

 

이유를 보니 가져올 결과의 숫자가 1만 건 넘어가게 되면 발생되는 오류라고 한다. 

별도의 세팅값을 주지않고 수십만 건의 데이터가 저장된 서버의 full scan을 시도하여 발생한 것이다. 

(엘라스틱 서치의 수집 시간 성능을 테스트해보고 싶어 임의로 대량의 데이터를 넣고 실행한 것이다.)

 

💡 오류를 해결하는 가장 간편한 방법 으로는

    index.max_result_window index level setting을 조정하는 것이다. 

 

엘라스틱서치에서는 인덱스를 생성할 때, 
기본적으로 하나의 노드에 다섯 개의 샤드(shard)가 생성되며 각 샤드에 데이터를 나누어서 저장한다. 

만약 다섯개의 샤드가 있는 노드에 위치한 인덱스(index)에서 유사한 10 개의 데이터를 찾는다면
각 샤드에서 10개의 데이터를 찾고 모아서 정렬 작업을 한 50개의 데이터 중 다시 상위 10건의 데이터를 반환한다.

그래서 만약 1만 건 이상의 대량의 데이터를 검색할 경우 해당 데이터를 모아야 하고
모은 데이터를 다시 정렬해야 하기 때문에 성능적인 문제를 야기할 수 있다.

그래서 엘라스틱서치에서는 max_result_window라는 이름으로 검색 제한을 두었는데, 기본값이 1만 건으로 되어있다.

(이 기본값이 1만 건이기 때문에, 1만 건이상의 데이터를 조회하려고 하면 오류가 발생하는 것이다.)

 

max_result_window는 아래 쿼리를 이용하여 최대 50000까지 설정할 수 있다.

 

PUT   your_index_name/_settings

{ 

  "max_result_window" : 500000 

}

그러나 근본적으로 10000건 이상의 조회를 요청하면 많은 리소스 사용으로 성능 문제를 야기할 수 있기 때문에 함부로 max_result_window 설정을 바꾸기보다는 검색조건을 잘 설계하여 10000개가 한 번에 검색되지 않도록 하는 것이 좋다. 

 

그리고 전체 결과 값이 5만 건이 넘거나, 정확히 얼마만큼의 제한을 둘지 모르는 경우에는

스크롤(Scroll api)을 사용한 Scroll search를 사용하면 되는데, 그 사용법에 대해서는 따로 포스팅을 할 예정이다.

👇 관련글 보러가기

728x90

댓글