2014-10-09 127 views
6

我使用3個過濾器過濾了查詢:"query": "iphone", color:5, category:10, brand:25ElasticSearch - 如何從聚合中排除過濾器?

我怎樣才能在擁有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

您是否找到解決方案? – 2014-10-16 08:52:13

+0

是的,經過一段時間的生產和實驗後,「全球化」解決方案:{}, - 是我發現的最佳可能性。它的工作速度並不是很快,但是對於緩存來說它具有可接受的性能 – user3093816 2015-01-06 06:36:35

+0

相關問題:http://stackoverflow.com/q/12014571/490018。 – 2015-11-25 15:00:10

回答

5

我們只是從SOLR轉向我們正面臨同樣的問題。

你可以嘗試全球桶然後添加一個query filter每個桶:

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

你應該像結尾:

{ 
    "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個aggs,所以請求大小變得非常大,並且它不是開發者友好的。 DRY原則也必須要求。 – user3093816 2014-11-19 03:38:31

+0

我們也有很多aggs。 我們仍然是乾的,但在代碼生成請求... foreach agg,你添加每個過濾器,除了有關的agg。 – 2014-11-20 14:47:24

2

除了@Lionel Sengkouvanh答案,這裏是用等價java 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") 
     ) 
    ) 
);