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