2013-07-23 17 views
11

mam indeksu o nazwie LocationIndex w Solr z pola w następujący sposób:Solr Composite unikalny klucz z istniejących pól w schemacie

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

Ale teraz chcę zmienić schemat tak, że unikalny klucz musi być złożony z dwóch już obecny Pola solr_id i solr_ver ... coś w następujący sposób:

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

Po poszukiwaniach znalazłem, że jest to możliwe poprzez dodanie następujących do schematu: (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> 

Więc zmieniłem schemat i wreszcie to wygląda:

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

Ale podczas dodawania dokumentu to daje mi błąd:

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 

ja nie dostaję, jakie zmiany w schemacie są wymagane do pracy zgodnie z życzeniem?

W dokumencie, który dodaję, zawiera pola solr_ver i solr_id. Jak i gdzie to będzie (solr) utworzyć pole id, łącząc oba te pola, takie jak solr_ver-solr_id?

EDIT:

Na this link To biorąc pod uwagę jak odnoszą się do tego łańcucha. Bu Nie jestem w stanie zrozumieć, w jaki sposób będzie on stosowany w schemacie? I gdzie powinienem dokonać zmian?

+0

możesz opublikować plik db-data.config – Nipun

Odpowiedz

10

Wygląda na to, że masz poprawnie zdefiniowane polecenie updateRequestProcessorChain i powinno działać. Trzeba to jednak dodać do pliku solrconfig.xml, a nie do pliku schema.xml. Podany dodatkowy link pokazuje, jak zmodyfikować plik solrconfig.xml i dodać zdefiniowany element updateRequestProcessorChain do bieżącego /update modułu obsługi żądań dla instancji solr.

więc znaleźć wykonaj następujące czynności:

  1. Najedź <updateRequestProcessorChain> do pliku solrconfig.xml.
  2. Aktualizacja wpisu w pliku solrconfig.xml <requestHandler name="/update" class="solr.UpdateRequestHandler"> i zmodyfikować go tak wygląda następująco:

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

Należy wówczas wykonać swój określony łańcuch aktualizacji i wypełnić pole id, gdy nowe dokumenty są dodawane do indeksu.

+0

Zaktualizowałem, jak powiedziałeś, i mam nadzieję, że to prawda rect .. Ale teraz otrzymuję błąd 'class not found' dla' CloneFieldUpdateProcessorFactory'. Czy ta funkcja nie jest dostępna dla starszych wersji Solr? Używam solr, którego specyfikacje to: 'Solr Specification Version: 3.4.0.2011.09.09.09.06.17',' Solr Implementation Version: 3.4.0 1167142 - mike - 2011-09-09 09: 06: 17'. –

+0

Właśnie patrzyłem na źródło Solr i niestety, 'CloneFieldUpdateProcessorFactory' jest dostępne tylko w wersji Solr 4.x i nie jest dołączone do wersji Solr 3.x. Przepraszam. –

+0

Wypróbowałem to i otrzymuję ten błąd. W dokumencie brakuje obowiązkowego pola uniqueKey: composite-id. Czy musimy zdefiniować ten złożony identyfikator w dokumencie – Nipun

4

Opisane powyżej rozwiązanie może mieć pewne ograniczenia, a jeśli "dest" przekroczy maksymalną długość, ponieważ łączone pola są zbyt długie. Jest też jeszcze jeden rozwiązanie z MD5Signature (A klasy zdolnej do generowania sygnatura z konkatenacji grupy określonych dziedzinach dokumentów, 128-bitowy skrót stosowany do dokładnego wykrywanie duplikatów)

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

stąd: http://lucene.472066.n3.nabble.com/Solr-duplicates-detection-td506230.html

+0

Próbowałem tego rozwiązania, a mimo to daje mi to, że dokument nie ma obowiązkowego uniqueKey "id" – Nipun

Powiązane problemy