Kilka dni temu dostałem pytanie odnośnie automatycznego generowania identyfikatorów dokumentów w Solr 4.0 oraz nowszych. Postanowiliśmy napisać krótki wpis o tym, jak wygenerować identyfikator dokumentu automatycznie, korzystając z Solr 4.3.
Struktura danych
Struktura danych (sekcja fields pliku schema.xml) wygląda następująco:
<fields> <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> <field name="name" type="text_general" indexed="true" stored="true"/> <field name="_version_" type="long" indexed="true" stored="true"/> </fields>
Dodatkowo w pliku schema.xml definiujemy, które pole będzie przechowywać unikalny identyfikator:
<uniqueKey>id</uniqueKey>
Konfiguracja Solr
Następnie musimy zmodyfikować konfigurację Solr dodając odpowiedni UpdateRequestProcessorChain do pliku solrconfig.xml:
<updateRequestProcessorChain> <processor class="solr.UUIDUpdateProcessorFactory"> <str name="fieldName">id</str> </processor> <processor class="solr.LogUpdateProcessorFactory" /> <processor class="solr.RunUpdateProcessorFactory" /> </updateRequestProcessorChain>
Tym samym informujemy Solr, iż chcemy aby pole id było automatycznie wygenerowane.
Mały test
Przetestujmy to co zrobiliśmy. W tym celu wyślemy jeden dokument do zaindeksowania za pomocą następującego polecenia:
curl -XPOST 'localhost:8983/solr/update?commit=true' --data-binary '<add><doc><field name="name">Test</field></doc></add>' -H 'Content-type:application/xml'
Jeżeli wszystko poszło dobrze dokument został zaindeksowany. W związku z tym sprawdźmy, czy wygenerowany został identyfikator. Robimy to za pomocą następującego polecenia:
curl -XGET 'localhost:8983/solr/select?q=*:*&indent=true'
Odpowiedź na to zapytanie powinna wyglądać mniej, więcej tak:
<?xml version="1.0" encoding="UTF-8"?> <response> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">0</int> <lst name="params"> <str name="indent">true</str> <str name="q">*:*</str> </lst> </lst> <result name="response" numFound="1" start="0"> <doc> <str name="name">Test</str> <str name="id">1cdee8b4-c42d-4101-8301-4dc350a4d522</str> <long name="_version_">1439726523307261952</long> </doc> </result> </response>
Jak widać, identyfikator dokumentu został automatycznie wygenerowany. Jeżeli teraz uruchomilibyśmy indeksowanie jeszcze raz, czyli wykonali polecenie:
curl -XPOST 'localhost:8983/solr/update?commit=true' --data-binary '<add><doc><field name="name">Test</field></doc></add>' -H 'Content-type:application/xml'
A następnie znów wykonali zapytanie:
curl -XGET 'localhost:8983/solr/select?q=*:*&indent=true'
W odpowiedzi otrzymalibyśmy dwa dokumenty:
<?xml version="1.0" encoding="UTF-8"?> <response> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">1</int> <lst name="params"> <str name="indent">true</str> <str name="q">*:*</str> </lst> </lst> <result name="response" numFound="2" start="0"> <doc> <str name="name">Test</str> <str name="id">1cdee8b4-c42d-4101-8301-4dc350a4d522</str> <long name="_version_">1439726523307261952</long> </doc> <doc> <str name="name">Test</str> <str name="id">9bedcb5f-1b71-4ab7-80a9-9882a6bf319e</str> <long name="_version_">1439726693819351040</long> </doc> </result> </response>
Oba dokumenty mają zupełnie różne identyfikatory, które zostały wygenerowane automatycznie.