-
elasticsearch search type query then fetch and dfselasticsearch 2021. 3. 25. 21:51반응형
GET test/_search?search_type=dfs_query_then_fetch { "query": { "match_phrase_prefix": { "title": { "query": "d", "max_expansions": 5 } } } } 응답 결과 "_score" : 1.0, "_source" : {"title":"drunk"} "_score" : 0.30685282, "_source" : {"title":"dzone"} "_score" : 0.30685282, "_source" : {"title":"data"} "_score" : 0.30685282, "_source" : {"title":"drive"}
왜 "drunk"라는 값을 포함하는 문서의 스코어만 1.0이고 그 외에는 0.3일까?
적합한 스코어
ES에서 사용하는 스코어링 알고리즘에는 해당 인덱스에있는 문서의 관련성을 계산하는 데 도움이되는 "TF-IDF"라는 통계 정보가 포함되어 있다
TF-IDF의 기본 개념은 해당 문서에 키워드가 빈번하게 있는지, 해당 키워드를 포함하는 문서의 개수가 전체 개수 대비 적을 때 스코어링 값은 높아진다
es에서 인덱스는 각 샤드를 포함하고 있으며 각 샤드는 루씬으로 이루어져있는데 각 루씬은 다른 서버 혹은 같은 서버라도 서로 다른 서버로 인식된다 왜냐하면 루씬은 분산처리 시스템이 아니기 때문이다
그래서 루씬 인덱스는 각각의 자신의 대한 통계 정보만 알고 있다 그래서 각 프라이머리 샤드끼리의 idf가 다른 것이다
실제로 explain: true로 tf-idf를 보면 idf값이 고정이지만 각 샤드별로 다른 값을 가진 것을 볼 수 있을 것이다
만약 idf 값이 동일하도록 해주는 것이 필요하다면 dfs_query_then_fetch을 사용하면 된다 아래와 같이 검색하면 동일하게 하는 것이 가능하다
GET index_name/_search?search_type=dfs_query_then_fetch
위와 같이 검색시 dl, length of field를 제외하고는 다 같은 값이라는 것을 확인 할 수 있다 물론 idf도 마찬가지이다
과연 공짜일까?
그런데 위의 같이 검색하면 스코어링 값은 더 정확해지지만 결코 공짜(인덱스 크기, 샤드 수, 쿼리 빈도 등)는 아니다 그 이유는 최초에 각 샤드를 미리 쿼리하고 용어 및 문서 빈도에 대한 값을 요청하고 query 단계에서 정렬시 해당 값을 사용하여 정렬한다. 인덱스가 크다면 색인된 문서수가 많다는 소리이며 샤드 수가 많다면 결국 요청해야 할 개수가 많아진다는 것을 의미한다
문서수가 작을 경우에 더 효과가 뚜렷하다
다큐먼트가 많다면 효과는 미미하며 인덱스의 문서수가 적은 곳에 사용해야 효과가 있을 것이다 이유는 문서가 각 평균 100만개 있다고 했을 때 A샤드는 100만개 B샤드에 101만개 있다고 했을 때 100만개와 101만개는 1만개 차이가 난다 근데 100만개에서 1만개면 1프로이다 1프로가 영향을 줄 수도 있겠지만 영향이 희박해진다
그러나 500개 550개가 있다면 문서수는 50개 차이지만 10프로의 영향을 주게 된다 그러므로 문서가 별로 없을 경우에 효과가 더 뚜렷하게 나타나는 것이다
반응형'elasticsearch' 카테고리의 다른 글
elasticsearch sprase docvalue (0) 2021.04.13 elasticsearch segments 2부 (0) 2021.03.27 elasticsearch close api (0) 2021.03.24 elasticsearch segments 병합 전략과 스케줄링 (0) 2021.03.23 elasticsearch segments 1부 (0) 2021.03.20