Automatyczne generowanie identyfikatora dokumentu w Solr 4.x

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.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *