Solr 4.0: Realtime GET

Kolejną funkcjonalnością, jakiej postanowiłem się przyjrzeć, w związku ze zbliżającym się Solr 4.0, jest tzw. „Realtime Get”. Jest to funkcjonalność umożliwiająca wyszukiwanie danych, które nie zostały jeszcze dodane do indexu, czyli po ich indeksowaniu nie zostało wysłane polecenie commit. Spójrzmy zatem, jak to działa.

Trochę teorii

Aktualizacja danych w Lucene i Solr ma jeden zasadniczy minus – w przypadku standardowego korzystania nie jesteśmy w stanie zobaczyć zmian w indeksie, do chwili, kiedy nie zostanie wywołane polecenie commit. Problem polega na tym, iż operacja commit jest stosunkowo droga pod względem wydajnościowym i zbyt częste jej używanie może powodować problemy. Z związku z tym, jeżeli podczas implementacji aplikacji wykorzystującej Lucene lub Solr możesz być postawiony przed wyborem: albo wysoka wydajność, albo szybko widoczne zmiany. W związku z tym twórcy Lucene i Solr podjęli prace w kierunku umożliwiającym wyszukiwanie Near Real Time (NRT). W Lucene mamy już tą możliwość, w wersji 4.0 Solr także się jej doczekamy, ale nie tylko jej.

Konfiguracja

Aby funkcjonalność Realtime Get miała możliwość działania, potrzebujemy skonfigurować następujące rzeczy:

Log transakcyjny

Pierwsza z rzeczy koniecznych do uruchomienia funkcjonalności Realtime Get to zapisywanie loga transakcyjnego. W tym celu do konfiguracji updateHandler’a dodajemy następujący wpis:

Powyższy wpis oznacza, iż katalog z logiem transakcyjnym zostanie zapisany w katalogu, gdzie zapisywane są dane.

Realtime Get handler

Druga rzecz, którą musimy zrobić, aby zobaczyć Realtime Get w działaniu, to zdefiniowanie odpowiedniego handlera (bądź komponentu). W tym celu do pliku solrconfig.xml dodajemy następujący wpis:

Powyższy wpis, to nic innego jak zdefiniowanie nowego handlera, opartego o klasę solr.RealTimeGetHandler, który umożliwia wyszukiwanie w oparciu o log transakcyjny.

Działanie

Aby sprawdzić działanie Realtime Get postanowiłem zrobić dość prosty test. Najpierw zaindeksowałem jeden plik (z tych które dostępne są w katalogu exampledocs) za pomocą następującego polecenia:

Oczywiście, po indeksowaniu nie wysyłamy polecenia commit. Zgodnie z oczekiwaniami, zadanie zapytania w postaci:

nie zwraca wyników wyszukiwania. Sprawdźmy więc, czy handler zarejestrowany jako /get jest w stanie dostarczyć nam wyniki. Wywołuję zatem następujące zapytanie:

W odpowiedzi, na powyższe zapytanie otrzymujemy następujący dokument:

Zatem otrzymaliśmy dokument, który nie został jeszcze dodany do indeksu.

Możliwe zastosowanie

Zauważyliście pewnie, że aby pobrać dokument musiałem podać jego identyfikator (możliwe jest także podanie listy identyfikatorów). To prawda, Realtime Get przynajmniej w tym momencie, nie wspiera pełnego wyszukiwania, ponieważ nie do tego został stworzony. Funkcjonalność ta jest w stanie pokazać aktualizację dokumentów, których znamy identyfikatory – np. poprzez dodanie komponentu wykorzystywanego w solr.RealTimeGetHandler do dowolnego innego handlera. Dodatkowo nie musimy się bać o wydajność – komponent jest bardzo szybki. Zatem, jeżeli jednym z problemów twojej aplikacji opartej na Solr, jest problem z długim oczekiwaniem na aktualizację możesz z uśmiechem patrzeć w przyszłość 🙂

Podsumowując

Funkcjonalność ta niesie za sobą bardzo dużo możliwości jeżeli chodzi o Solr, a także jego rozwój w kierunku SolrCloud. Na podstawie loga transakcyjnego będzie możliwe zaimplementowanie, np. automatycznego odtwarzania instancji Solr w klastrze, czy aktualizacji instancji w bardzo szybkim czasie. Jak widać wersja 4.0 to nie tylko usprawnienia w kierunku wyszukiwania, ale także rozwój Solr w kierunku baz NOSQL.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

This site uses Akismet to reduce spam. Learn how your comment data is processed.