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:
<updateLog> <str name="dir">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:
<requestHandler name="/get" class="solr.RealTimeGetHandler"> <lst name="defaults"> <str name="omitHeader">true</str> </lst> </requestHandler>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:
curl 'http://localhost:8983/solr/update' -d @hd.xml -H 'Content-type:application/xml'Oczywiście, po indeksowaniu nie wysyłamy polecenia commit. Zgodnie z oczekiwaniami, zadanie zapytania w postaci:
http://localhost:8983/solr/select?q=*:*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:
http://localhost:8983/solr/get?id=SP2514NW odpowiedzi, na powyższe zapytanie otrzymujemy następujący dokument:
<?xml version="1.0" encoding="UTF-8"?> <response> <doc name="doc"> <str name="id">SP2514N</str> <str name="name">Samsung SpinPoint P120 SP2514N - hard drive - 250 GB - ATA-133</str> <str name="manu">Samsung Electronics Co. Ltd.</str> <str name="manu_id_s">samsung</str> <arr name="cat"> <str>electronics</str> <str>hard drive</str> </arr> <arr name="features"> <str>7200RPM, 8MB cache, IDE Ultra ATA-133</str> <str>NoiseGuard, SilentSeek technology, Fluid Dynamic Bearing (FDB) motor</str> </arr> <float name="price">92.0</float> <int name="popularity">6</int> <bool name="inStock">true</bool> <date name="manufacturedate_dt">2006-02-13T15:26:37Z</date> <str name="store">35.0752,-97.032</str></doc> </response>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.
{solr.data.dir:}</str>
</updateLog>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.