लोचदार खोज, एक सूचकांक बनाम कई सूचकांक और विभिन्न डेटा सेट के लिए प्रकार?


161

मेरे पास एमवीसी पैटर्न का उपयोग करके विकसित एक एप्लिकेशन है और मैं अब इसके कई मॉडलों को अनुक्रमित करना चाहूंगा, इसका मतलब है कि प्रत्येक मॉडल की एक अलग डेटा संरचना है।

  • क्या प्रत्येक मॉडल के लिए एक या एक ही इंडेक्स के भीतर एक प्रकार का उत्परिवर्ती अनुक्रमणिका का उपयोग करना बेहतर है? दोनों तरीकों से मुझे लगता है कि एक अलग खोज क्वेरी की भी आवश्यकता होगी। मैंने अभी इस पर शुरुआत की है।

  • यदि डेटा सेट छोटा है या विशाल है तो क्या दोनों अवधारणाओं में अंतर है?

मैं अपने आप में 2 प्रश्न का परीक्षण करूंगा अगर कोई मुझे उस उद्देश्य के लिए कुछ अच्छे नमूना डेटा की सिफारिश कर सकता है।

जवाबों:


184

दोनों दृष्टिकोणों के अलग-अलग निहितार्थ हैं।

यह मानकर कि आप एलीस्टेखर्च की डिफ़ॉल्ट सेटिंग्स का उपयोग कर रहे हैं, प्रत्येक मॉडल के लिए 1 इंडेक्स होने से आपके शार्क की संख्या में काफी वृद्धि होगी क्योंकि 1 इंडेक्स 5 शार्क का उपयोग करेगा, 5 डेटा मॉडल 25 शार्क का उपयोग करेगा; 1 इंडेक्स में 5 ऑब्जेक्ट प्रकार होने के बावजूद अभी भी 5 शार्क का उपयोग करने जा रहा है।

सूचकांक के रूप में प्रत्येक डेटा मॉडल के लिए निहितार्थ:

  • इंडेक्स के भीतर खोज करने के लिए कुशल और तेज़, क्योंकि प्रत्येक डेटा को प्रत्येक सूचक में छोटा होना चाहिए क्योंकि यह अलग-अलग सूचकांकों में वितरित किया जाता है।
  • 2 या अधिक सूचकांकों के डेटा मॉडल के संयोजन को ओवरहेड जनरेट करने जा रहा है, क्योंकि क्वेरी को सूचकांकों में अधिक शार्प पर भेजना होगा, संकलित किया जाएगा और उपयोगकर्ता को वापस भेजा जाएगा।
  • अनुशंसित नहीं है यदि आपका डेटा सेट छोटा है, क्योंकि आप प्रत्येक अतिरिक्त शार्द के साथ अधिक संग्रहण को बनाएंगे और प्रदर्शन लाभ मामूली है।
  • अनुशंसित है कि यदि आपका डेटा सेट बड़ा है और आपके प्रश्नों को संसाधित होने में लंबा समय लग रहा है, क्योंकि समर्पित शार्क आपके विशिष्ट डेटा को संग्रहीत कर रहे हैं और एलिटिक्स खोज के लिए प्रक्रिया करना आसान होगा।

सूचकांक के भीतर प्रत्येक डेटा मॉडल को ऑब्जेक्ट प्रकार के रूप में रखने के लिए निहितार्थ:

  • एक इंडेक्स के 5 हिस्से के भीतर अधिक डेटा संग्रहीत किया जाएगा, जिसका अर्थ है कि जब आप अलग-अलग डेटा मॉडल में क्वेरी करते हैं, तो ओवरहेड समस्याएं कम होती हैं, लेकिन आपके शार्क का आकार काफी बड़ा होगा।
  • फ़िल्टर करने के लिए और दस्तावेज़ होने के बाद से शार्क के भीतर अधिक डेटा एलिटिक्स खोज के लिए अधिक समय लेने वाला है।
  • अनुशंसित नहीं है यदि आप जानते हैं कि आप 1 टेराबाइट डेटा से गुजर रहे हैं और आप अपने डेटा को अलग-अलग सूचकांकों या एकाधिक शार्दूलों में आपके एलिटेसर्च मैपिंग में वितरित नहीं कर रहे हैं।
  • छोटे डेटा सेटों के लिए अनुशंसित, क्योंकि आप सीमांत प्रदर्शन लाभ के लिए भंडारण स्थान को बर्बाद नहीं करेंगे क्योंकि प्रत्येक शार्द आपके हार्डवेयर में जगह लेता है।

