2014-05-01 9 views
9

मैं ऑब्जेक्ट प्रॉपर्टी पर केवल एकत्रीकरण क्वेरी कैसे चला सकता हूं, लेकिन परिणामस्वरूप सभी गुण प्राप्त कर सकते हैं? जैसे मैं [{'doc_count': 1, 'key': {'id': 1, 'name': 'tag name'}}] प्राप्त करना चाहता हूं, लेकिन इसके बजाय [{'doc_count': 1, 'key': '1'] मिला। फ़ील्ड 'टैग' पर एकत्रीकरण शून्य परिणाम देता है।ऑब्जेक्ट पर Elasticsearch एकत्रीकरण

मैपिंग:

{ 
    "test": { 
    "properties" : { 
     "tags" : { 
     "type" : "object", 
     "properties": { 
      "id" : {"type": "string", "index": "not_analyzed"}, 
      "name" : {"type": "string", "index": "not_analyzed", "enabled": false} 
     } 
     } 
    } 
    } 
} 

एकत्रीकरण क्वेरी: (रिटर्न केवल आईडी अपेक्षा के अनुरूप है, लेकिन कैसे मैं परिणामों में आईडी & नाम जोड़े मिल सकता है?)

'aggregations': { 
    'tags': { 
    'terms': { 
     'field': 'tags.id', 
     'order': {'_count': 'desc'}, 
    }, 
    } 
} 

संपादित करें: गॉट आईडी & "script": "_source.tags" पर एकत्र करके नाम लेकिन अभी भी तेज़ समाधान की तलाश में है।

+0

क्या आपको कभी भी तेज़ समाधान मिला है? मैं प्रदर्शन कारणों से '_source' obj पर भरोसा नहीं करना चाहता हूं। –

+0

@ बेंजामिन स्मिथ, नहीं, मैंने नहीं किया, कृपया मुझे बताएं अगर आप करेंगे। –

उत्तर

3

यदि आप चाहें तो आप एक स्क्रिप्ट का उपयोग कर सकते हैं, उदा।

"terms":{"script":"doc['tags.id'].value + '|' + doc['tags.name'].value"}

प्रत्येक बनाया बाल्टी के लिए आप क्षेत्रों है कि आप अपने पटकथा में शामिल है के मूल्यों के साथ एक महत्वपूर्ण मिल जाएगा। ईमानदार होने के लिए, एकत्रीकरण का उद्देश्य पूर्ण दस्तावेज़ वापस नहीं करना है, लेकिन दस्तावेजों (बाल्टी) के समूहों पर गणना करना और परिणाम वापस करना है, उदा। रकम और विशिष्ट मूल्य। आप वास्तव में अपनी क्वेरी के साथ क्या कर रहे हैं यह है कि आप फ़ील्ड टैग.आईडी के आधार पर बाल्टी बनाते हैं।

ध्यान रखें कि परिणाम की कुंजी में '|' से अलग मूल्य शामिल होंगे इसलिए आपको अपनी आवश्यक जानकारी को निकालने के लिए अपने मूल्य में हेरफेर करना पड़ सकता है।

+0

पहले से ही कोशिश की है, लेकिन कुछ कारणों से '" शर्तों ": {" स्क्रिप्ट ":" डॉक्टर ['टैग.आईडी']। मान "} 'मुझे केवल एक टैग के साथ एक बाल्टी मिली है। –

+0

हां क्योंकि आपकी स्क्रिप्ट में आप केवल tag.id के मान का उपयोग करते हैं। आपको वहां टैग.नाम भी डालना होगा, मेरे पोस्ट में जो उदाहरण है, उसे देखें। – cpard

+0

@cpard मेरे पास एक बहुत ही समान सेटअप है - जब मैं दो दस्तावेज़ फ़ील्ड को आज़माकर जोड़ता हूं, तो 'आईडी' सही' नाम 'पर मैप नहीं करता है, और कुछ' आईडी 'को डुप्लिकेट किया जाता है। क्या आप वाकई इस विधि को विश्वसनीय मानते हैं? क्या मुझे अपने मैपिंग के साथ क्या करना है? –

3

घोंसला घोंसला करना भी संभव है, आप आईडी द्वारा एकत्र कर सकते हैं, फिर नाम से।