2016-06-28 7 views
6

में सभी बाल्टी वापस किए बिना पाइपलाइन एकत्रीकरण कैसे करें I Elasticsearch 2.3 का उपयोग कर रहा हूं और मैं पाइपलाइन एकत्रीकरण का उपयोग करके दो-चरण गणना करने की कोशिश कर रहा हूं। मुझे केवल मेरी पाइपलाइन एकत्रीकरण के अंतिम परिणाम में दिलचस्पी है लेकिन Elasticsearch सभी बाल्टी जानकारी देता है।Elasticsearch

चूंकि मेरे पास बड़ी संख्या में बाल्टी (दसियों या लाखों लाख) हैं, यह निषिद्ध है। दुर्भाग्यवश, मुझे यह जानकारी देने के लिए कोई रास्ता नहीं मिल रहा है कि यह सारी जानकारी वापस न लौटाए।

यहां एक खिलौना उदाहरण है। मेरे पास एक दस्तावेज़ प्रकार obj के साथ एक सूचकांक test-index है। obj में दो फ़ील्ड, key और values हैं।

curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{ 
    "value": 100, 
    "key": "foo" 
}' 

curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{ 
    "value": 20, 
    "key": "foo" 
}' 

curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{ 
    "value": 50, 
    "key": "bar" 
}' 

curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{ 
    "value": 60, 
    "key": "bar" 
}' 

curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{ 
    "value": 70, 
    "key": "bar" 
}' 

मैं कम से कम obj की value होने ही key रों रों के औसत मूल्य (key सब कुछ खत्म हो रों) प्राप्त करना चाहते हैं। औसत का न्यूनतम तापमान।

Elasticsearch मुझे यह करने के लिए अनुमति देता है:

curl -XPOST 'http://10.10.0.7:9200/test-index/obj/_search' -d '{ 
    "size": 0, 
    "query": { 
    "match_all": {} 
    }, 
    "aggregations": { 
    "key_aggregates": { 
     "terms": { 
     "field": "key", 
     "size": 0 
     }, 
     "aggs": { 
     "min_value": { 
      "min": { 
      "field": "value" 
      } 
     } 
     } 
    }, 
    "avg_min_value": { 
     "avg_bucket": { 
     "buckets_path": "key_aggregates>min_value" 
     } 
    } 
    } 
}' 

लेकिन इस क्वेरी हर बाल्टी के लिए न्यूनतम देता है, हालांकि मैं इसकी आवश्यकता नहीं है:

{ 
    "took": 21, 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 5, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 4, 
    "max_score": 0, 
    "hits": [ 

    ] 
    }, 
    "aggregations": { 
    "key_aggregates": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 0, 
     "buckets": [ 
     { 
      "key": "bar", 
      "doc_count": 2, 
      "min_value": { 
      "value": 50 
      } 
     }, 
     { 
      "key": "foo", 
      "doc_count": 2, 
      "min_value": { 
      "value": 20 
      } 
     } 
     ] 
    }, 
    "avg_min_value": { 
     "value": 35 
    } 
    } 
} 

वहाँ एक रास्ता छुटकारा पाने के लिए है "buckets": [...] के अंदर सभी जानकारी का? मुझे केवल avg_min_value में दिलचस्पी है।

यह खिलौना उदाहरण में कोई समस्या नहीं प्रतीत हो सकता है, लेकिन जब विभिन्न key एस की संख्या बड़ी नहीं है (दस या लाखों लाख), क्वेरी प्रतिक्रिया निषिद्ध रूप से बड़ी है, और मैं इसे छीनना चाहता हूं।

क्या Elasticsearch के साथ ऐसा करने का कोई तरीका है? या क्या मैं अपना डेटा गलत कर रहा हूं?

एनबी: मेरी क्वेरी प्रति डेटा को पूर्व-योग करने के लिए स्वीकार्य नहीं है, क्योंकि match_all मेरी क्वेरी का हिस्सा जटिल और अज्ञात फ़िल्टर द्वारा प्रतिस्थापित किया जा सकता है।

एनबी 2: size को terms समेकन में एक गैर-ऋणात्मक संख्या में बदलना स्वीकार्य नहीं है क्योंकि यह परिणाम बदल देगा।

उत्तर

5

मुझे एक ही समस्या थी और काफी कुछ शोध करने के बाद मुझे एक समाधान मिला और सोचा कि मैं यहां साझा करूंगा।

आप Response Filtering सुविधा का उपयोग उस उत्तर के हिस्से को फ़िल्टर करने के लिए कर सकते हैं, जिसे आप प्राप्त करना चाहते हैं।

खोज क्वेरी में क्वेरी पैरामीटर filter_path=aggregations.avg_min_value जोड़कर आप जो चाहते हैं उसे प्राप्त करने में सक्षम होना चाहिए। उदाहरण के मामले में, इसे इस तरह दिखना चाहिए:

curl -XPOST 'http://10.10.0.7:9200/test-index/obj/_search?filter_path=aggregations.avg_min_value' -d '{ 
    "size": 0, 
    "query": { 
    "match_all": {} 
    }, 
    "aggregations": { 
    "key_aggregates": { 
     "terms": { 
     "field": "key", 
     "size": 0 
     }, 
     "aggs": { 
     "min_value": { 
      "min": { 
      "field": "value" 
      } 
     } 
     } 
    }, 
    "avg_min_value": { 
     "avg_bucket": { 
     "buckets_path": "key_aggregates>min_value" 
     } 
    } 
    } 
}' 

पीएस: यदि आपको कोई और समाधान मिल गया तो क्या आप इसे यहां साझा करना चाहते हैं? धन्यवाद!

+1

यह एक सही समाधान की तरह लगता है। अगर हमें केवल यह मिला! हमें इस समस्या का सीधा समाधान नहीं मिला, इसलिए हमने स्क्रिप्ट एकत्रीकरण तरीका अपनाया: एक नक्शा बनाना जिसका कुंजी फ़ील्ड "कुंजी" है और फ़ील्ड "कुंजी" के लिए दिए गए मान के साथ सभी दस्तावेज़ों पर मिनीमा को मानता है; फिर इस मानचित्र के मूल्यों को एकत्रित करना।मुझे नहीं पता कि दोनों प्रदर्शन के संदर्भ में कैसे तुलना करते हैं, लेकिन सभी संभावनाओं में आपका समाधान तेजी से होना चाहिए! – jrjd