2011-08-25 20 views
25

मैं सोलर के साथ संयोजन में मोंगोडीबी का उपयोग करने के लिए बहुत कुछ देख रहा हूं, और यहां कुछ प्रश्नों में आंशिक प्रतिक्रियाएं हैं, लेकिन वास्तव में कुछ भी ठोस नहीं है (सिद्धांतों की तरह)। मेरे आवेदन में, मेरे पास मोंगोडीबी (शायद कुछ सौ मिलियन तक) में बहुत सारे दस्तावेज संग्रहीत किए जाएंगे, और मैं उन दस्तावेजों के कुछ गुणों पर पूर्ण-पाठ खोजों को कार्यान्वित करना चाहता हूं, इसलिए मुझे लगता है कि सोलर करने का सबसे अच्छा तरीका है इस।जावा - मोंगो डीबी + सोलर प्रदर्शन

मैं क्या जानना चाहता हूं कि मुझे सब कुछ कैसे कार्यान्वित/निष्पादित करना चाहिए ताकि इसमें अच्छा प्रदर्शन हो? अभी, यहाँ मैं (और मैं अपने इष्टतम नहीं पता) क्या करना है:

1- जब MongoDB में एक वस्तु डालने, मैं तो यह Solr

SolrServer server = getServer(); 
SolrInputDocument document = new SolrInputDocument(); 
document.addField("id", documentId); 
... 
server.add(document); 
server.commit(); 

2- को जोड़ते हैं की संपत्ति को अद्यतन करने वस्तु, के बाद से Solr सिर्फ एक क्षेत्र अद्यतन नहीं कर सकते, पहले मैं MongoDB से वस्तु तो मैं वस्तु और नए से सभी गुणों के साथ Solr अनुक्रमणिका को अपडेट करने और तरह

StreamingUpdateSolrServer update = new StreamingUpdateSolrServer(url, 1, 0); 
SolrInputDocument document = new SolrInputDocument(); 
document.addField("id", documentId); 
... 
update.add(document); 
update.commit(); 

3- कुछ करना जब क्वेरी करने को पुनः प्राप्त करने के लिए, पहले मैं क्वेरी सोलर और फिर दस्तावेजों की सूची को पुनर्प्राप्त करते समय SolrDocumentList मैं हर दस्तावेज के माध्यम से जाने के लिए और:

  1. दस्तावेज़
  2. की आईडी प्राप्त एक ही आईडी होने वहाँ से

4- जब गुण को पुनः प्राप्त करने में सक्षम हो MongoDB से वस्तु प्राप्त हटा रहा है, ठीक है मैंने अभी तक यह हिस्सा नहीं किया है और वास्तव में यह सुनिश्चित नहीं है कि जावा

तो किसी को भी यहां वर्णित प्रत्येक परिदृश्य के लिए इसे और अधिक प्रभावी तरीकों से कैसे किया जाए इस पर सुझाव है? इस प्रक्रिया को इस तरह से करने की प्रक्रिया में है कि जब सोलर में बहुत से दस्तावेज हों और एक समय में एक दस्तावेज़ जोड़ते हैं तो इंडेक्स को पुनर्निर्माण के लिए 1 घंटे नहीं लगेगा? मेरी आवश्यकताएं यहां हैं कि उपयोगकर्ता एक समय में एक दस्तावेज़ जोड़ना चाहते हैं, कई बार और मैं उन्हें

+0

कितना बड़ा है प्रत्येक दस्तावेज़ और गुण आप अनुक्रमित करना चाहते? –

+0

@ जस्टिन थॉमस - अच्छी तरह से प्रत्येक दस्तावेज़ में लगभग 10 गुण हो सकते हैं, उनमें से कुछ लंबे विवरण हो सकते हैं और मैं विवरण पर पूर्ण-पाठ खोज के लिए अनुक्रमित करना चाहता हूं, बस दूसरे पर सटीक मिलान करना। क्या इससे आपके प्रश्न का उत्तर मिलता है? – Guillaume

उत्तर

14

