2015-08-29 12 views
5

मैं लोचदार खोज क्वेरी के साथ खेल रहा हूं और कुछ समय के लिए फ़िल्टर करता हूं लेकिन पहले कभी समेकन के साथ काम नहीं करता था। विचार है कि हम अपनी क्वेरी के साथ समेकन को गुंजाइश कर सकते हैं मेरे लिए काफी आश्चर्यजनक लगता है लेकिन मैं समझना चाहता हूं कि इसे ठीक से कैसे किया जाए ताकि मैं कोई गलती न करूं। वर्तमान में मेरे सभी खोज क्वेरी के इस तरह से तैयार कर रहे हैं: जब मैं कुछ एकत्रीकरण बाल्टी कहा,लोचदार खोज: आपकी क्वेरी और फ़िल्टर में समेकन कैसे बढ़ाएं?

{ 
    "query": { 

    }, 
    "filter": { 

    }, 
    "from": 0, 
    "size": 60 
} 

अब, संरचना बन गया यह:

{ 
    "aggs": { 
     "all_colors": { 
     "terms": { 
      "field": "color.name" 
     } 
     }, 
     "all_brands": { 
     "terms": { 
      "field": "brand_slug" 
     } 
     }, 
     "all_sizes": { 
     "terms": { 
      "field": "sizes" 
     } 
     } 
    }, 
    "query": { 

    }, 
    "filter": { 

    }, 
    "from": 0, 
    "size": 60 
} 

हालांकि, एकत्रीकरण के परिणाम हमेशा एक ही ध्यान दिए बिना कर रहे हैं मैं फ़िल्टर में कौन सी जानकारी प्रदान करता हूं।

अब, जब मैं कुछ इस तरह करने के लिए क्वेरी संरचना बदल गया है, यह अलग परिणाम दिखाने शुरू:

{ 
    "aggs": { 
     "all_colors": { 
     "terms": { 
      "field": "color.name" 
     } 
     }, 
     "all_brands": { 
     "terms": { 
      "field": "brand_slug" 
     } 
     }, 
     "all_sizes": { 
     "terms": { 
      "field": "sizes" 
     } 
     } 
    }, 
    "query": { 
     "filtered": { 
      "query": { 

      }, 
      "filter": { 

      }   
     } 
    }, 
    "from": 0, 
    "size": 60 
} 

यह मतलब यह है कि मैं इस नए प्रकार के फ़िल्टर किए गए करने के लिए हर जगह पर मेरी खोज क्वेरी की संरचना में परिवर्तन करना होगा संरचना का? क्या कोई अन्य कामकाज है जो मुझे उस कोड को बदलने के बिना वांछित परिणाम प्राप्त करने की अनुमति देता है?

{ 
    "buckets": [ 
     { 
      "key": "england", 
      "doc_count": 368 
     }, 
     { 
      "key": "peter", 
      "doc_count": 368 
     } 
    ] 
} 

मैं दोनों कि यह कैसे सुनिश्चित कर सकते हैं:

इसके अलावा, एक और बात मैंने देखा कि अगर मेरे brand_slug क्षेत्र "पीटर इंग्लैंड" जैसे कई कीवर्ड हैं तो इन दोनों को अलग बाल्टी में इस तरह वापस आ रहे हैं इन एक ही बाल्टी में अंत इस तरह:

{ 
    "buckets": [ 
     { 
      "key": "peter england", 
      "doc_count": 368 
     } 
    ] 
} 

अद्यतन: इस दूसरे भाग मैं अनुक्रमण ब्रांड, रंग से पूरा करने के लिए सक्षम किया गया है और अलग ढंग से इस तरह आकार:

"sizes": { 
    "type": "string", 
    "fields": { 
     "raw": { 
      "type": "string", 
      "index": "not_analyzed" 
     } 
    } 
} 

उत्तर

4

आपने जो देखा है वह डिज़ाइन द्वारा है। SO पर एक समान प्रश्न के लिए my answer पर एक नज़र डालें। असल में, एकत्रीकरण और फ़िल्टर खंड दोनों में इनपुट क्वेरी अनुभाग का आउटपुट है। Filtered Query जैसा कि आपने सुझाव दिया है कि आपके इच्छित परिणामों को प्राप्त करने का सबसे अच्छा तरीका होगा। एक और तरीका भी है। आप Filter Aggregation का उपयोग कर सकते हैं। फिर आपको अपनी क्वेरी को बदलने और अनुभागों को फ़िल्टर करने की आवश्यकता नहीं होगी, लेकिन बस एग्रीगेशन सेक्शन के अंदर फ़िल्टर सेक्शन कॉपी करें, लेकिन मेरी राय में यह एक ओवरकिल होगा और सामान्य रूप से DRY principle का उल्लंघन होगा।

+0

प्रतिक्रिया के लिए धन्यवाद। हालांकि, एक चीज जो मुझे आश्चर्यचकित करती है वह यह है कि आप कह रहे हैं कि क्वेरी पहले लागू होती है और फिर फ़िल्टर करती है? बस जिज्ञासा क्यों नहीं है, क्योंकि फ़िल्टर अपेक्षाकृत तेज़ हैं और वे –

+0

के बाद क्वेरी मैचों को निष्पादित करने के लिए परिणामों की संख्या को काफी कम कर सकते हैं फ़िल्टर केवल तभी पूछे जाने पर क्वेरी से पहले लागू होते हैं जब वे फ़िल्टर किए गए क्वेरी का हिस्सा होते हैं। अधिक जानकारी के लिए https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-filtered-query.html#_filter_strategy देखें। जिस फ़िल्टर के बारे में हम यहां बात कर रहे हैं वह वास्तव में एक 'post_filter' है, जैसा कि क्वेरी निष्पादित होने के बाद नाम सुझाव लागू होता है। अधिक जानकारी के लिए https://www.elastic.co/guide/en/elasticsearch/guide/current/_post_filter.html पढ़ें। – bittusarkar

+0

ठीक है। तो आपका मतलब है कि अगर मैं अपनी क्वेरी संरचना को फ़िल्टर किए गए क्वेरी में बदलता हूं, तो मुझे प्रदर्शन सुधार भी मिल सकता है? –

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