2013-05-01 6 views
6

में बड़ी संख्या में आईडी को संभालना मुझे सोलर i.e में एक ऑनलाइन खोज करने की आवश्यकता है, जो उपयोगकर्ता को विशेष मानदंडों के साथ ऑनलाइन उपयोगकर्ता की सूची ढूंढने की आवश्यकता है।सोलर

मैं इस से निपटने कर रहा हूँ: हम एक तालिका में उपयोगकर्ता की आईडी की दुकान और मैं की तरह

&fq=-id:(id1 id2 id3 ............id5000) 

इस दृष्टिकोण के साथ समस्या Solr अनुरोध में सभी ऑनलाइन प्रयोक्ता आईडी भेजने यह है कि जब आईडी बड़े, Solr बन हल करने में बहुत अधिक समय लग रहा है और हमें नेटवर्क पर बड़े अनुरोध को स्थानांतरित करने की आवश्यकता है।

एक समाधान सोलर में शामिल होने का उपयोग किया जा सकता है लेकिन ऑनलाइन डेटा नियमित रूप से बदलता है और मैं हर बार डेटा इंडेक्स नहीं कर सकता (5-10 मिनट कहें, यह कम से कम एक घंटा होना चाहिए)।

अन्य समाधान मैं यूआरएल में कुछ पैरामीटर के आधार पर आंतरिक रूप से इस क्वेरी को फायर करने के बारे में सोचता हूं। मुझे सौर आंतरिक के बारे में ज्यादा जानकारी नहीं है इसलिए आगे बढ़ना नहीं है।

+1

यह Solr उपयोगकर्ताओं के बहुमत के लिए एक समस्या है और मुझे लगता है वे solr4.0 में कुछ भी नहीं किया है। यहाँ आप, जावा में एक विशेषज्ञ या Solr आंतरिक विशेषज्ञ –

उत्तर

3

सोलर 4 की मुलायम प्रतिबद्धता के साथ, यह सस्ता हो गया है कि वास्तव में उपयोगकर्ता रिकॉर्ड में सीधे "ऑनलाइन" ध्वज को स्टोर करना संभव हो सकता है, और केवल & fq = ऑनलाइन: आपकी क्वेरी पर सच है। इससे तार पर 5000 आईडी भेजने और उन्हें पार्स करने में शामिल ओवरहेड कम हो जाता है, और सौर को क्वेरी को थोड़ा सा अनुकूलित करने देता है। जब भी कोई लॉग इन या आउट करता है, अपनी स्थिति निर्धारित करता है और अपडेट पर प्रतिबद्धता सेट करता है। यह एक शॉट के लायक है, वैसे भी।

+0

मैं भी पहली बार इस कोशिश करेंगे की जरूरत के रूप में यह आसान है उपयोगकर्ताओं के साथ तारीख तक मेम्कैश किसी प्रकार का एक PostFilter को लागू करने से करते हैं और रखने के लिए वर्तमान में ऑनलाइन। NearRealtimeSearch के बारे में अधिक जानकारी सोलर की विकी http://wiki.apache.org/solr/NearRealtimeSearch में पाई जा सकती है लेकिन यदि यह काम नहीं करती है, तो मैं लेक्सक और असफ़ के तरीके से वर्णन करता हूं। – cheffe

+2

मैं dnt लगता है के रूप में मैं पहले ही उल्लेख किया अनुक्रमण संभव नहीं है और – chicharito

+2

आप नहीं पूरे सूचकांक इस विचार के अनुसार फिर से बनाने चाहिए यह आम तौर पर 15-30 मिनट लगते हैं यह एक विचार समाधान हो जाएगा। आप एकल इकाइयों को भी अपडेट कर सकते हैं। आपके मामले में, यदि कोई उपयोगकर्ता केवल उसके उपयोगकर्ता रिकॉर्ड में लॉग इन कर रहा है - उसका एकल रिकॉर्ड - अपडेट हो जाता है। ऐसा करने के लिए, आप उदा। भेज सकते हैं आपके सोलर सर्वर पर जेसन या एक्सएमएल अपडेट अनुरोध। संदर्भों के लिए यहां एक नज़र डालें http://yonik.com/solr/atomic-updates/ या http://wiki.apache.org/solr/UpdateJSON या http://solr.pl/en/2012/07/09/Solr-4-0-आंशिक-दस्तावेजों अद्यतन/ – cheffe

2

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

आप फिल्टर कार्यान्वयन यहाँ का एक अच्छा उदाहरण मिल सकते हैं: http://searchhub.org/2012/02/22/custom-security-filtering-in-solr/

+0

खुद फ़िल्टर बनाने का तरीका है, यह एक समाधान मैं देख रहा हूँ लेकिन नहीं पता ही आपका अपना फिल्टर – chicharito

+0

