2017-01-28 2 views
1

3 개의 샤드와 2 개의 복제본이있는 노드가 3 개인 Elasticsearch 클러스터를 만들었습니다. 같은 쿼리를 사용하면 동일한 데이터로 동일한 인덱스에 도달 할 때 다른 결과가 인출됩니다. 지금 결과는 기본적으로 _score 필드 desc (나는 그것의 기본 정렬 방법이라고 생각합니다)에 의해 정렬되고 요구 사항은 결과가 거기에 따라 내림차순으로 정렬되기를 원합니다. 그래서 여기 내 질문에 동일한 쿼리가 다른 결과를 내고, 동일한 쿼리로 매번 동일한 결과를 갖도록 수정할 수있는 이유는 무엇입니까?Elasticsearch Cluster에서 동일한 쿼리에 대해 다른 결과가 발생했습니다.

쿼리는 탄성이 어떤 성능을 절약하기 위해 각 파편에 지역 IDF를 사용하여 기본적으로

{ 
"from": 0, 
"size": 10, 
"query": { 
    "bool": { 
     "must": { 
      "bool": { 
       "must": { 
        "terms": { 
         "context": [ 
          "my name" 
         ] 
        } 
       }, 
       "should": { 
        "multi_match": { 
         "query": "test", 
         "fields": [ 
          "field1^2", 
          "field2^2", 
          "field3^3" 
         ] 
        } 
       }, 
       "minimum_should_match": "1" 
      } 
     }, 
     "filter": { 
      "bool": { 
       "must": [ 
        { 
         "terms": { 
          "audiencecomb": [ 
           "1235" 
          ] 
         } 
        }, 
        { 
         "terms": { 
          "consumablestatus": [ 
           "1" 
          ] 
         } 
        } 
       ], 
       "minimum_should_match": "1" 
      } 
     } 
    } 
} 

}

감사 Ashit에게 IDF를 배포 할 수있는 가능한 이유의

+0

PLZ 쇼 매핑/질의을? – Mysterion

+0

@Mysterion이 쿼리를 첨부했습니다. 전체 인덱스에 대한 매핑이 너무 큽니다. 매핑없이 나를 도울 수 있습니다. –

+0

숫자가 다른지 확인할 수 있습니까? 아니면 주문/점수 만 다릅니 까? – Mysterion

답변

1

하나를 부착하는 클러스터 전체에서 다른 idfs로 이어집니다. 따라서 ?search_type=dfs_query_then_fetch을 시도해보십시오. 명시 적으로 글로벌 IDF를 계산하도록 Elastic에 요청합니다.

그러나 성능상의 이유로 Elasticsearch는 인덱스의 모든 문서에서 IDF를 계산하지 않습니다. 대신, 각 샤드는 해당 샤드에 포함 된 문서에 대해 로컬 IDF 인 을 계산합니다.

문서가 잘 배포되어 있기 때문에 두 샤드의 IDF는 모두 입니다. 대신 foo 문서 중 다섯 개는 샤드 1에 있고 여섯 번째 문서는 샤드 2에 있습니다.이 시나리오에서 foo라는 용어는 하나의 샤드에서 매우 공통적으로 사용됩니다 (따라서 중요도는 적음). 다른 샤드 (그리고 훨씬 더 중요한). IDF의 이러한 차이로 인해 잘못된 결과가 발생할 수 있습니다.

실제로 이것은 문제가되지 않습니다. 로컬 IDF와 글로벌 IDF 간의 차이점은 인덱스에 추가하는 문서가 많아 질수록 줄어 듭니다. 실제 데이터 볼륨이 인 경우 로컬 IDF가 곧 고갈됩니다. 문제 은 관련성이 손상되지는 않았지만 데이터가 너무 적다는 것을 의미합니다.

테스트 목적으로이 문제를 해결할 수있는 두 가지 방법이 있습니다. 첫 번째는 일치 검색어를 소개하는 섹션에서 과 같이 하나의 기본 샤드로 색인을 만드는 것입니다. 하나의 샤드 만있는 경우 로컬 IDF는 글로벌 IDF입니다.

두 번째 해결 방법은 검색 요청을 에? search_type = dfs_query_then_fetch를 추가하는 것입니다. dfs는 Distributed Frequency Search (분산 주파수 검색), 의 약자이며 전체 색인에서 전역 IDF를 계산하기 위해 각 샤드에서 로컬 IDF를 먼저 검색하도록 Elasticsearch에 지시합니다. 자세한 내용은

는보고 here