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:

Ilość danychWaga danychCzas indeksowania pliku w formacie XMLCzas indeksowania pliku w formacie JSONCzas indeksowania pliku w formcie CSV
10.000 dokumentówJSON:1.19MB
XML:1.88MB
CSV: 394KB
954ms734ms732ms
100.000 dokumentówJSON:12.4MB
XML:19.3MB
CSV: 4.33MB
7656ms6222ms6203ms
1.000.000 dokumentówJSON:129MB
XML:197MB
CSV: 48.1MB
126625ms119023ms108234ms

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.

This post is also available in: angielski

This entry was posted on poniedziałek, Kwiecień 18th, 2011 at 06:23 and is filed under Solr. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.