프로필사진

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

 

[Paging] Elasticsearch 의 페이징 방식 3가지 요약

Elasticsearch 의 페이징 처리 방식 3가지 1. Random access with size & from params - 매번 검색할...

blog.naver.com

 

 

 

이번에 사용해 볼 페이징 기능은 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

 

Paginate search results | Elasticsearch Guide [8.11] | Elastic

All PIT search requests add an implicit sort tiebreaker field called _shard_doc, which can also be provided explicitly. If you cannot use a PIT, we recommend that you include a tiebreaker field in your sort. This tiebreaker field should contain a unique va

www.elastic.co

 

 

 

Search after는 질의를 특정 필드로 sort한 경우에만 사용할 수 있다.

 

 

위의 예시처럼 date와 id값으로 sort를 하게되면, 질의응답내용에 아래와 같이 sort 필드에 값이 담겨오게 된다.

 

 

 

 

 

14635338857 은  date 필드를 통해 만들어진 sort 값이고

654323은 id 필드의 값을 의미한다.

 

해당 인덱스에 다시 동일한 질의를 할때 이 sort 값 이후의 값을 요청하는 것이 바로 search_after이다.

 

 

질의에 search_after를 추가하면 된다.

 

 

 

 

하지만 본인은 채용 공고는 단순히 date로 sort 하는 것보다는

검색한 keyword에 맞는 더 적절한 채용공고를 응답해주고 싶었다.

따라서 score에 대한 sort가 필요하다. 

 

이를 위한 python 코드는 다음과 같다.

 

 

 

 

테스트해본 결과 _score 값 하나만의 sort는 응답에 sort를 제공해주지 않는다.

따라서 적절한 두 번째 sort field가 필요하다.

 

단순히 _id로도 하면 좋겠지만, _id 필드의 참조는 성능저하를 일으키므로 기본적으로 세팅이 막혀있다. 

그러므로 search_after를 이용하기 위해서는 sort를 위한 적절한 field를 미리 준비해 두자.

 

 

 

 

반응형
댓글
반응형
인기글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함