Solr 3.1: JSON Update Handler

W związku z pojawieniem się Solr 3.1 postanowiłem przyjrzeć się funkcjonalności rozszerzającej listę formatów za pomocą których możemy uaktualniać indeksy. Do tej pory mieliśmy do wyboru trzy rodzaje formatów za pomocą których mogliśmy dostarczać dane – XML, CSV oraz tzw. JavaBin. Wraz z pojawieniem się Solr 3.1 wprowadzono czwarty format – JSON.

Kilka słów na początek

JsonUpdateRequestHandler, bo tak nazywa się nowy handler, pozwala na przesyłanie danych w formacie JSON`a, co teoretycznie powinno przełożyć się na mniejszą ilość danych przesyłanych przez sieć oraz na zwiększoną szybkość indeksowania, jako, że parser JSON`a jest teoretycznie szybszy, niż parsery XML. Jednak wydajność zostawmy sobie na koniec.

Konfiguracja

Zacznijmy od zdefiniowania handlera w celu jego wykorzystania. Aby to zrobić należy do pliku solrconfig.xml dodać następujący wpis (jeżeli korzystacie z domyślnego pliku solrconfig.xml dołączonego do Solr 3.1 ten handler jest już zdefiniowany):

<requestHandler name="/update/json" class="solr.JsonUpdateRequestHandler" startup="lazy" />

Powyższy wpis definiuje nowy handler ładowany przy pierwszym odwołaniu do niego (startup=”lazy”).

Indeksowanie

Kolejny krok to przygotowanie danych do zaindeksowania – oczywiście w formacie JSON. Poniżej przykład pokazujący dwa dokumenty w jednym pliku nazwanym dane.json:

{

"add": {
  "doc": {
    "id" : "123456788",
    "region" : ["abc","def"],
    "name" : "ABCDEF",
  }
}

,
"add": {
  "doc": {
    "id" : "123456789",
    "region" : ["abc","def"],
    "name" : "XYZMN",
  }
}

}

Tak przygotowany plik możemy wysłać na adres /update/json i tym samym zaindeksować. Należy pamiętać o wysłaniu polecenia commit pod odpowiedni adres (standardowo /update) w celu zapisania zmian w indeksie.

Kilka słów o wydajności

Na sam koniec zostawiłem sobie to, co mnie tak naprawdę najbardziej interesuje – wydajność nowego handlera. Zgodnie z informacjami zapisanymi w systemie JIRA można się spodziewać, iż JsonUpdateRequestHandler będzie szybszy od swojego odpowiednika przetwarzającego pliki w formacie XML. Żeby to sprawdzić, przygotowałem pliki o wielkości 10.000, 100.000 oraz 1.000.000 dokumentów, które zawierały identyfikator (pole typu String), dwa regiony (pole typu String, wielowartościowe) oraz nazwę (pole typu Text). Jeden plik został zapisany analogicznie do pokazanego wcześniej przykładu formatu JSON, drugi plik został zapisany w formacie XML, trzeci został zapisany w formacie CSV. Wszystkie pliki były następnie indeksowane. Poniżej przedstawiam wynik tego prostego testu:

[table “9” not found /]

Wnioski nasuwają się same. Po pierwsze plik XML z danymi jest stosunkowo większy od tego, który zapisany został w formacie JSON`a (różnica to około 35%). Natomiast plik zapisany w formacie JSON jest jednak większy (czego należało się spodziewać) od tego, który zapisujemy w CSV. Jeżeli przesyłamy dane nie w sieci lokalnej, to wielkość ta ma znaczenie – różnica w wielkości jest na tyle znacząca, iż warto się zastanowić nad zmianą z XML do któregoś z formatów wymagających mniej miejsca na dysku.

Czas indeksacji

Kolejna sprawa, to czas indeksowania. Podpierając się wynikami tego prostego testu można stwierdzić, iż JsonUpdateRequestHandler jest nieznacznie (około 7 – 9%) szybszy od XmlUpdateRequestHandler`a. Jak widać, podobna różnica jest w przypadku JsonUpdateRequestHandler oraz CSVRequestHandler, gdzie handler operujący na plikach w formacie CSV jest szybszy od swojego odpowiednika operującego na formacie JSON o około 7 do 9%. Miejmy nadzieję, iż kiedy kiedy biblioteka noggit wyjdzie z Apache Labs jej wydajność będzie jeszcze większa, a tym samym JsonUpdateRequestHandler będzie jeszcze szybszy.

Dodaj komentarz

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