बनाने का तरीका कैसे मैं कि फिल्टर से mysql कनेक्ट कर सकते हैं के रूप में मैं एक php डेवलपर, पता नहीं कैसे php – chicharito

+1

का उपयोग कर यह करने के लिए कर रहा हूँ है मैंने कार्यान्वयन उदाहरण फ़िल्टर करने के लिए एक लिंक जोड़ा। – lexk

3

हम डेटा की Sharding को लागू करने से इस समस्या के समाधान में काम किया।

असल में, कोड विस्तार में भारी जा रहा बिना:

  • अपनी खुद की अनुक्रमण कोड
    • उपयोग consistent hashing लिखें तय करने के लिए जो आईडी चला जाता है जो Solr सर्वर
    • सूचकांक प्रासंगिक ठीकरा करने के लिए प्रत्येक उपभोक्ता डाटा पर (यह कई मशीनें हो सकती है)
    • सुनिश्चित करें कि आपके पास रिडंडेंसी
  • क्वेरी Solr टुकड़े
    • shards पैरामीटर
    • प्रारंभ एक EmbeddedSolr का उपयोग कर Solr में sharded प्रश्नों करो और इसका इस्तेमाल एक sharded क्वेरी
    • Solr सभी टुकड़े क्वेरी और परिणामों में मर्ज हो जाएगी ऐसा करने के लिए, यह भी समय समाप्ति प्रदान करता है, तो आप
यहां तक ​​कि क्या मैं ऊपर कहा के सभी के साथ

, मैं नहीं मानना ​​है Solr इस के लिए बिल्कुल उपयुक्त है प्रत्येक ठीकरा के लिए क्वेरी समय को सीमित करने की जरूरत है ।सोलर इंडेक्स पर खोजों के लिए वास्तव में उपयुक्त नहीं है जो लगातार बदल रहे हैं और यदि आप मुख्य रूप से एक खोज इंजन की तुलना में आईडी द्वारा खोजना आवश्यक नहीं है।

हमारी परियोजना के लिए हम मूल रूप से सभी इंडेक्स के निर्माण, लोड संतुलन और क्वेरी इंजन अपने आप को लागू करने और ज्यादातर भंडारण के रूप में Solr का उपयोग करें। लेकिन जब हम flaky थे और प्रदर्शन करने वाले नहीं थे, तो हम सोलर का उपयोग करना शुरू कर चुके हैं, मुझे यकीन नहीं है कि आज की स्थिति क्या है।

अंतिम नोट, अगर मैं पिछले 4 वर्षों में किए गए सभी कार्यों के बिना आज इस प्रणाली को खरोंच से बना रहा था, तो मैं वर्तमान में ऑनलाइन उन सभी उपयोगकर्ताओं को स्टोर करने के लिए कैश का उपयोग करने की सलाह दूंगा (memcached या redis कहें) और अनुरोध समय मैं बस उन सभी पर फिर से शुरू होता हूं और मानदंडों के अनुसार फ़िल्टर करता हूं। मापदंडों द्वारा फ़िल्टरिंग को स्वतंत्र रूप से कैश किया जा सकता है और वृद्धिशील रूप से अपडेट किया जा सकता है, यदि मिलान तर्क बहुत आसान है तो 5000 से अधिक रिकॉर्ड्स को फिर से शुरू करना जरूरी नहीं है।

0

एक समाधान Solr में शामिल होने के उपयोग हो सकता है लेकिन ऑनलाइन डेटा को नियमित रूप बदल सकते हैं और मैं नहीं कर सकते सूचकांक डेटा हर (माना 5-10 मिनट है, यह होना चाहिए कम से कम एक घंटा)

मुझे लगता है कि आप सोलर में शामिल होने का बहुत अच्छा उपयोग कर सकते हैं, लेकिन कुछ सुधार के बाद।

समाधान, मेरा प्रस्ताव है इस प्रकार है:

You can have 2 Indexes (Solr Cores) 

1. Primary Index (The one you have now) 
2. Secondary Index with only two fields , "ID" and "IS_ONLINE" 

अब आप माध्यमिक सूचकांक अक्सर (सेकंड के क्रम में) को अद्यतन कर सकते हैं और, टेबल आप के साथ समन्वयन में रखें ऑनलाइन उपयोगकर्ताओं के भंडारण के लिए ।

नोट: यह माध्यमिक सूचकांक भले ही अक्सर अद्यतन है, बशर्ते हम डेल्टा आयात के दौरान उपयुक्त क्वेरी के उपयोग की तरह आवश्यक तोड़ मरोड़ कर किसी भी प्रदर्शन, आदि

अब आप आईडी पर एक Solr join प्रदर्शन कर सकता है नीचा नहीं होता आप जो चाहते हैं उसे प्राप्त करने के लिए इन दो इंडेक्स पर फ़ील्ड। इंडेक्स/सोलर कोर के बीच सोलर जॉइन करने के तरीके पर link है।