2017-09-18 6 views
2

기능을 제공하기 위해 드롭 다운 목록에로드 된 상당히 큰 terms 집계 된 결과가 있습니다.elasticsearch 대 MUST_NOT (반대) 차이점

내 드롭 다운 목록에는 4000 개가 넘는 동물이 있습니다. 내 다른 드롭 다운 목록에는 4 개의 동물 색상이 있습니다.

예,

animal --> ["dog", "cat", "rabbit", ........ , "squirrel"]

color --> ["black", "white", "grey", "brown"]

elasticseatch의 문서는 다음과 같습니다 : 기본적으로

{"animal": "dog", "color": "white"}, 
.... 
{"animal": "cat", "color": "white"}, 
.... 
{"animal": "rabbit", "color": "grey"}, 
.... 
{"animal": "squirrel", "color": "brown"} 

, 내 드롭 다운 목록 내부 checkboxes의 모든 checked 및 Elasticsearch 있습니다 포함 된 모든 결과를 반환합니다. 이제 선택한 동물 색을 기준으로 다른 필드 animal_features의 카디널리티 결과를보고 싶습니다. 아무 것도 내 드롭 다운 목록에 checked 경우 실제로 쉽게 수행 할 수 및 그냥 다음 쿼리를 실행할 수 있습니다. 이 쿼리는 color = black 일 때 예상되는 카디널리티 결과를 반환합니다.

{ 
    "query": { 
     "bool": { 
      "must": [ 
       {"match": { "color": "black"}} 
      ] 
     } 

    }, 
    "aggs": { 
    "unique_animal_features": { 
     "cardinality": { 
     "field": "animal_features", 
     "precision_threshold" : 40000 
     } 
    } 
    } 
} 

그러나 모든 동물 및 색상은 기본적으로 checked입니다. color = black 일 때 여전히 카디널리티 결과를 원한다고 가정 해 봅시다. 따라서 제 경우에는 검정색 이외의 모든 색상을 선택 취소해야합니다. 그래서 나는 흰 색, 회색, 갈색을 선택 취소했다.

두 번째 쿼리에서 나는 must_not 쿼리를 사용하여 결과에서 검은 색이 아닌 다른 색을 제외하려고하므로 Elasticsearch가 나에게 동일한 결과를 반환 할 것으로 기대합니다.

{ 
    "query": { 
    "bool": { 
     "must_not": [ 
     { 
      "match": { 
      "color": "white" 
      } 
     }, 
     { 
      "match": { 
      "color": "grey" 
      } 
     }, 
     { 
      "match": { 
      "color": "brown" 
      } 
     } 
     ] 
    } 
    }, 
    "aggs": { 
    "unique_animal_features": { 
     "cardinality": { 
     "field": "animal_features", 
     "precision_threshold" : 40000 
     } 
    } 
    } 
    ] 
} 

그러나, 두 번째 쿼리는 대부분 부정확 한 카디널리티 결과를 반환합니다. 두 번째 쿼리를 사용해야하지만 첫 번째 쿼리와 마찬가지로 결과가 필요합니다. 두 번째 쿼리를 어떻게 최적화 할 수 있습니까?

참고 : 첫 번째 쿼리와 두 번째 쿼리의 유일한 차이점은 첫 번째 쿼리의 경우 단색 이외의 아무것도 선택되지 않는다는 것입니다. 그러나 두 번째 쿼리의 경우 사용자가 색상을 선택 취소하기 전까지 기본적으로 동물뿐만 아니라 색상을 포함한 모든 항목이 선택됩니다.

+0

단 4 색 이상입니까? –

+0

@hatim 단 4 색. – summerNight

답변

0

문제를 파악할 수있었습니다. 제 경우에는 null 값이 있었고 두 번째 쿼리는 animal을 기반으로 카디널리티 개수를 반환하고 null을 포함하는 레코드도 찾았습니다.

색인 템플릿에 "null_value": "_null_"을 추가 했으므로 이제 다음 쿼리를 사용하여 올바른 값을 얻습니다.

{ 
    "query": { 
    "bool": { 
     "must_not": [ 
     { 
      "match": { 
      "color": "_null_" 
      } 
     }, 
     { 
      "match": { 
      "color": "white" 
      } 
     }, 
     { 
      "match": { 
      "color": "grey" 
      } 
     }, 
     { 
      "match": { 
      "color": "brown" 
      } 
     } 
     ] 
    } 
    }, 
    "aggs": { 
    "unique_animal_features": { 
     "cardinality": { 
     "field": "animal_features", 
     "precision_threshold" : 40000 
     } 
    } 
    } 
    ] 
}