2016-08-18 3 views
3

Elasticsearch에서 배타적 인 버킷 집합을 작성해야합니다 (즉, 필터가 겹칠 수 있으므로 모든 버킷이 아닌 모든 버킷이 아니라 기준을 충족하기 위해 FIRST 버킷에 문서가 할당됩니다. 이는 CASE WHEN THEN과 같은 동작입니다. SQL 환경에서의 ELSE). 현재 과 결합 된 Filters Aggregation을 사용하여 원하는 것을 얻고 있습니다. 아이디어는 "Bool Query"의 "must"와 "must_not"부분을 "must"가 필자의 필터이고 "must_not"이 이미 이전에 사용 된 다른 모든 필터들의 집합 인 경우 사용하는 것입니다. 예제는 다음과 같습니다 관계형 접근 방식에서 빠른 탄력적 인 검색 그렇다면 그 이상입니까?

GET _search 
{ 
    "query":{"match_all":{}}, 
    "size":0, 
    "aggs":{ 
     "bin_1": { 
      "filter": { 
       "bool": { 
        "must": { <filter1> }, 
        "must_not": { <empty> } 
       } 
      } 
     }, 
     "bin_2": { 
      "filter": { 
       "bool": { 
        "must": { <filter2> }, 
        "must_not": { <filter1> } 
       } 
      } 
     }, 
     "bin_3": { 
      "filter": { 
       "bool": { 
        "must": { <filter3> }, 
        "must_not": { <filter1>, <filter2> } 
       } 
      } 
     }, 
     "bin_else": { 
      "filter": { 
       "bool": { 
        "must": { <empty> }, 
        "must_not": { <filter1>, <filter2>, <filter3> } 
       } 
      } 
     } 
    } 
} 

는 같은 때 절과 같이 케이스에 의해 달성 될 수 :

CASE WHEN <filter1> THEN <bin_1> 
    WHEN <filter2> THEN <bin_2> 
    WHEN <filter3> THEN <bin_3> 
    ELSE <bin_else> 
END 

이 방법의 문제는 느린 느린 얻을 수 있다는 것입니다 더 많은 양동이를 추가합니다 (내 실제 경우에는 중첩 된 양동이가 있음). Elastic에서 이와 같은 배타적 인 버킷에 대한 언어 지원이 있습니까? 또는 동일한 결과를 얻을 수있는 다른 빠른 접근 방법?

감사합니다.

답변

1

해결 방법은 스크립트 필드에 대한 것이라고 생각합니다. if else 논리를 사용하므로 추가 조건이 사용되지 않습니다. 그냥 어떤 종류의 필터를 사용하고 있는지 모르겠지만 내가 생각하는 모든 것을 구현할 수 있어야합니다. 여기에 쓸 내용은

SELECT 
CASE WHEN <filter1> THEN <bin_1> 
    WHEN <filter2> THEN <bin_2> 
    ELSE <bin_else> 
END as binning 
FROM SOMETHING 

무통의 언어로 된 스크립트 필드를 사용하여 구현되었습니다. 여기에 설명 된 바와 같이 여기

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-script-fields.html 무통 : https://www.elastic.co/guide/en/elasticsearch/painless/5.6/painless-examples.html

GET _search 
{ 
"query" : { "match_all": {} }, 
"script fields" : { 
    "binning" : { 
     "script" : { 
      "lang": "painless", 
      "source": "if (<filter>) {return <bin1>;} else if (<filter2>) {return <bin2>;} else {return <bin3>;}" 
     } 
    } 
} 

'필터 "는 같을 것이다 :. 문서 ['my_field '] 값 =="VALUE1 "'my_field '는 필터에서 사용하는 입력란입니다.

+0

스크립팅 된 필드를 사용하지 않을 것입니다! 굉장한 아이디어, 당신에게 @Honza 감사합니다. 그래도 성능에 대해 알고 있습니까? 필자는 스크립트 필드가 일반적인'bool' 필터와 비교할 때 상당히 비싸다고 생각합니다. –

관련 문제