2013-07-23 5 views
11

मैं एक सूचकांक क्षेत्रों के साथ Solr में LocationIndex नामित के रूप में निम्नानुसार है:Solr कम्पोजिट अद्वितीय कुंजी

<fields> 
    <field name="solr_id" type="string" stored="true" required="true" indexed="true"/> 
    <field name="solr_ver" type="string" stored="true" required="true" indexed="true" default="0000"/> 
    // and some more fields 
</fields> 
<uniqueKey>solr_id</uniqueKey> 

लेकिन अब मैं स्कीमा को बदलने के लिए इतना है कि अद्वितीय कुंजी दो पहले से ही मौजूद का समग्र होना चाहिए चाहते हैं खेतों solr_id और solr_ver ... कुछ इस प्रकार है:

<fields> 
    <field name="solr_id" type="string" stored="true" required="true" indexed="true"/> 
    <field name="solr_ver" type="string" stored="true" required="true" indexed="true" default="0000"/> 
    <field name="composite-id" type="string" stored="true" required="true" indexed="true"/> 
    // and some more fields 
</fields> 
<uniqueKey>solr_ver-solr_id</uniqueKey> 

मैंने पाया कि यह स्कीमा के लिए निम्न जोड़कर संभव है खोज करने के बाद: (संदर्भ: Solr Composite Unique key from existing fields in schema)

<updateRequestProcessorChain name="composite-id"> 
    <processor class="solr.CloneFieldUpdateProcessorFactory"> 
    <str name="source">docid_s</str> 
    <str name="source">userid_s</str> 
    <str name="dest">id</str> 
    </processor> 
    <processor class="solr.ConcatFieldUpdateProcessorFactory"> 
    <str name="fieldName">id</str> 
    <str name="delimiter">--</str> 
    </processor> 
    <processor class="solr.LogUpdateProcessorFactory" /> 
    <processor class="solr.RunUpdateProcessorFactory" /> 
</updateRequestProcessorChain> 

तो मैं स्कीमा बदल गया है और अंत में यह दिखाई देता है:

<updateRequestProcessorChain name="composite-id"> 
    <processor class="solr.CloneFieldUpdateProcessorFactory"> 
    <str name="source">solr_ver</str> 
    <str name="source">solr_id</str> 
    <str name="dest">id</str> 
    </processor> 
    <processor class="solr.ConcatFieldUpdateProcessorFactory"> 
    <str name="fieldName">id</str> 
    <str name="delimiter">-</str> 
    </processor> 
    <processor class="solr.LogUpdateProcessorFactory" /> 
    <processor class="solr.RunUpdateProcessorFactory" /> 
</updateRequestProcessorChain> 

<fields> 
    <field name="solr_id" type="string" stored="true" required="true" indexed="true"/> 
    <field name="solr_ver" type="string" stored="true" required="true" indexed="true" default="0000"/> 
    <field name="id" type="string" stored="true" required="true" indexed="true"/> 
    // and some more fields 
</fields> 
<uniqueKey>id</uniqueKey> 

लेकिन जब एक दस्तावेज जोड़ने यह मुझे त्रुटि दे रही है:

org.apache.solr.client.solrj.SolrServerException: Server at http://localhost:8983/solr/LocationIndex returned non ok status:400, message:Document [null] missing required field: id 

मैं नहीं मिल रहा है क्या स्कीमा में आने वाले बदलाव कर रहे हैं वांछित के रूप में काम करने के लिए आवश्यक है?

एक दस्तावेज़ में जो मैं जोड़ता हूं, इसमें फ़ील्ड solr_ver और solr_id शामिल हैं। solr_ver-solr_id जैसे कुछ फ़ील्ड को जोड़कर यह कैसे और कहाँ होगा (solr) id फ़ील्ड बनायेगा?

संपादित करें:

this link पर यह कैसे इस श्रृंखला का उल्लेख दिया है। Bu मैं समझने में असमर्थ हूं कि इसका उपयोग स्कीमा में कैसे किया जाएगा? और मुझे परिवर्तन कहां करना चाहिए?

+0

आप अपने डाटाबेस-data.config फ़ाइल पोस्ट कर सकते हैं – Nipun

उत्तर

10

