2015년 10월 13일 화요일

Elasticsearch search type

분산된 검색(distributed search)를 실행할 때 여러가지 실행 방법이 있을 수 있다.
분산된 검색 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와 동일하다. 이 모드는 사용자에 의해서 지정되지 않아야한다. 



댓글 없음:

댓글 쓰기