2014-10-09 9 views
6

मैंने 3 फ़िल्टर के साथ फ़िल्टर किया है क्वेरी: "query": "iphone", color:5, category:10, brand:25लोचदार खोज - एकत्रीकरण से फ़िल्टर को कैसे बाहर निकालना है?

मैं प्रत्येक ब्रांड में color:5 और category: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

हम सिर्फ एसओएलआर से आगे बढ़ रहे हैं और हम एक ही मुद्दे का सामना कर रहे हैं।

फिर आप प्रत्येक बकेट के लिए एक 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

"वैश्विक": {}, - इस मामले में अच्छा नहीं है क्योंकि मेरे पास 20 एजीजी हैं, इसलिए अनुरोध का आकार बेहद बढ़ रहा है और यह डेवलपर अनुकूल नहीं है। डीआरवाई सिद्धांत भी अनुरोध में होना चाहिए। – user3093816

+0

हमारे पास भी बहुत सारे एजीजी हैं। हम DRY रहते हैं, लेकिन कोड उत्पन्न करने वाले कोड में ... foreach agg, आप agg से संबंधित एक को छोड़कर प्रत्येक फ़िल्टर जोड़ते हैं। –

2

@Lionel Sengkouvanh जवाब देने के लिए इसके अलावा, यहां के साथ बराबर है जावा एपीआई:

SearchRequestBuilder request = client 
    .prepareSearch(INDEX_NAME) 
    .setQuery(theQuery) 
    ... 
    .addAggregation(
    AggregationBuilders.global("all").subAggregation(  
     AggregationBuilders.filter("keyword").filter(filter).subAggregation(
     AggregationBuilders.terms("brand").field("brand") 
     ) 
    ) 
); 
संबंधित मुद्दे