2013-06-17 5 views
5

के साथ सोलर सर्वर पक्ष पर सोलर दस्तावेज़ों को कैसे अपडेट करें मेरे पास लाखों रिकॉर्ड हैं।
मैं एक कस्टम हैंडलर जोड़ना चाहता हूं जो मौजूदा दस्तावेजों को स्कैन करता है और किसी शर्त के आधार पर फ़ील्ड में से एक अपडेट करता है (उदाहरण के लिए आयु> 12)।
मैं ग्राहक और पीछे के लाखों दस्तावेज़ भेजने से बचने के लिए इसे सौर सर्वर पक्ष पर करना पसंद करता हूं।
मैं एक सोलर प्लगइन लिखने की सोच रहा था जो एक क्वेरी प्राप्त करेगा और क्वेरी दस्तावेज़ों पर कुछ फ़ील्ड अपडेट करेगा (जैसे क्वेरी हैंडलर द्वारा हटाएं)।
मैं सोच रहा था कि मौजूदा समाधान या बेहतर विकल्प हैं या नहीं।
मैं थोड़ी देर के लिए वेब खोज रहा था और सोलर प्लगइन्स के उदाहरण नहीं ढूंढ पाए जो दस्तावेज़ अपडेट करते हैं (मुझे अद्यतन हैंडलर को बढ़ाने की आवश्यकता नहीं है)।
मैंने एक प्लग-इन लिखा है जो निम्न कोड का उपयोग करता है जो ठीक काम करता है लेकिन जितनी जल्दी हो सके उतना तेज़ नहीं है।
वर्तमान में मैं कार्य करें:कस्टम हैंडलर/प्लगइन

AddUpdateCommand addUpdateCommand = new AddUpdateCommand(solrQueryRequest); 
DocIterator iterator = docList.iterator(); 
SolrIndexSearcher indexReader = solrQueryRequest.getSearcher(); 
while (iterator.hasNext()) { 
    Document document = indexReader.doc(iterator.nextDoc()); 
    SolrInputDocument solrInputDocument = new SolrInputDocument(); 
    addUpdateCommand.clear(); 
    addUpdateCommand.solrDoc = solrInputDocument; 
    addUpdateCommand.solrDoc.setField("id", document.get("id")); 
    addUpdateCommand.solrDoc.setField("my_updated_field", new_value); 
    updateRequestProcessor.processAdd(addUpdateCommand); 
} 

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

+0

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

+0

मुझे डिलीट/ऐड स्टफ के बारे में पता है। मेरे परिदृश्य में डेटा है जो केवल सोलर इंडेक्स (गणना क्षेत्र) में मौजूद है। बाद में मुझे उन सभी दस्तावेजों के लिए किसी फ़ील्ड में कुछ डेटा जोड़ने की आवश्यकता है जो गणना किए गए फ़ील्ड (उदाहरण के लिए "आयु" फ़ील्ड) के आधार पर क्वेरी का उत्तर दें। क्या यह सौर लेखक पर एक लेखक खोलने और दस्तावेजों को बदलने के लिए जटिल है? –

+0

मुझे इस सटीक परिदृश्य का सामना नहीं करना पड़ा है, लेकिन मानते हुए मान (और बाद के अपडेट) के लिए "ट्रिगर" मानना ​​एक सूचकांक अपडेट है, शायद यह लिंक सहायक होगा: http://stackoverflow.com/questions/6593887/solr -और-कस्टम-अपडेट-हैंडलर – icey502

उत्तर

0

मुझे यकीन नहीं है कि निम्नलिखित प्रदर्शन में सुधार करने जा रहा है, लेकिन सोचा कि इससे आपकी मदद हो सकती है। पर SolrEntityProcessor

इसका वर्णन

देखो तुम क्या खोज रहे हैं के लिए बहुत प्रासंगिक लग रहा है।

This EntityProcessor imports data from different Solr instances and cores. 
The data is retrieved based on a specified (filter) query. 
This EntityProcessor is useful in cases you want to copy your Solr index 
and slightly want to modify the data in the target index. 
In some cases Solr might be the only place were all data is available. 

हालांकि, मैं अपने तर्क एम्बेड करने के लिए एक बाहर के बॉक्स सुविधा नहीं मिल सका। तो, आपको निम्न वर्ग का विस्तार करना पड़ सकता है।

SolrEntityProcessor और sourcecode

आप शायद पता हो सकता है के लिए लिंक, लेकिन अन्य बिंदुओं के एक जोड़े।

1) पूरी प्रक्रिया को सभी सीपीयू कोर उपलब्ध कराएं। इसे बहु-थ्रेडेड बनाएं।

2) सौर के नवीनतम संस्करण का उपयोग करें।

3) कम से कम नेटवर्क विलंब के साथ विभिन्न मशीनों पर दो सौर ऐप्स के साथ प्रयोग।

same machine, two processes VS two machines, more cores, but network overhead. 

4) अपने यूज-केस और विशेष रूप से कार्यान्वयन पर लागू होने वाला एक तरह से Solr cache ट्वीक: यह एक मुश्किल फोन होगा।

5) अधिक संसाधनों का एक जोड़े: Solr Performance Problems और SolrPerformanceFactors

आशा है कि यह मदद करता है। इस जवाब के बावजूद मुझे आंकड़े बताएं। मैं उत्सुक हूं और आपकी जानकारी बाद में किसी की मदद कर सकती है।

+0

आपकी सराहना के लिए धन्यवाद मैं एक बार अंतिम निष्कर्ष (पुरस्कार सहित) तक पहुंचने के बाद आपकी दिशाओं की जांच करूँगा और अपडेट करूंगा। @phani –

0

कस्टम तर्क कहां रखना है, यह इंगित करने के लिए, मैं with Solr's ScriptTransformer संयोजन के साथ the SolrEntityProcessor पर एक नज़र डालने का सुझाव दूंगा।

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

एक नमूना डेटा-config.xml इस

<?xml version="1.0" encoding="UTF-8" ?> 
<dataConfig> 

    <script> 
    <![CDATA[ 
     function calculateValue(row)  { 
      row.put("CALCULATED_FIELD", "The age is: " + row.get("age")); 
      return row; 
     } 
    ]]> 
    </script> 

    <document> 
    <entity name="sep" processor="SolrEntityProcessor" 
     url="http://localhost:8080/solr/your-core-name" 
     query="*:*" 
     wt="javabin" 
     transformer="script:calculateValue"> 
      <field column="ID" name="id" /> 
      <field column="AGE" name="age" /> 
      <field column="CALCULATED_FIELD" name="update_field" /> 
    </entity> 
    </document> 
</dataConfig> 

दिखाई दे सकता है आप देख सकते हैं, आप किसी भी डेटा परिवर्तन आप की तरह करते हैं और जावास्क्रिप्ट में व्यक्त है हो सकता है। तो यह आपके तर्क और परिवर्तन को व्यक्त करने के लिए एक अच्छा मुद्दा होगा।

आप एक बाधा कह सकते हैं शायद age > 12। मैं SolrEntityProcessor के query विशेषता के माध्यम से इसे संभाल लेंगे। आप query=age:[* TO 12] लिख सकते हैं ताकि अपडेट के लिए 12 तक की उम्र के साथ रिकॉर्ड ही पढ़े जाएंगे।

+0

आपकी सराहना के लिए धन्यवाद मैं एक बार अंतिम निष्कर्ष (पुरस्कार सहित) तक पहुंचने के बाद आपकी दिशाओं की जांच करूँगा और अपडेट करूंगा। @cheffe –

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