Go, Vantage point
가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.
Github | https://github.com/overnew/
Blog | https://everenew.tistory.com/
티스토리 뷰
Elastic Search에서 search를 진행할 때 매칭되는 것이 너무 많으면, 요청한 측에서 처리하기가 곤란할 수 있다.
이를 위해서는 페이징 기술이 필요한데, Elastic search에서는 3가지의 페이징 기능을 제공한다.
각각은 장단점이 있기 때문에 상황에 맞게 선택할 필요가 있다.
3가지의 장단점에 대한 내용은 아래의 블로그 게시글이 잘 정리하고 있으니 참조하자.
https://blog.naver.com/occidere/222686762033
이번에 사용해 볼 페이징 기능은 Search after이다.
본인이 운영하고 있는 채용 공고 검색 Slack Bot은 여러 곳에서 크롤링된 채용 공고를 간단하게 검색할 수 있도록 도와준다.
이때 특정 키워드로 검색된 데이터를 얼마나 보여줘야 하는지에 대해 고민이 있었다.
단순히 12개씩 보여주는 것은 유저가 더 많은 내용을 확인하고 싶을때 문제가 발생한다.
따라서 추가적인 검색 질의가 이어서 가능하도록 페이징 기능이 필요하다.
유저마다 질의 내용을 미리 context에 저장시키는 것은 cost가 크다.
따라서 추가적인 질의를 한 경우에 이어진 내용을 탐색하는 stateless형식인 Search after가 적절하다고 판단했다.
Search after
https://www.elastic.co/guide/en/elasticsearch/reference/current/paginate-search-results.html
Search after는 질의를 특정 필드로 sort한 경우에만 사용할 수 있다.
위의 예시처럼 date와 id값으로 sort를 하게되면, 질의응답내용에 아래와 같이 sort 필드에 값이 담겨오게 된다.
14635338857 은 date 필드를 통해 만들어진 sort 값이고
654323은 id 필드의 값을 의미한다.
해당 인덱스에 다시 동일한 질의를 할때 이 sort 값 이후의 값을 요청하는 것이 바로 search_after이다.
하지만 본인은 채용 공고는 단순히 date로 sort 하는 것보다는
검색한 keyword에 맞는 더 적절한 채용공고를 응답해주고 싶었다.
따라서 score에 대한 sort가 필요하다.
이를 위한 python 코드는 다음과 같다.
테스트해본 결과 _score 값 하나만의 sort는 응답에 sort를 제공해주지 않는다.
따라서 적절한 두 번째 sort field가 필요하다.
단순히 _id로도 하면 좋겠지만, _id 필드의 참조는 성능저하를 일으키므로 기본적으로 세팅이 막혀있다.
그러므로 search_after를 이용하기 위해서는 sort를 위한 적절한 field를 미리 준비해 두자.
'개발 > Elastic Search' 카테고리의 다른 글
Elastic Search 날짜(거리)로 Score 계산하기 (0) | 2023.12.12 |
---|---|
Elastic Search HTTP 쿼리 요청하기 (python) (0) | 2023.10.24 |
Elastic Search 구조 간단 이해 (0) | 2023.07.12 |