2013-01-22 31 views
133

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

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

  • क्या डेटा सेट छोटा या बड़ा है, तो दोनों अवधारणाओं के बीच प्रदर्शन भिन्नता है?

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

उत्तर

168

दोनों दृष्टिकोणों के लिए अलग-अलग प्रभाव हैं।

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

प्रभाव:

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

    • अधिक डेटा एक सूचकांक के 5 टुकड़े में संगृहीत किया जाएगा, जिसका अर्थ है वहाँ कम भूमि के ऊपर के मुद्दों है जब आप भर में क्वेरी: एक सूचकांक के भीतर एक वस्तु प्रकार के रूप में प्रत्येक डेटा मॉडल होने के लिए

    निहितार्थ विभिन्न डेटा मॉडल लेकिन आपका शर्ड आकार काफी बड़ा होगा।

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

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

+8

यह उत्तर http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/mapping.html – AndreKR

+0

से जानकारी के बिना पूरा नहीं हुआ है। धन्यवाद! – Vinay

+4

उत्कृष्ट उत्तर में जोड़ने के लिए, मैं ** ES 5.2 दस्तावेज़ ** से उद्धरण देता हूं जो बताता है कि बड़ी संख्या में शारों को बनाए रखने की सिफारिश क्यों नहीं की जाती है: "डिफ़ॉल्ट रूप से लोचदार खोज से 1000 से अधिक शर्ड्स पूछे जाने वाले खोज अनुरोधों को अस्वीकार कर दिया जाता है। कारण यह है कि इस तरह की बड़ी संख्या में शोर समन्वय नोड का काम बहुत सीपीयू और मेमोरी गहन बनाता है। आमतौर पर डेटा को व्यवस्थित करने का एक बेहतर विचार है कि कम बड़े शर्ड्स हैं। यदि आप इस सीमा को बाईपास करना चाहते हैं, जो कि है निराश, आप action.search.shard_count.limit क्लस्टर सेटिंग को अधिक मूल्य पर अपडेट कर सकते हैं। ' – oblivion

13

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

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

प्रतिधारण अवधि का क्या अर्थ है? क्या आप रहने वाले समय का जिक्र कर रहे हैं? यह प्रति दस्तावेज़ आधार पर सेट है। –

+0

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

0

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

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

  1. आप स्टोर करने के लिए कितनी पुस्तकें योजना बना रहे हैं: वहाँ लाइब्रेरी मालिक को पूछने के लिए कुछ सवाल,

    सवाल कर रहे हैं?

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

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

उत्तर:

  1. मैं 50 कश्मीर स्टोर करने के लिए योजना बना रहा हूँ - मैं 15 कश्मीर -20 कश्मीर प्रौद्योगिकी से संबंधित किताबें होगा 70 कश्मीर किताबें (लगभग)

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

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

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

// यह नहीं सटीक मानचित्रण, क्रम से ऊपर हम एक सूचकांक कहा जाता पुस्तकें बना सकते हैं और विभिन्न प्रकार हो सकता है प्राप्त करने के लिए है सिर्फ उदाहरण

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

के लिए।

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

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

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

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

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

25

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

Where we want to get to: We want to remove the concept of types from Elasticsearch, while still supporting parent/child.

तो नई परियोजनाओं के लिए, प्रति इंडेक्स केवल एक ही प्रकार का उपयोग करके एलैस्टिकशर्च 6.x को अंतिम अपग्रेड करना आसान हो जाएगा।