2013-07-23 18 views
11

Ho un indice denominato LocationIndex in solr con campi come segue:Solr Composite Chiave univoca da campi esistenti nello schema

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

Ma ora voglio cambiare schema in modo che chiave univoca deve essere composto di due già presenti campi solr_id e solr_ver ... qualcosa come segue:

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

Dopo la ricerca ho scoperto che è possibile con l'aggiunta seguente allo schema: (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> 

Così ho cambiato schema e, infine, sembra che:

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

Ma, mentre l'aggiunta di un documento che mi sta dando errore:

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 

Non ricevo quali cambiamenti nello schema sono richiesto di lavorare come desiderato?

In un documento che aggiungo, contiene i campi solr_ver e solr_id. Come e dove sarà (solr) creare il campo id combinando entrambi questi campi come solr_ver-solr_id?

EDIT:

A this link è dato come riferimento a questa catena. Bu Non riesco a capire come verrebbe usato nello schema? E dove dovrei apportare modifiche?

+0

puoi pubblicare il file db-data.config – Nipun

risposta

10

Quindi sembra che il tuo updateRequestProcessorChain sia definito in modo appropriato e che dovrebbe funzionare. Tuttavia, è necessario aggiungerlo al file solrconfig.xml e non allo schema.xml. Il collegamento aggiuntivo fornito mostra come modificare il file solrconfig.xml e aggiungere il tuo updateRequestProcessorChain definito all'attuale gestore di richieste /update per l'istanza solr.

Così trovare effettuare le seguenti operazioni:

  1. Spostare il <updateRequestProcessorChain> al file solrconfig.xml.
  2. Aggiornare il <requestHandler name="/update" class="solr.UpdateRequestHandler"> voce nel file solrconfig.xml e modificarlo in modo che appaia simile al seguente:

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

Questo dovrebbe quindi eseguire la vostra catena di aggiornamento definito e popolare il campo ID quando nuovi documenti sono aggiunti all'indice.

+0

Ho aggiornato come hai detto e spero che sia il cor rect .. Ma ora sto ottenendo l'errore 'class not found' per' CloneFieldUpdateProcessorFactory'. Questa funzione non è disponibile per le versioni precedenti di solr? Sto usando solr le cui specifiche sono: 'Solr Specification Versione: 3.4.0.2011.09.09.09.06.17',' Solr Implementation Versione: 3.4.0 1167142 - mike - 2011-09-09 09: 06: 17'. –

+0

Ho appena guardato il sorgente Solr e sfortunatamente, 'CloneFieldUpdateProcessorFactory' è disponibile solo nelle versioni 4.x di Solr e non è incluso nelle versioni 3.x di Solr. Scusate. –

+0

L'ho provato e sto ricevendo questo errore Documento mancante campo uniqueKey obbligatorio: composito-id. Dobbiamo definire questo ID composito nel documento – Nipun

4

La soluzione sopra descritta potrebbe avere alcune limitazioni, cosa succede se "dest" è al di sopra della lunghezza massima perché i campi concatenati sono troppo lunghi. C'è anche una soluzione più con MD5Signature (Una classe in grado di generare una stringa firma dalla concatenazione di un gruppo di campi di documenti specifici, a 128 bit di hash utilizzato per il rilevamento esatto duplicato)

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

Da qui: http://lucene.472066.n3.nabble.com/Solr-duplicates-detection-td506230.html

+0

Ho provato questa soluzione e ancora mi dà Documento mancante uniqueKey "id" obbligatorio – Nipun