Elasticsearch एक ओपन-सोर्स, वितरित आधारित खोज और एनालिटिक्स इंजन है जिसे तेज़ वास्तविक समय खोज कार्यक्षमता प्रदान करने के लिए Apache Lucene का उपयोग करके बनाया गया है। यह एक NoSQL डेटा स्टोर है जो डिफ़ॉल्ट रूप से दस्तावेज़-उन्मुख, स्केलेबल और स्कीमलेस है। इलास्टिक्स खोज को बड़े डेटा सेट के साथ बड़े पैमाने पर काम करने के लिए डिज़ाइन किया गया है। एक खोज इंजन के रूप में, यह तेज़ अनुक्रमण और खोज क्षमताएं प्रदान करता है जिसे कई नोड्स में क्षैतिज रूप से बढ़ाया जा सकता है। JSON- बेशर्म प्लग: क्लाउड में एक वास्तविक समय अनुक्रमण डेटाबेस है। यह स्वचालित रूप से ऐसे इंडेक्स बनाता है जो न केवल खोज के लिए बल्कि एकत्रीकरण और जुड़ाव के लिए भी अनुकूलित होते हैं, जिससे आपके एप्लिकेशन के लिए डेटा को क्वेरी करना तेज़ और आसान हो जाता है, भले ही यह कहां से आता है और किस प्रारूप में है। लेकिन यह पोस्ट कुछ समाधानों पर प्रकाश डालने के बारे में है। , यदि आप वास्तव में Elasticsearch में SQL-स्टाइल जॉइन करना चाहते हैं। रॉकसेट डेटा संबंध क्यों मायने रखते हैं? हम अत्यधिक जुड़ी हुई दुनिया में रहते हैं जहां डेटा संबंधों को संभालना महत्वपूर्ण है। रिलेशनल डेटाबेस रिश्तों को संभालने में अच्छे हैं, लेकिन लगातार बदलती व्यावसायिक आवश्यकताओं के साथ, इन डेटाबेस की निश्चित स्कीमा के परिणामस्वरूप स्केलेबिलिटी और प्रदर्शन संबंधी समस्याएं पैदा होती हैं। पारंपरिक डेटा प्रबंधन दृष्टिकोण से जुड़ी कई चुनौतियों से निपटने की क्षमता के कारण NoSQL डेटा स्टोर का उपयोग तेजी से लोकप्रिय हो रहा है। उद्यम लगातार जटिल डेटा संरचनाओं से निपट रहे हैं जहां डेटा का विश्लेषण करने के लिए एकत्रीकरण, जुड़ाव और फ़िल्टरिंग क्षमताओं की आवश्यकता होती है। असंरचित डेटा के विस्फोट के साथ, डेटा विश्लेषण उद्देश्यों के लिए विभिन्न स्रोतों से डेटा को जोड़ने की आवश्यकता वाले उपयोग के मामलों की संख्या बढ़ रही है। जबकि जॉइन्स मुख्य रूप से एक SQL अवधारणा हैं, वे NoSQL दुनिया में भी समान रूप से महत्वपूर्ण हैं। प्रथम श्रेणी के नागरिकों के रूप में एलेस्टिक्स खोज में SQL-शैली के जोड़ समर्थित नहीं हैं। यह आलेख इस बात पर चर्चा करेगा कि विभिन्न तकनीकों जैसे कि डीनॉर्मलाइज़िंग, एप्लिकेशन-साइड जॉइन, नेस्टेड दस्तावेज़ और माता-पिता-बच्चे संबंधों का उपयोग करके इलास्टिक्स खोज में संबंधों को कैसे परिभाषित किया जाए। यह प्रत्येक दृष्टिकोण से जुड़े उपयोग के मामलों और चुनौतियों का भी पता लगाएगा। इलास्टिक्स खोज में रिश्तों से कैसे निपटें चूँकि Elasticsearch एक रिलेशनल डेटाबेस नहीं है, इसलिए SQL डेटाबेस की तरह जॉइन्स मूल कार्यक्षमता के रूप में मौजूद नहीं होते हैं। यह भंडारण दक्षता के विपरीत खोज दक्षता पर अधिक ध्यान केंद्रित करता है। तेज़ खोज उपयोग के मामलों को चलाने के लिए संग्रहीत डेटा को व्यावहारिक रूप से समतल या असामान्यीकृत किया जाता है। Elasticsearch में रिश्तों को परिभाषित करने के कई तरीके हैं। आपके उपयोग के मामले के आधार पर, आप अपने डेटा को मॉडल करने के लिए इलास्टिक्स खोज में नीचे दी गई तकनीकों में से एक का चयन कर सकते हैं: एक-से-एक संबंध: ऑब्जेक्ट मैपिंग एक-से-अनेक संबंध: नेस्टेड दस्तावेज़ और अभिभावक-बच्चे मॉडल अनेक-से-अनेक संबंध: असामान्यीकरण और अनुप्रयोग-पक्ष जुड़ता है एक-से-एक ऑब्जेक्ट मैपिंग सरल है और यहां इस पर अधिक चर्चा नहीं की जाएगी। इस ब्लॉग का शेष भाग अन्य दो परिदृश्यों को अधिक विस्तार से कवर करेगा। Elasticsearch में अपना डेटा मॉडल प्रबंधित करना Elasticsearch में डेटा प्रबंधित करने के चार सामान्य दृष्टिकोण हैं: असमान्यीकरण अनुप्रयोग-पक्ष जुड़ता है नेस्टेड वस्तुएं माता-पिता-बच्चे के रिश्ते असमान्यीकरण डीनॉर्मलाइज़ेशन इलास्टिक्स खोज में सर्वोत्तम क्वेरी खोज प्रदर्शन प्रदान करता है, क्योंकि क्वेरी समय पर डेटा सेट में शामिल होना आवश्यक नहीं है। प्रत्येक दस्तावेज़ स्वतंत्र है और इसमें सभी आवश्यक डेटा शामिल हैं, इस प्रकार महंगे जॉइन ऑपरेशन की आवश्यकता समाप्त हो जाती है। असामान्यीकरण के साथ, अनुक्रमण के समय डेटा को एक चपटी संरचना में संग्रहीत किया जाता है। हालाँकि इससे दस्तावेज़ का आकार बढ़ जाता है और परिणामस्वरूप प्रत्येक दस्तावेज़ में डुप्लिकेट डेटा संग्रहीत हो जाता है। डिस्क स्थान कोई महंगी वस्तु नहीं है और इसलिए चिंता का कोई कारण नहीं है। असामान्यीकरण के लिए मामलों का उपयोग करें वितरित प्रणालियों के साथ काम करते समय, पूरे नेटवर्क में डेटा सेटों को जोड़ने से महत्वपूर्ण विलंबताएं आ सकती हैं। आप डेटा को असामान्य बनाकर इन महंगे जॉइन ऑपरेशन से बच सकते हैं। डेटा फ़्लैटनिंग द्वारा मैनी-टू-मैनी रिश्तों को संभाला जा सकता है। डेटा असामान्यीकरण के साथ चुनौतियाँ चपटे दस्तावेज़ों में डेटा के दोहराव के लिए अतिरिक्त भंडारण स्थान की आवश्यकता होती है। एक चपटी संरचना में डेटा का प्रबंधन करने से उन डेटा सेटों के लिए अतिरिक्त ओवरहेड खर्च होता है जो प्रकृति में संबंधपरक होते हैं। प्रोग्रामिंग परिप्रेक्ष्य से, असामान्यीकरण के लिए अतिरिक्त इंजीनियरिंग ओवरहेड की आवश्यकता होती है। आपको एकाधिक संबंधपरक तालिकाओं में संग्रहीत डेटा को समतल करने और इसे इलास्टिक्स खोज में एक ऑब्जेक्ट पर मैप करने के लिए अतिरिक्त कोड लिखने की आवश्यकता होगी। यदि आपका डेटा बार-बार बदलता है तो डेटा को असामान्य बनाना एक अच्छा विचार नहीं है। ऐसे मामलों में जब डेटा का कोई सबसेट बदलना हो तो डीनॉर्मलाइज़ेशन के लिए सभी दस्तावेज़ों को अपडेट करने की आवश्यकता होगी और इसलिए इससे बचा जाना चाहिए। चपटे डेटा सेट के साथ अनुक्रमण प्रक्रिया में अधिक समय लगता है क्योंकि अधिक डेटा अनुक्रमित किया जा रहा है। यदि आपका डेटा बार-बार बदलता है, तो यह इंगित करेगा कि आपकी अनुक्रमण दर अधिक है, जो क्लस्टर प्रदर्शन समस्याओं का कारण बन सकती है। एप्लिकेशन-साइड जॉइन दस्तावेज़ों के बीच संबंध बनाए रखने की आवश्यकता होने पर एप्लिकेशन-साइड जॉइन का उपयोग किया जा सकता है। डेटा को अलग-अलग सूचकांकों में संग्रहीत किया जाता है, और क्वेरी समय के दौरान एप्लिकेशन पक्ष से जॉइन ऑपरेशन किया जा सकता है। हालाँकि, इसमें दस्तावेज़ों में शामिल होने के लिए आपके आवेदन से खोज समय पर अतिरिक्त क्वेरी चलाना शामिल है। एप्लिकेशन-साइड जॉइन के लिए केस का उपयोग करें एप्लिकेशन-साइड जॉइन यह सुनिश्चित करते हैं कि डेटा सामान्यीकृत रहे। संशोधन एक ही स्थान पर किए जाते हैं, और आपके दस्तावेज़ों को लगातार अद्यतन करने की कोई आवश्यकता नहीं है। इस दृष्टिकोण से डेटा अतिरेक कम हो जाता है। यह विधि तब अच्छी तरह काम करती है जब दस्तावेज़ कम होते हैं और डेटा परिवर्तन कम बार होते हैं। एप्लिकेशन-साइड जॉइन के साथ चुनौतियाँ खोज समय पर दस्तावेज़ों में शामिल होने के लिए एप्लिकेशन को कई क्वेरी निष्पादित करने की आवश्यकता होती है। यदि डेटा सेट में कई उपभोक्ता हैं, तो आपको प्रश्नों के एक ही सेट को कई बार निष्पादित करने की आवश्यकता होगी, जिससे प्रदर्शन संबंधी समस्याएं हो सकती हैं। इसलिए, यह दृष्टिकोण इलास्टिक्स खोज की वास्तविक शक्ति का लाभ नहीं उठाता है। इस दृष्टिकोण के परिणामस्वरूप कार्यान्वयन स्तर पर जटिलता उत्पन्न होती है। दस्तावेज़ों के बीच संबंध स्थापित करने के लिए जॉइन ऑपरेशंस को लागू करने के लिए एप्लिकेशन स्तर पर अतिरिक्त कोड लिखने की आवश्यकता होती है। नेस्टेड वस्तुएँ यदि आपको सरणी में प्रत्येक ऑब्जेक्ट के संबंध को बनाए रखने की आवश्यकता है तो नेस्टेड दृष्टिकोण का उपयोग किया जा सकता है। नेस्टेड दस्तावेज़ों को आंतरिक रूप से अलग ल्यूसीन दस्तावेज़ों के रूप में संग्रहीत किया जाता है और क्वेरी समय पर जोड़ा जा सकता है। वे इंडेक्स-टाइम जॉइन हैं, जहां एक ही ब्लॉक में कई ल्यूसीन दस्तावेज़ संग्रहीत होते हैं। एप्लिकेशन परिप्रेक्ष्य से, ब्लॉक एकल इलास्टिक्स खोज दस्तावेज़ जैसा दिखता है। इसलिए क्वेरी करना अपेक्षाकृत तेज़ है, क्योंकि सारा डेटा एक ही ऑब्जेक्ट में रहता है। नेस्टेड दस्तावेज़ एक-से-अनेक संबंधों से संबंधित हैं। नेस्टेड दस्तावेज़ों के लिए केस का उपयोग करें नेस्टेड दस्तावेज़ बनाना तब प्राथमिकता दी जाती है जब आपके दस्तावेज़ में ऑब्जेक्ट की सारणी हो। नीचे चित्र 1 दिखाता है कि कैसे इलास्टिक्स खोज में नेस्टेड प्रकार वस्तुओं के सरणियों को अलग-अलग ल्यूसीन दस्तावेज़ों के रूप में आंतरिक रूप से अनुक्रमित करने की अनुमति देता है। ल्यूसीन के पास आंतरिक वस्तुओं की कोई अवधारणा नहीं है, इसलिए यह देखना दिलचस्प है कि इलास्टिक्स खोज आंतरिक रूप से मूल दस्तावेज़ को चपटे बहु-मूल्यवान क्षेत्रों में कैसे बदल देती है। नेस्टेड क्वेरीज़ का उपयोग करने का एक फायदा यह है कि यह क्रॉस-ऑब्जेक्ट मिलान नहीं करेगा, इसलिए अप्रत्याशित मिलान परिणामों से बचा जा सकता है। यह वस्तु की सीमाओं से अवगत है, जिससे खोज अधिक सटीक हो जाती है। चित्र 1: नेस्टेड दृष्टिकोण का उपयोग करके इलास्टिक्स खोज में अलग-अलग ल्यूसीन दस्तावेज़ों के रूप में आंतरिक रूप से अनुक्रमित वस्तुओं की सारणी नेस्टेड वस्तुओं के साथ चुनौतियाँ किसी नेस्टेड ऑब्जेक्ट को जोड़ने/अपडेट करने/हटाने के लिए रूट ऑब्जेक्ट और उसके नेस्टेड ऑब्जेक्ट को पूरी तरह से पुन: अनुक्रमित किया जाना चाहिए। दूसरे शब्दों में, चाइल्ड रिकॉर्ड अपडेट के परिणामस्वरूप संपूर्ण दस्तावेज़ को पुन: अनुक्रमित किया जाएगा। नेस्टेड दस्तावेज़ों तक सीधे नहीं पहुंचा जा सकता. उन तक केवल इसके संबंधित रूट दस्तावेज़ द्वारा ही पहुंचा जा सकता है। खोज अनुरोध केवल खोज क्वेरी से मेल खाने वाले नेस्टेड दस्तावेज़ों को वापस करने के बजाय संपूर्ण दस्तावेज़ लौटाते हैं। यदि आपका डेटा सेट बार-बार बदलता है, तो नेस्टेड दस्तावेज़ों का उपयोग करने से बड़ी संख्या में अपडेट प्राप्त होंगे। माता-पिता-बच्चे के रिश्ते माता-पिता-बच्चे के संबंध अलग-अलग दस्तावेज़ों में संबंधों वाली वस्तुओं को पूरी तरह से अलग करने के लिए लाभ उठाते हैं - माता-पिता और बच्चे। यह आपको दस्तावेज़ों को अलग-अलग इलास्टिक्स खोज दस्तावेज़ों में एक संबंधपरक संरचना में संग्रहीत करने में सक्षम बनाता है जिन्हें अलग से अपडेट किया जा सकता है। जॉइन डेटाटाइप का जब दस्तावेज़ों को अक्सर अद्यतन करने की आवश्यकता होती है तो माता-पिता-बच्चे के रिश्ते फायदेमंद होते हैं। इसलिए यह दृष्टिकोण उन परिदृश्यों के लिए आदर्श है जब डेटा बार-बार बदलता है। मूल रूप से, आप मूल दस्तावेज़ को माता-पिता और बच्चे वाले कई दस्तावेज़ों में अलग कर देते हैं। यह माता-पिता और बच्चे दोनों के दस्तावेज़ों को एक-दूसरे से स्वतंत्र रूप से अनुक्रमित/अद्यतन/हटाने की अनुमति देता है। माता-पिता और बच्चे के दस्तावेज़ों में खोज रहे हैं अनुक्रमण और खोज के दौरान इलास्टिक्स खोज प्रदर्शन को अनुकूलित करने के लिए, सामान्य अनुशंसा यह सुनिश्चित करना है कि दस्तावेज़ का आकार बड़ा नहीं है। आप अपने दस्तावेज़ को अलग-अलग दस्तावेज़ों में विभाजित करने के लिए अभिभावक-बच्चे मॉडल का लाभ उठा सकते हैं। हालाँकि, इसे लागू करने में कुछ चुनौतियाँ हैं। माता-पिता और बच्चे के दस्तावेज़ों को एक ही शार्ड पर ले जाने की आवश्यकता है ताकि क्वेरी समय के दौरान उन्हें जोड़ना मेमोरी में और कुशल हो। चाइल्ड दस्तावेज़ के लिए रूटिंग मान के रूप में पैरेंट आईडी का उपयोग करना आवश्यक है। फ़ील्ड इलास्टिक्स खोज को मूल दस्तावेज़ की आईडी और प्रकार प्रदान करता है, जो आंतरिक रूप से इसे मूल दस्तावेज़ के समान चाइल्ड दस्तावेज़ों को रूट करने देता है। _parent Elasticsearch आपको जटिल JSON ऑब्जेक्ट से खोज करने की अनुमति देता है। हालाँकि, कुशलतापूर्वक क्वेरी करने के लिए डेटा संरचना की गहन समझ की आवश्यकता होती है। पेरेंट-चाइल्ड मॉडल खोज कार्यक्षमता को सरल बनाने के लिए कई फ़िल्टर का लाभ उठाता है: क्वेरी has_child मूल दस्तावेज़ लौटाता है जिसमें क्वेरी से मेल खाने वाले बाल दस्तावेज़ होते हैं। क्वेरी has_parent माता-पिता को स्वीकार करता है और संबंधित माता-पिता से मेल खाने वाले बच्चे के दस्तावेज़ लौटाता है। क्वेरी inner_hits क्वेरी से प्रासंगिक बच्चों की जानकारी प्राप्त करता है। has_child चित्र 2 दिखाता है कि आप एक-से-अनेक संबंधों को प्रदर्शित करने के लिए माता-पिता-बच्चे मॉडल का उपयोग कैसे कर सकते हैं। माता-पिता को प्रभावित किए बिना बच्चे के दस्तावेज़ जोड़े/हटाए/अपडेट किए जा सकते हैं। यही बात मूल दस्तावेज़ के लिए भी सच है, जिसे बच्चों को दोबारा अनुक्रमित किए बिना अद्यतन किया जा सकता है। चित्र 2: एक-से-अनेक संबंधों के लिए माता-पिता-बच्चे का मॉडल माता-पिता-बच्चे के संबंधों के साथ चुनौतियाँ जॉइन ऑपरेशन के कारण क्वेरीज़ अधिक महंगी और मेमोरी-गहन हैं। माता-पिता-बच्चे के निर्माण के लिए एक ओवरहेड है, क्योंकि वे अलग-अलग दस्तावेज़ हैं जिन्हें क्वेरी के समय शामिल किया जाना चाहिए। यह सुनिश्चित करने की आवश्यकता है कि माता-पिता और उसके सभी बच्चे एक ही हिस्से में मौजूद हों। माता-पिता-बच्चे के संबंधों के साथ दस्तावेज़ों को संग्रहीत करने में कार्यान्वयन जटिलता शामिल है। निष्कर्ष अनुप्रयोग प्रदर्शन और रखरखाव के लिए सही इलास्टिक्स खोज डिज़ाइन चुनना महत्वपूर्ण है। इलास्टिक्स खोज में अपना डेटा मॉडल डिज़ाइन करते समय, यहां चर्चा की गई चार मॉडलिंग विधियों में से प्रत्येक के विभिन्न पेशेवरों और विपक्षों पर ध्यान देना महत्वपूर्ण है। डेटा मॉडलिंग इस लेख में, हमने पता लगाया कि कैसे नेस्टेड ऑब्जेक्ट और पैरेंट-चाइल्ड रिश्ते इलास्टिक्स खोज में SQL-जैसे जॉइन ऑपरेशंस को सक्षम करते हैं। आप एप्लिकेशन-साइड जॉइन के साथ संबंधों को संभालने के लिए अपने एप्लिकेशन में कस्टम तर्क भी लागू कर सकते हैं। ऐसे उपयोग के मामलों के लिए जिनमें आपको इलास्टिक्स खोज में कई डेटा सेटों को जोड़ने की आवश्यकता होती है, आप निष्पादक क्वेरी को सक्षम करने के लिए इन दोनों डेटा सेटों को इलास्टिक्स खोज सूचकांक में शामिल और लोड कर सकते हैं। बॉक्स से बाहर, Elasticsearch में SQL डेटाबेस की तरह जोड़ नहीं हैं। हालाँकि आपके दस्तावेज़ों में संबंध स्थापित करने के लिए संभावित समाधान मौजूद हैं, लेकिन इनमें से प्रत्येक दृष्टिकोण द्वारा प्रस्तुत चुनौतियों से अवगत होना महत्वपूर्ण है। नेटिव एसक्यूएल का उपयोग रॉकसेट के साथ जुड़ता है जब वास्तविक समय विश्लेषण के लिए कई डेटा सेटों को संयोजित करने की आवश्यकता होती है, तो एक डेटाबेस जो मूल SQL जोड़ प्रदान करता है, इस उपयोग के मामले को बेहतर ढंग से संभाल सकता है। इलास्टिक्स खोज की तरह, रॉकसेट का उपयोग डेटाबेस, इवेंट स्ट्रीम और डेटा लेक से डेटा पर एक अनुक्रमण परत के रूप में किया जाता है, जो इन स्रोतों से स्कीमलेस अंतर्ग्रहण की अनुमति देता है। इलास्टिक्स खोज के विपरीत, रॉकसेट की क्षमता प्रदान करता है, जिसमें जॉइन भी शामिल है, जिससे आपको अपने डेटा का उपयोग करने के तरीके में अधिक लचीलापन मिलता है। पूर्ण-विशेषताओं वाले SQL के साथ क्वेरी करने भी प्रकाशित किया गया है. यहाँ