2014-10-09 2 views
6

필터 세 개를 사용하여 쿼리를 필터링했습니다 : "query": "iphone", color:5, category:10, brand:25.ElasticSearch - 집계에서 필터를 제외하는 방법?

color:5category:10을 가진 각 브랜드의 제품을 어떻게 얻을 수 있습니까?

SOLR에서

나는 그것을 좋아하지 않았다

fq={!tag=tag_facet_brand}facet_brand:"564"&facet.field={!ex=tag_facet_brand}facet_brand 

는 어떻게 집계 컨텍스트에서 1 개 필터를 제외 할 수 ? (내가 글로벌 query:iphone 느슨한 때문에 사용할 수없는, 나는 post_filter 사용할 수 없습니다 - 성능 때문에).

+0

해결책을 찾았습니까? –

+0

예, 생산 및 실험에서 "글로벌": {}이 (가)있는 해결책을 찾은 것이 제가 발견 한 가장 좋은 가능성입니다. 그것은 매우 빠르지 만 캐시와 함께 작동 할 수있는 성능을 가지고 있습니다. – user3093816

+0

관련 질문 : http://stackoverflow.com/q/12014571/490018. –

답변

5

우리는 SOLR에서 단지 움직이고 있으며 같은 문제에 직면하고 있습니다.

그런 다음 각 버킷에 대한 query filter을 추가 글로벌 버킷을 시도 할 수 있습니다 : 당신은 같은로 끝나야합니다

"filter" : { 
      "query" : { 
       "query_string" : { 
        "query" : "iPhone" 
       } 
      } 
     } 

: @Lionel Sengkouvanh 응답에 추가

{ 
    "size": 10, 
    "query": { 
     "query_string": { 
      "query": "iphone" 
     } 
    }, 
    "filter": { 
     "bool": { 
      "must": [ 
       { 
        "term": { 
         "brand": "564" 
        } 
       }, 
       { 
        "term": { 
         "color": "5" 
        } 
       }, 
       { 
        "term": { 
         "category": "10" 
        } 
       } 
      ] 
     } 
    }, 
    "aggs": { 
     "all": { 
      "global": {}, 
      "aggs": { 
       "keyword": { 
        "filter": { 
         "bool": { 
          "must": [ 
           { 
            "query": { 
             "query_string": { 
              "query": "iphone" 
             } 
            } 
           }, 
           { 
            "term": { 
             "color": "5" 
            } 
           }, 
           { 
            "term": { 
             "category": "10" 
            } 
           } 
          ] 
         } 
        }, 
        "aggs": { 
         "brand": { 
          "terms": { 
           "field": "brand" 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 
+0

"global": {}, - 20 개의 agg가 있으므로이 경우에는 좋지 않습니다. 요청 크기가 극도로 커지고 개발자에게는 친숙하지 않습니다. DRY 원칙은 요청해야합니다. – user3093816

+0

우리는 또한 많은 aggs 있습니다. 우리는 건조한 상태로 있지만 요청을 생성하는 코드에서 ... foreach agg, agg와 관련된 필터를 제외한 모든 필터를 추가합니다. –

2

, 여기에 상응한다 자바 API :

SearchRequestBuilder request = client 
    .prepareSearch(INDEX_NAME) 
    .setQuery(theQuery) 
    ... 
    .addAggregation(
    AggregationBuilders.global("all").subAggregation(  
     AggregationBuilders.filter("keyword").filter(filter).subAggregation(
     AggregationBuilders.terms("brand").field("brand") 
     ) 
    ) 
); 
관련 문제