ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • elasticsearch search type query then fetch and dfs
    elasticsearch 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

    댓글

Designed by Tistory.