2015-07-28 9 views
9

मैं जो हासिल करना चाहता हूं: मैं चाहता हूं कि मेरी "आयु" एकत्रीकरण क्वेरी फ़िल्टर द्वारा फ़िल्टर न किया जाए और मैं इसे फ़िल्टर लागू करने में सक्षम होना चाहता हूं।एक elasticsearch वैश्विक एकत्रीकरण को फ़िल्टर करने के लिए कैसे?

तो मैं इस प्रश्न के साथ शुरू करता है, तो:

{ 
    "query":{ 
     "filtered":{ 
      "filter":{ "terms":{ "family_name":"Brown" } } //filter_1 
     } 
    }, 
    "aggs":{ 
     "young_age":{ 
      "filter":{ 
       "range":{ "lt":40, "gt":18 } //filter_2 
      }, 
      "aggs":{ 
       "age":{ 
        "terms":{ 
         "field":"age" 
        } 
       } 
      } 
     } 
    } 
} 

मेरे एकत्रीकरण "young_age" दोनों FILTER_1 और filter_2 द्वारा फ़िल्टर कर दिया जाएगा। मैं नहीं चाहता कि मेरा एकत्रीकरण फ़िल्टर_1 द्वारा फ़िल्टर किया जाए।

जैसा कि मैंने प्रलेखन में देख रहा था, मैंने सोचा था कि वैश्विक एकत्रीकरण मेरी समस्या का समाधान होता है, और मुझे लगता है कि क्वेरी ने लिखा है:

"" ":

{ 
    "query":{ 
     "filtered":{ 
      "filter":{ "terms":{ "family_name":"Brown" } } //filter_1 
     } 
    }, 
    "aggs":{ 
     "young_age":{ 
      "global":{}, //<----------- add global 
      "filter":{ 
       "range":{ "lt":40, "gt":18 } //filter_2 
      }, 
      "aggs":{ 
       "age":{ 
        "terms":{ 
         "field":"age" 
        } 
       } 
      } 
     } 
    } 
} 

लेकिन तब लोचदार खोज मेरा filter_2 के बारे में शिकायत

0: मिले दो एकत्रीकरण प्रकार परिभाषाओं में [आयु] [वैश्विक] और [फिल्टर] "" "

और निश्चित रूप से अगर मैं filter_2 को दूर

{ 
    "query":{ 
     "filtered":{ 
      "filter":{ 
       "terms":{ 
        "family_name":"Brown" 
       } 
      } 
     } 
    }, 
    "aggs":{ 
     "young_age":{ 
      "global":{}, 
      "aggs":{ 
       "age":{ 
        "terms":{ 
         "field":"age" 
        } 
       } 
      } 
     } 
    } 
} 

तब मेरा एकत्रीकरण फ़िल्टर_1 (अपेक्षित के रूप में) द्वारा फ़िल्टर नहीं किया जाएगा।

तो मुझे लगता है कि मैं अपने वैश्विक एकत्रीकरण में फ़िल्टर_2 लागू करने का अनुमान कैसे लगा सकता हूं? या मैं इसे कैसे प्राप्त करना चाहता हूं? मुझे पहलू फिल्टर के साथ कुछ लिखना याद है ...

उत्तर

2

मेरी राय में यह post_filter का सामान्य उपयोग केस है। दस्तावेज़ कहते हैं:

{ 
    "post_filter":{ 
     "terms":{ 
      "family_name":"Brown" //filter_1 
     } 
    }, 
    "aggs":{ 
     "young_age":{ 
      "filter":{ 
       "range":{ "lt":40, "gt":18 } //filter_2 
      }, 
      "aggs":{ 
       "age":{ 
        "terms":{ 
         "field":"age" 
        } 
       } 
      } 
     } 
    } 
} 
: के लिए खोज खोज अनुरोध के अंत में हिट

post_filter के बाद एकत्रित पहले से ही गणना की है

आपकी क्वेरी की तरह दिखाई देगा लागू किया जाता है,

इस मामले में खोज हिट इंडेक्स में सभी दस्तावेज हैं। फिर एकत्रीकरण की गणना की जाती है (फ़िल्टर_1 से पहले)। और उसके बाद फ़िल्टर_1 के साथ post_filter निष्पादित किया जाएगा।

संपादित करें: के रूप में आप अपने सराहना में कहा था कि आप कई एकत्रित और केवल एक ही है कि filter_1 से प्रभावित नहीं होना चाहिए मैं वैश्विक एकत्रीकरण

{ 
    "query": { 
    "filtered": { 
     "filter": { 
     "term": { 
      "family_name": "Brown" 
     } 
     } 
    } 
    }, 
    "aggs": { 
    "young_age": { 
     "global": {}, 
     "aggs": { 
     "filter2": { 
      "filter": { 
      "range": { 
       "lt": 40, 
       "gt": 18 
      } 
      }, 
      "aggs": { 
      "age": { 
       "terms": { 
       "field": "age" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+1

का उपयोग कर वह काम करेगा आपकी क्वेरी तय, लेकिन वास्तव में मैं कई मिल गया है है एकत्रीकरण और उनमें से केवल एक फ़िल्टर_1 द्वारा फ़िल्टर नहीं किया जाना चाहिए। तो आपके समाधान के साथ इसका मतलब है कि मुझे उन एग्रीगेशंस के लिए post_filter को दोहराना होगा जो मुझे थोड़ा परेशान लगता है (और शायद प्रदर्शन के दृष्टिकोण से भी अच्छा नहीं है?) – adrienbourgeois

+1

@adrienbourgeois मैंने वैश्विक एकत्रीकरण का उपयोग करके क्वेरी तय की है, चलो मुझे पता है कि यह आपके लिए काम करता है :) – moliware

+0

धन्यवाद दोस्त यह एक आकर्षण की तरह काम कर रहा है! मैंने आपका जवाब स्वीकार कर लिया है। चीयर्स – adrienbourgeois

संबंधित मुद्दे