2015-10-23 7 views
15

इंडेक्स्ड दस्तावेजों अतिरिक्त फ़ील्ड जोड़ने की तरह हैं:शर्तों एकत्रीकरण ElasticSearch को

{ 
    id: 1, 
    title: 'Blah', 
    ... 
    platform: {id: 84, url: 'http://facebook.com', title: 'Facebook'} 
    ... 
} 

क्या मैं चाहता हूँ की संख्या और उत्पादन आँकड़े-दर-मंच है। गिनती के लिए, मैं शब्दों के एकत्रीकरण platform.id के साथ एक क्षेत्र के रूप में गिनती करने के लिए उपयोग कर सकते हैं:

aggs: { 
    platforms: { 
    terms: {field: 'platform.id'} 
    } 
} 

इस तरह से मैं एक बहु {key: 8, doc_count: 162511} की तरह लग रही बाल्टी के रूप में आँकड़े प्राप्त करते हैं, के रूप में उम्मीद।

अब, क्या मैं किसी भी तरह उन बाल्टी में platform.name और platform.url (आंकड़ों के सुंदर आउटपुट के लिए) जोड़ सकता हूं?

aggs: { 
    platforms: { 
    terms: {field: 'platform.id'}, 
    aggs: { 
     name: {terms: {field: 'platform.name'}}, 
     url: {terms: {field: 'platform.url'}} 
    } 
    } 
} 

कौन सा, वास्तव में, काम करता है, और प्रत्येक बकेट में बहुत जटिल संरचना देता है:

{key: 7, 
    doc_count: 528568, 
    url: 
    {doc_count_error_upper_bound: 0, 
    sum_other_doc_count: 0, 
    buckets: [{key: "http://facebook.com", doc_count: 528568}]}, 
    name: 
    {doc_count_error_upper_bound: 0, 
    sum_other_doc_count: 0, 
    buckets: [{key: "Facebook", doc_count: 528568}]}}, 
बेशक, नाम और मंच के URL के

हो सकता है सबसे अच्छा मैंने की तरह दिखता है के साथ आया था इस संरचना से निकाला गया (जैसे bucket.url.buckets.first.key), लेकिन क्या कार्य करने के लिए और अधिक स्वच्छ और सरल तरीका है?

+0

आप अपनी समस्या के लिए किसी भी समाधान मिल गया है? मुझे अभी भी इसका सामना करना पड़ रहा है :( –

+0

मैंने इसे अपने स्वयं के "स्वीकृत" उत्तर के रूप में नीचे पोस्ट किया :) – zverok

उत्तर

22

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

aggs: { 
    platforms: { 
    terms: {field: 'platform.id'}, 
    aggs: { 
     platform: {top_hits: {size: 1, _source: {include: ['platform']}}} 
    } 
} 

टी अपने तरीके से, प्रत्येक की तरह दिखाई देगा bucked:

{"key": 7, 
    "doc_count": 529939, 
    "platform": { 
    "hits": { 
     "hits": [{ 
     "_source": { 
     "platform": 
      {"id": 7, "name": "Facebook", "url": "http://facebook.com"} 
     } 
     }] 
    } 
    }, 
} 

कौन सा थोड़े बहुत (ईएस साथ हमेशा की तरह) deeep है, लेकिन साफ: bucket.platform.hits.hits.first._source.platform

+0

ठीक है लेकिन इसमें प्रत्येक कुंजी में सभी दस्तावेज़ शामिल हैं –

0

आप जरूरी platform.id का मूल्य प्राप्त करने की आवश्यकता नहीं है, तो आप एक ही एकत्रीकरण बजाय एक script कि दो क्षेत्रों name और url concatenates का उपयोग कर के साथ भाग मिल सकता है:

aggs: { 
    platforms: { 
    terms: {script: 'doc["platform.name"].value + "," + doc["platform.url"].value'} 
    } 
} 
+0

हाँ, 'स्क्रिप्ट' के साथ समाधान बहुत स्पष्ट है। और मेरे लिए भी बहुत बदसूरत। सिर्फ कुछ क्लीनर हो सकता है या नहीं। – zverok

+0

बहुत यकीन है कि [स्क्रिप्ट किए गए मीट्रिक] (https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-scripted-metric-aggregation.html) समेकन के आसपास कुछ किया जा सकता है। मैं इसे बाद में कोशिश करूंगा, लेकिन आप इसे एक शॉट दे सकते हैं। – Val