तो ऐसा लगता है कि आपके पास आपका अपडेट है RequestProcessorChain उचित रूप से परिभाषित किया गया है और इसे काम करना चाहिए। हालांकि, आपको इसे solrconfig.xml फ़ाइल में जोड़ने की आवश्यकता है, न कि schema.xml। आपके द्वारा प्रदान किया गया अतिरिक्त लिंक आपको अपने solrconfig.xml फ़ाइल को संशोधित करने और आपके सोलर इंस्टेंस के लिए वर्तमान /update अनुरोध हैंडलर में अपने परिभाषित अद्यतन RequestProcessorChain को जोड़ने का तरीका दिखाता है।

तो निम्न कार्य लगता है:

  1. अपने <updateRequestProcessorChain> करने के लिए अपने solrconfig.xml फ़ाइल ले जाएँ।
  2. अद्यतन अपने solrconfig.xml फ़ाइल में <requestHandler name="/update" class="solr.UpdateRequestHandler"> प्रवेश और इसे संशोधित तो यह की तरह लग रहा है:

    <requestHandler name="/update" class="solr.UpdateRequestHandler"> 
        <lst name="defaults"> 
         <str name="update.chain">composite-id</str> 
        </lst> 
    </requestHandler> 
    

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

+0

मैंने अपडेट किया जैसा आपने कहा और उम्मीद है कि यह कोर है rect .. लेकिन अब मुझे 'CloneFieldUpdateProcessorFactory' के लिए 'क्लास नहीं मिली' त्रुटि मिल रही है। क्या यह सुविधा पुरानी सोलर संस्करणों के लिए उपलब्ध नहीं है? मैं solr का उपयोग कर रहा हूं जिसका विनिर्देश हैं: 'सौर विशिष्टता संस्करण: 3.4.0.2011.09.09.09.06.17',' सौर कार्यान्वयन संस्करण: 3.4.0 1167142 - माइक - 2011-09-09 09: 06: 17'। –

+0

मैंने अभी सौर स्रोत को देखा और दुर्भाग्यवश, 'क्लोनफ़िल्ल्ड अपडेट प्रोसेसर फैक्टरी' केवल सौर 4.x संस्करणों में उपलब्ध है और इसे सौर 3.x संस्करणों के साथ शामिल नहीं किया गया है। माफ़ कीजिये। –

+0

मैंने कोशिश की और मुझे यह त्रुटि मिल रही है दस्तावेज़ अनिवार्य अद्वितीय है फ़ील्ड: समग्र-आईडी। क्या हमें इस कंपोजिट-आईडी को दस्तावेज़ – Nipun

4

उपर्युक्त समाधान में वर्णित कुछ सीमाएं हो सकती हैं, यदि "dest" अधिकतम लंबाई से अधिक है तो समेकित फ़ील्ड बहुत लंबे हैं। वहाँ भी MD5Signature साथ एक और उपाय है (निर्दिष्ट दस्तावेज़ क्षेत्रों के एक समूह के संयोजन से एक हस्ताक्षर स्ट्रिंग पैदा करने में सक्षम एक वर्ग, 128 बिट हैश सटीक डुप्लिकेट का पता लगाने के लिए इस्तेमाल किया)

<!-- An example dedup update processor that creates the "id" field on the fly 
    based on the hash code of some other fields. This example has 
    overwriteDupes set to false since we are using the id field as the 
    signatureField and Solr will maintain uniqueness based on that anyway. --> 
<updateRequestProcessorChain name="dedupe"> 
    <processor class="org.apache.solr.update.processor.SignatureUpdateProcessorFactory"> 
    <bool name="enabled">true</bool> 
    <bool name="overwriteDupes">false</bool> 
    <str name="signatureField">id</str> 
    <str name="fields">name,features,cat</str> 
    <str name="signatureClass">org.apache.solr.update.processor.Lookup3Signature</str> 
    </processor> 
    <processor class="solr.LogUpdateProcessorFactory" /> 
    <processor class="solr.RunUpdateProcessorFactory" /> 
</updateRequestProcessorChain> 

यहाँ से: http://lucene.472066.n3.nabble.com/Solr-duplicates-detection-td506230.html

+0

में परिभाषित करना है, मैंने इस समाधान की कोशिश की और फिर भी यह मुझे दस्तावेज़ देता है अनिवार्य अद्वितीय "आईडी" – Nipun

2

मैं एक टिप्पणी के रूप में जोड़ना चाहते हैं, लेकिन यह creds इन दिनों पाने के लिए असंभव है ... वैसे भी, यहाँ एक बेहतर लिंक है: https://wiki.apache.org/solr/Deduplication

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