यदि आप पूछ रहे हैं कि बहुत अधिक डेटा बनाम छोटा डेटा क्या है? आमतौर पर यह प्रोसेसर की गति और आपके हार्डवेयर की रैम पर निर्भर करता है, आपके द्वारा एलिटिक्स खोज और आपकी क्वेरी आवश्यकताओं के लिए प्रत्येक मैपिंग में आपके द्वारा संग्रहित डेटा की मात्रा; आपके प्रश्नों में कई पहलुओं का उपयोग करने से आपकी प्रतिक्रिया का समय काफी धीमा हो जाएगा। इसका कोई सीधा जवाब नहीं है और आपको अपनी आवश्यकताओं के अनुसार बेंचमार्क करना होगा।



5
उत्कृष्ट उत्तर में जोड़ने के लिए, मैं ES 5.2 doc से उद्धृत करता हूं जो बताता है कि बड़ी संख्या में शार्क को बनाए रखने की सिफारिश क्यों नहीं की गई है: " By default elasticsearch rejects search requests that would query more than 1000 shards. The reason is that such large numbers of shards make the job of the coordinating node very CPU and memory intensive. It is usually a better idea to organize data in such a way that there are fewer larger shards. In case you would like to bypass this limit, which is discouraged, you can update the action.search.shard_count.limit cluster setting to a greater value."
विस्मृति

49

हालाँकि उस समय जोनाथन का जवाब सही था, दुनिया आगे बढ़ गई और अब ऐसा लगता है कि इलास्टिकसर्च के पीछे के लोगों के पास कई प्रकारों के लिए समर्थन छोड़ने की दीर्घकालिक योजना है:

जहां हम जाना चाहते हैं: हम माता-पिता / बच्चे का समर्थन करते हुए, एलेस्टिक्स खोज से प्रकारों की अवधारणा को हटाना चाहते हैं।

इसलिए नई परियोजनाओं के लिए, प्रति सूचकांक केवल एक ही प्रकार का उपयोग करने से ElasticSearch 6.x आसान हो जाएगा।


13

जोनाथन का जवाब बहुत अच्छा है। मैं सिर्फ कुछ अन्य बिंदुओं पर विचार करूंगा:

  • शार्क की संख्या आपके द्वारा चुने गए समाधान के अनुसार अनुकूलित की जा सकती है। आपके पास 15 प्राथमिक शार्क के साथ एक इंडेक्स हो सकता है, या इसे 5 इंडेक्स के लिए 3 इंडेक्स में विभाजित कर सकता है - प्रदर्शन परिप्रेक्ष्य नहीं बदलेगा (डेटा को समान रूप से वितरित किया जाता है)
  • डेटा उपयोग के बारे में सोचें। अर्थात। यदि आप कल्पना करने के लिए किबना का उपयोग करते हैं, तो विशेष इंडेक्स को शामिल करना / बाहर करना आसान है, लेकिन डैशबोर्ड में प्रकारों को फ़िल्टर करना पड़ता है
  • डेटा प्रतिधारण: एप्लिकेशन लॉग / मीट्रिक डेटा के लिए, यदि आपको अलग-अलग अवधारण अवधि की आवश्यकता है, तो विभिन्न अनुक्रमितों का उपयोग करें

अवधारण अवधि से क्या अभिप्राय है? क्या आप समय रहते क्षेत्र की बात कर रहे हैं? वह प्रति दस्तावेज़ के आधार पर निर्धारित है।
क्षितिज शर्मा

