2015-12-29 10 views
7

मैं अपने सिस्टम के बाहर कई स्रोतों से भेजे गए डेटा को संग्रहीत करने के लिए लोचदार खोज का उपयोग करता हूं, यानी मैं आने वाले डेटा को नियंत्रित नहीं कर रहा हूं - मुझे बस जेसन दस्तावेज़ प्राप्त होता है और इसे स्टोर करता है । मेरे पास मध्य में केवल फ़िल्टर, केवल ईएस और किबाना के साथ कोई लॉगस्टैश नहीं है। प्रत्येक डेटा स्रोत ने अपना डेटा प्रकार भेजा और उन सभी को एक ही इंडेक्स (प्रति किरायेदार) में संग्रहीत किया जाता है लेकिन विभिन्न प्रकारों में। हालांकि चूंकि मैं मुझे भेजे गए डेटा को नियंत्रित नहीं कर सकता, इसलिए अलग-अलग प्रकार के दस्तावेजों को उसी नाम और अलग संरचना वाले क्षेत्र के साथ प्राप्त करना संभव है।
उदाहरण के लिए, मान लें कि मेरे पास फ़ील्ड FLD के साथ टाइप 1 और टाइप 2 है, जो दोनों मामलों में एक वस्तु है लेकिन इस ऑब्जेक्ट की संरचना समान नहीं है। विशेष रूप से FLD.name टाइप 1 में एक स्ट्रिंग फ़ील्ड है लेकिन टाइप 2 में ऑब्जेक्ट है। और इस मामले में, जब type1 डेटा आता है इसे सफलतापूर्वक संग्रहीत किया जाता है, लेकिन जब type2 डेटा आता है, इसे अस्वीकार कर दिया गया है:लोचदार खोज - फ़ील्ड के समान नाम होने पर क्या करना है, लेकिन एकाधिक मैपिंग

[[myindex]], प्रकार [type2]
java.lang सूचकांक पर मैपिंग डाल करने में विफल रहा .IllegalArgumentException: [FLD] अन्य प्रकार में मौजूदा मानचित्रण के साथ संघर्ष के लिए मैपर

ES प्रलेखन [एक गैर वस्तु मानचित्रण [FLD.name] एक वस्तु मानचित्रण [FLD.name] के साथ मर्ज नहीं कर सकते] स्पष्ट रूप से घोषणा करते हैं कि अलग-अलग मैपिंग प्रकारों में एक ही इंडेक्स में समान नाम वाले फ़ील्ड आंतरिक रूप से उसी क्षेत्र में मैप किए गए हैं और उसी मैपिंग (see here) होना चाहिए।

मेरा प्रश्न मैं इस मामले में क्या कर सकता हूं? मैं सभी प्रकारों को एक ही इंडेक्स में रखना पसंद करूंगा। क्या फ़ील्ड नामों या इस तरह के कुछ के लिए एक अद्वितीय-प्रति-प्रकार प्रत्यय जोड़ना संभव है? कोई अन्य समाधान? मैं Elasticsearch में एक नौसिखिया हूँ तो शायद मैं कुछ आसान याद कर रहा हूँ ... अग्रिम धन्यवाद।

+0

मुझे वास्तव में संदेह है कि अलग-अलग नामों का उपयोग करने के अलावा कोई रास्ता नहीं है .. क्योंकि यह सुविधा 2.0 में लोचदार द्वारा लागू की गई थी, और यह उनके अंत –

+0

से एक बहुत बड़ा बदलाव था यदि मैं अलग-अलग नाम का उपयोग करना चाहता हूं - मैं इसे तकनीकी रूप से कैसे कर रहा हूं? क्या कोई "फ़िल्टर" है जो कुछ पैटर्न के आधार पर नाम को संशोधित करता है? चूंकि फ़ील्ड गतिशील हैं, इसलिए डेटा आने से पहले, मैं इसे पहले से नहीं कर सकता। उनके दस्तावेज़ में मुझे किस सुविधा की तलाश करनी चाहिए? एक और विकल्प जिसे मैंने सोचा था, डेटा को संग्रहीत करने के तरीके को फिर से डिजाइन करना है: मौजूदा प्रकार का उपयोग इंडेक्स के रूप में करें (प्रत्येक इंडेक्स में सभी डेटा उसी तरह मैप किए जाएंगे) और किरायेदार आईडी को किसी भी तरह से दस्तावेज़ में जोड़ा गया फ़ील्ड बनाते हैं। हालांकि यह सूचकांक को बड़ा और बहु-किरायेदारी समर्थन को और चुनौतीपूर्ण बनाता है। – user3155208

+0

कोई फ़िल्टर नहीं है जो किसी भी पैटर्न के आधार पर किसी फ़ील्ड के नाम को मस्जिद कर सकता है ... मैं आपको इस बारे में पुनर्विचार करने का सुझाव दूंगा कि डेटा को कैसे संग्रहीत किया जाना चाहिए .. इंडेक्स के रूप में प्रकार को संग्रहीत करना भी अनुशंसित नहीं है .. –

उत्तर

0

अनुक्रमित होने से पहले प्री-प्रोसेसिंग के बिना इंडेक्स मनमाने ढंग से जेएसओएन करने का कोई तरीका नहीं है - Dynamic templates भी पर्याप्त लचीला नहीं है।

आप कुंजी-मान जोड़ों में नेस्टेड वस्तुओं समतल और वर्णित here के रूप में एक Nested datatype, Multi-fields, और ignore_malformed सूचकांक करने के लिए मनमाने ढंग से JSON (यहां तक ​​कि प्रकार विवादों सहित) का उपयोग कर सकते हैं। दुर्भाग्यवश, Elasticsearch अभी भी क्वेरी समय पर अपवाद फेंक सकता है यदि आप कोशिश करते हैं, उदाहरण के लिए, स्ट्रिंग से kv_pairs.value.long पर मिलान करें, तो आप मान के प्रारूप के आधार पर उचित फ़ील्ड चुनेंगे।

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