के बाद इसे पुनर्प्राप्त करने में सक्षम होना चाहता हूं आपका दृष्टिकोण वास्तव में अच्छा है। कम्पास जैसे कुछ लोकप्रिय ढांचे ओआरएम ढांचे के माध्यम से किए गए इंडेक्स परिवर्तनों को स्वचालित रूप से दर्पण करने के लिए निम्न स्तर पर वर्णन करते हैं (http://www.compass-project.org/overview.html देखें)।

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

प्रदर्शन के संबंध में, एक प्रतिबद्धता महंगा है और अनुकूलन बहुत महंगा है। आपके लिए सबसे महत्वपूर्ण चीज़ों के आधार पर, आप Solrconfig.xml में मर्जफेक्टर का मान बदल सकते हैं (उच्च मान लेखन प्रदर्शन में सुधार करते हैं जबकि कम मान पढ़ने के प्रदर्शन में सुधार करते हैं, 10 के साथ शुरू करने के लिए एक अच्छा मूल्य है)।

आपको इंडेक्स बिल्डिंग समय से डर लगता है। हालांकि, चूंकि लुसीन इंडेक्स स्टोरेज सेगमेंट-आधारित है, इसलिए लिखने के माध्यम से इंडेक्स के आकार (http://lucene.apache.org/java/2_3_2/fileformats.html) पर बहुत अधिक निर्भर नहीं होना चाहिए।हालांकि, वार्म अप समय में वृद्धि होगी, ताकि आप अपने solrconfig में लेकिन firstSearcher और newSearcher मापदंडों में बहुत अधिक जटिल नहीं प्रश्नों (क्रम fieldcaches लोड करने के लिए विशेष रूप से एक तरह के लिए) है कि

  • वहाँ विशिष्ट हैं सुनिश्चित करना चाहिए। एक्सएमएल कॉन्फ़िग फ़ाइल,
  • useColdSearcher क्रम अच्छा खोज प्रदर्शन के लिए में
    • गलत सेट है, या
    • सच है अगर आप एक धीमी खोज की कीमत पर खाते में तेजी से उठाए जाने वाले सूचकांक करने के लिए किया परिवर्तन चाहते हैं ।

इसके अलावा, अगर यह आप के लिए स्वीकार्य है डेटा खोजने योग्य हो जाता है, तो केवल कुछ ही एक्स मिलीसेकेंड के बाद यह MongoDB के लिए लिखा गया है, आप UpdateHandler की commitWithin सुविधा का उपयोग कर सकते हैं। इस तरह सोलर को अक्सर कम करना होगा।

Solr प्रदर्शन कारकों के बारे में अधिक जानकारी के लिए

,, http://wiki.apache.org/solr/SolrPerformanceFactors

दस्तावेजों को हटाने के लिए देखने के लिए आपको या तो दस्तावेज़ आईडी के आधार पर हटा सकते हैं (जैसा कि Schema.xml में परिभाषित) या क्वेरी द्वारा: http://lucene.apache.org/solr/api/org/apache/solr/client/solrj/SolrServer.html

+0

'deleteById' पर अच्छा बिंदु, मैंने वास्तव में इसे नहीं देखा (मुझे यह भी कहना नहीं था कि मैंने कुछ और जटिल किया था)। चूंकि आपको इसके बारे में बहुत कुछ पता है, यदि आपको कोई फर्क नहीं पड़ता है तो कुछ और प्रश्न: 1. एक अच्छा रैम बफर कितना है? 2. मैंने solrconfig.xml फ़ाइल उदाहरण के लिए firstSearcher और newSearcher को नहीं बदला है, क्या वे अच्छे हैं? 3. आखिर में, मेरे पास टॉमकैट के तहत चलने वाले सोलर का एक उदाहरण है, इसमें 5 कोर हैं। क्या यह निष्पादन के संबंध में कुछ भी बदलता है जिसमें सौर चलने के एक से अधिक उदाहरण हैं? आपके लिए धन्यवाद – Guillaume

+0

1. आपको सर्वश्रेष्ठ बफर आकार खोजने के लिए कुछ मानक करने की आवश्यकता है। मैं अनुशंसा करता हूं कि आप 32 एम के साथ शुरू करें और प्रत्येक पुनरावृत्ति पर रैम बफर के लिए उपलब्ध स्मृति की मात्रा को दोगुना करें, राम बफर आकार को बढ़ाने पर रोकें, कोई महत्वपूर्ण सुधार नहीं होता है। – jpountz

+0

2. वे नहीं हैं: फ़ील्ड कैश लोड करना (दूसरों के बीच आवश्यक प्रकार और फ़ंक्शंस प्रश्नों के लिए आवश्यक) परिणामस्वरूप सोलर के साथ समय लगता है, परिणामस्वरूप, पहली क्वेरी जो ताजा इंडेक्स पर फील्ड कैश का उपयोग करेगी, प्रदर्शन प्रदर्शन होगा, इसलिए आपको आवश्यकता है उन प्रश्नों को रखने के लिए जो इन फ़ील्ड कैश को लोड करेंगे (केवल एक क्वेरी डालें जो आपके एप्लिकेशन के समान फ़ील्ड पर प्रकार करेगी) नए खोजकर्ता और प्रथम खोजकर्ता में। – jpountz

1
  1. आप और अधिक दस्तावेजों की प्रतीक्षा कर सकते हैं और केवल प्रत्येक एक्स मिनट को अनुक्रमणित कर सकते हैं। (बेशक इस अत्यधिक & आवश्यकताओं आपके आवेदन की निर्भर करते हैं)

  2. अपने दस्तावेज़ों छोटे हैं और आप सभी डेटा (जो MongoDB में जमा हो जाती) की जरूरत नहीं है आप केवल फ़ील्ड के द्वारा आप Solr दस्तावेज में की जरूरत है डाल सकते हैं उन्हें भंडारण लेकिन का अनुक्रमण नहीं

<field name="nameoyourfield" type="stringOrAnyTypeYouuse"अनुक्रमित="false"संग्रहीत="true"/>

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