नहीं, यहां प्रतिधारण अवधि का मतलब दस्तावेज़ / सूचकांक प्रतिधारण के रूप में है - उन डेटा को कितने समय तक संग्रहीत करना है। डेटा गुणवत्ता, आकार, महत्व के आधार पर - मैं अलग अवधारण नीति को निर्दिष्ट करने के लिए उपयोग करता हूं। कुछ डेटा / इंडेक्स 7 दिनों के बाद डिलीट कर दिए जाते हैं, अन्य 6w के बाद और कुछ 10years के बाद ...
Marcel Matus

2

उपरोक्त दोनों उत्तर महान हैं!

मैं एक सूचकांक में कई प्रकारों का उदाहरण जोड़ रहा हूं। मान लीजिए कि आप किसी लाइब्रेरी में पुस्तकों की खोज के लिए एक ऐप विकसित कर रहे हैं। लाइब्रेरी के मालिक से पूछने के लिए कुछ प्रश्न हैं,

प्रशन:

  1. आप कितनी किताबें स्टोर करने की योजना बना रहे हैं?

  2. लाइब्रेरी में आप किस तरह की किताबें स्टोर करने जा रहे हैं?

  3. आप पुस्तकों की खोज कैसे कर रहे हैं?

उत्तर:

  1. मैं 50 k - 70 k पुस्तकें (लगभग) स्टोर करने की योजना बना रहा हूँ

  2. मेरे पास 15 k -20 k टेक्नोलॉजी से संबंधित किताबें (कंप्यूटर साइंस, मैकेनिकल इंजीनियरिंग, केमिकल इंजीनियरिंग और इसी तरह), 15 k ऐतिहासिक किताबें, 10 k मेडिकल साइंस की किताबें होंगी। भाषा से संबंधित पुस्तकों के 10 k (अंग्रेजी, स्पेनिश और इतने पर)

  3. लेखकों द्वारा खोजें पहला नाम, लेखक अंतिम नाम, प्रकाशन का वर्ष, प्रकाशक का नाम। (यह आपको यह विचार देता है कि आपको सूचकांक में कौन सी जानकारी संग्रहीत करनी चाहिए)

उपरोक्त उत्तरों से हम कह सकते हैं कि हमारे सूचकांक में स्कीमा कुछ इस तरह दिखना चाहिए।

// यह सटीक मैपिंग नहीं है, सिर्फ उदाहरण के लिए

            "yearOfPublish":{
                "type": "integer"
            },
            "author":{
                "type": "object",
                "properties": {
                    "firstName":{
                        "type": "string"
                    },
                    "lastName":{
                        "type": "string"
                    }
                }
            },
            "publisherName":{
                "type": "string"
            }
        }

उपरोक्त प्राप्त करने के लिए हम पुस्तकें नामक एक सूचकांक बना सकते हैं और इसके विभिन्न प्रकार हो सकते हैं।

सूचकांक: पुस्तक

प्रकार: विज्ञान, कला

(या आप कई प्रकार की तकनीक बना सकते हैं जैसे कि प्रौद्योगिकी, चिकित्सा विज्ञान, इतिहास, भाषा, यदि आपके पास बहुत अधिक पुस्तकें हैं)

यहां ध्यान देने वाली महत्वपूर्ण बात यह है कि स्कीमा समान है लेकिन डेटा समान नहीं है। और दूसरी महत्वपूर्ण चीज कुल डेटा है जिसे आप स्टोर कर रहे हैं।

उम्मीद है कि उपरोक्त सूचकांक में विभिन्न प्रकारों के लिए जाने में मदद करता है, यदि आपके पास अलग-अलग स्कीमा हैं तो आपको अलग-अलग सूचकांक पर विचार करना चाहिए। कम डेटा के लिए छोटा सूचकांक। बड़े डेटा के लिए बड़ा सूचकांक :-)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.