분산된 검색 operation은 모든 relevant한 shard들로 흩어지고 다시 그 결과들을 모아오는 것이 필요하다.
특히, 검색엔진에서는 뿌리고(scatter)/모으는(gather) 실행에 있어 여러가지 방법이 있다.
분산 검색을 실행할 때 문제는 각 shard들에서 어느 정도의 result들을 받아 올 것인가라는 문제가 있다. 예를 들어 우리에게 10개의 shard가 있다고 가정했을 때, 첫번째 shard에 가장 relevant한 0부터 10까지의 결과가 있고, 나머지 shard들에 그 이하 ranking의 0부터 10까지의 문서들이 있다고 하자.
이런 이유로 request를 실행할 때 정확한 결과를 얻고자 한다면, 전체 shard에서 각 0부터 10까지의 결과를 가져와서 sorting하고 그 결과를 리턴한다.
또 검색엔진과 관련된 문제로 term frequency들을 구하는 문제에서 하나의 shard는 다른 shard들의 결과를 고려하지 못한다. 정확한 ranking을 위해서 우리는 global term frequency를 구하기 위해 먼저 전체 shard의 term frequency들을 다 모아야하고, 그 global frequency를 사용해서 각 shard에서 query를 수행해야한다.
큰 document set에 대해 result들을 sort하거나 scrolling할 필요가 있기 때문에 올바른 sorting을 실행하는데 들어가는 비용이 상당하다. 큰 result set에 대해서 sorting 없이 scrolling하기위해서는 scan search type을 사용하면 된다.
Elasticsearch에서는 개별 search 단위로 search_type 파라메터를 지원하여 유연한 검색 type을 사용할 수 있도록 해준다.
Query Then Fetch
parameter value: query_then_fetch
request가 두가지 단계로 실행된다. 첫번째로, query들이 과련된 모든 shard로 보내진다.
각 shard들은 search(검색)을 진행하고 sorting된 결과 리스트를 생성한다.
각 shard들은 적당한 정도의 정보(just enough information)을 coordinating node로 전달하여 shard level의 result들을 merge하고 resort하여 maximum length size만큼의 global한 sorting된 result들을 만들게 한다.
이게 search_type이 정해지지 않은 request의 default setting이다.
Dfs, Query Then Fetch
Parameter value : dfs_query_then_fetch
"Query Then Fetch"와 동일한데, initial scatter 단계에서 더 나은 정확도를 위해 distributed term frequency를 계산하는 것만 다르다.
Count
Parameter value : count
특별한 search type으로 document를 제외하고 search request에 matche된 count만 return한다. (total_hits로 표현됨)
그리고 facets 결과도 같이 포함 될 수 있다. 보통 count API가 더 많은 옵션을 가지기 때문에 더 좋다.
Scan
Parameter value:scan
scan search type은 ordering을 하지 않도록 하여 large result sets을 사용할 때에 더 효과적으로 scrolling할 수 있도록 한다.
추가적인 내용을 위해서는 Efficient scrolling with Scroll-Scan문서를 확인하면 된다.
Query And Fetch
Parameter value : query_and_fetch
qeury and fetch mode는 ES내(internal)의 optimization으로 query_then_fetch request가 하나의 shard로만 targeting되는 경우에 저동으로 선택된다.
query_then_fetch가 single pass로 실행된다. 이 mode는 사용자에 의해서 지정되지않아야 한다.
Dfs, Query And Fetch
Parameter value : dfs_query_and_fetch
initial scatter 단계에서 distributed term frequency를 더 적확하게 scoring하는 것을 제외하고는 query_and_fetch와 동일하다. 이 모드는 사용자에 의해서 지정되지 않아야한다.
댓글 없음:
댓글 쓰기