2013-07-23 25 views
11

şöyle ben alanlarla solr içinde LocationIndex adında bir dizin var:Solr Kompozit Benzersiz anahtar

<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> 

Ama şimdi benzersiz anahtar ikisi zaten mevcut kompozit olmalıdır böylece şemayı değiştirmek istiyorum alanları solr_id ve solr_ver ... şey aşağıdaki gibi:

<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> 

Ben şemaya aşağıdaki ekleyerek mümkün olduğunu bulduk arama yaptıktan sonra: (ref: 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> 
Yani şema değişti ve nihayet benziyor:

<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> 

Ama bir belge eklerken bana hata veriyor:

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 

ben vardır şemada değiştirir alamıyorum İstenildiği gibi çalışmak gerekli mi?

Eklediğim bir belgede, solr_ver ve solr_id alanlarını içerir. Hem bu alanı hem de solr_ver-solr_id gibi bir şey birleştirerek nasıl (solr) id alan yaratırsınız?

DÜZENLEME: Bu zincirdeki bakın nasıl verdi

this link anda. Bu şemada nasıl kullanılacağını anlayamıyorum? Ve nerede değişiklik yapmalıyım?

+0

Eğer db-data.config dosyasını gönderebilir – Nipun

cevap

10

Bu nedenle, updateRequestProcessorChain uygun şekilde tanımlanmış ve işe yaramalı gibi görünüyor. Ancak, bunu schema.xml dosyasını değil solrconfig.xml dosyasına eklemeniz gerekir. Sağladığınız ek bağlantı, solrconfig.xml dosyanızın nasıl değiştirileceğini ve solr örneğinizin geçerli /update istek işleyicisine tanımlanmış updateRequestProcessorChain değerini nasıl ekleyeceğinizi gösterir.

Yani aşağıdakileri yapın bulmak:

    sizin <updateRequestProcessorChain> için solrconfig.xml dosyasını taşıyın
  1. . Göründüğü gibi bu yüzden
  2. güncelleme solrconfig.xml dosyasında <requestHandler name="/update" class="solr.UpdateRequestHandler"> giriş ve değiştirmek aşağıdaki:

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

Bu daha sonra tanımlanan güncelleme zincirini yürütmek ve ne zaman yeni belgeler id alanı doldurmak gerekir dizine eklenir.

+0

Dediğin gibi güncelledim ve bu um rect .. Ama şimdi '' CloneFieldUpdateProcessorFactory' için '' sınıf bulunamadı 'hatası alıyorum. Bu özellik daha eski sürümleri için mevcut değil mi? Ben özellikleri olan Solr kullanıyorum: 'Solr Şartname Sürüm: 3.4.0.2011.09.09.09.06.17',' Solr Uygulama Sürümü: 3.4.0 1167142 - mike - 2011-09-09 09: 06: 17'. –

+0

Sadece Solr kaynağına baktım ve ne yazık ki, "CloneFieldUpdateProcessorFactory" sadece Solr 4.x sürümlerinde mevcut ve Solr 3.x sürümlerinde bulunmuyor. Afedersiniz. –

+0

Denedim ve bu hatayı alıyorum Zorunlu uniqueKey alan eksik: composite-id. Bu kompozit kimliğini – Nipun

4

Yukarıda açıklanan çözümün bazı sınırlamaları olabilir, ne varsa "hedef" maksimum uzunluktan uzunsa, çünkü birleştirilmiş alanlar çok uzun. MD5Signature bir kez daha bir çözüm de mevcuttur Buradan

<!-- 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> 

(belirtilen doküman alanlarının bir grup birleştirme bir imza dize üretebilen bir sınıfı, 128 bitlik bir karma tam bir eşi tespiti için kullanılır): http://lucene.472066.n3.nabble.com/Solr-duplicates-detection-td506230.html

burada daha iyi bir bağlantıdır, neyse ...
+0

belgesinde tanımlamamız gerekiyor mu? Bu çözümü denedim ve yine de bana Belge'nin zorunlu uniqueKey "kimliği" eksik olduğunu gösteriyor – Nipun