Do napisania tego artykułu zainspirował mnie Szymon zadając pytanie pod jednym z wpisów z tej serii. Odpowiedziałem dosyć obszernie, ale stwierdziłem, że będzie to dobry temat na odrębny post, dzięki czemu całość dotrze do szerszego grona odbiorców. Szymon zapytał jakiego klienta Elasticsearcha do użycia z Javą lub Kotlinem polecam. Poniżej postaram się podzielić moimi doświadczeniami w tym temacie.

Cykl artykułów "Uczymy się Elasticsearch"

Ten wpis jest częścią cyklu, w którym staram się pokazać w jaki sposób możesz zbudować przyjazną dla użytkownika wyszukiwarkę, wykorzystując do tego celu potężny silnik wyszukiwania jakim jest Elasticsearch.

Do tej pory w ramach cyklu ukazały się następujące artykuły:

  1. instalacja, uruchomienie i pierwsze zapytanie
  2. kilka słów na temat Elastic Stack
  3. przydatne narzędzia
  4. indeks odwrócony Apache Lucene
  5. wyszukiwanie pełnotekstowe
  6. trafność
  7. przygotowanie tekstu do optymalnego wyszukiwania
  8. coś poszło nie tak, czyli seria moich fackupów
  9. zaczarowany zakreślacz
  10. o co jeszcze możemy zapytać?
  11. schowaj się za aliasem
  12. zadbaj o bezpieczeństwo
  13. wstępne procesowanie dokumentów przed indeksowaniem
  14. przegląd klientów języka Java
  15. ...

Z czego korzystałem?

Ze względu na to, że sam Elasticsearch został napisany w Javie, dosyć naturalnym jest obecność klienta języka Java na liście oficjalnych klientów dostarczanych przez firmę Elastic. Co ciekawe przechodząc przez kolejne strony okazuje się, że Elastic dostarcza w tym momencie (dla Elasticsearch 7.0) aż trzy rodzaje klientów dla tego języka! Miałem to (nie)szczęście używać każdego produkcyjnie, więc mam się teraz czym z Tobą podzielić 🙂

Java Low Level REST Client

Pierwszym, którego używałem był Java Low Level REST Client. Jak sama nazwa wskazuje, jest to klient REST, działający po HTTP.

W tym miejscu muszę zaznaczyć, że fragment „low level” nie kłamie 🙂 Wystarczy spojrzeć na dokumentację sposobu użycia. Zobaczysz tam, że wymaga on od użytkownika znajomości wielu szczegółów na temat Elasticsearcha. Musimy bowiem podać jakiej metody HTTP chcemy użyć i pod jaki endpoint uderzyć. Na tej płaszczyźnie klient nie pomaga nam zbyt dużo. Główną rzeczą, w której nas wyręcza jest nawiązywanie połączenia i nieco konfiguracji. Niewiele ponad to czego możemy dokonać ze zwykłym klientem REST.

Żeby więc skorzystać z pełnej mocy Elasticsearcha i użyć którejś z dostępnych opcji wyszukiwania pełnotekstowego, highlightingu lub innych rzeczy, które wcześniej opisałem, musimy nadziergać masę JSON-ów w Javie. Ci, którzy mięli tę wątpliwą przyjemność wiedzą jak to boli.

Rekomendacja: używać tylko w akcie największej desperacji 🙂

Transport Client

Drugim klientem (w kolejności mojego użycia) jest działający bardziej niskopoziomowo (po TCP) Transport Client. Zaglądając do dokumentacji wyszukiwania od razy zauważymy, że jest lepiej. Mamy tu jakieś fluent API. Jest query DSL. Całość sprawia, że zapytania możemy budować w przejrzysty sposób, bez rzeźbienia JSON-ów. I muszę przyznać, że w praktyce działa to dokładnie tak dobrze, jak wygląda w tej dokumentacji 🙂

Rekomendacja: używać… ale… no właśnie.

Ja znalazłem dwa problemy. Jeden mały, drugi większy. Mały jest taki, że Transport Client od wersji 7.0 jest w fazie deprecated i w wersji 8.0 zostanie całkowicie usunięty. Większym problemem jest to, że nie da się go wykorzystać z Elasticsearchem hostowanym przez AWS-a, bo Amazon Elasticsearch Service nie wspiera transportu TCP. Na szczęście, na oba te problemy istnieje rozwiązanie.

Java High Level REST Client

Tym rozwiązaniem jest Java High Level REST Client. To właśnie on, zgodnie z komunikatem firmy Elastic, jest następcą Transport Clienta. Dobra wiadomość jest taka, że faktycznie wygląda on na solidnego sukcesora. W porównaniu do swojego poprzednika, posiada jeszcze bogatsze API, przy zachowaniu płynności pisania zapytań. Nie ma problemu z wykorzystaniem go przy Elasticsearchu od AWS-a, bo działa po HTTP. Pod maską opakowuje po prostu Java Low Level REST Clienta, zdejmując z naszych barków konieczność żonglowania JSON-ami w Javie.

Rekomendacja: używać bardzo 🙂

Spring Data Elasticsearch

Jeżeli jesteś osobą, która kojarzy projekt Spring mogło Ci przyjść do głowy pytanie, czy nie ma czegoś dedykowanego dla Elasticsearcha w ramach projektu Spring Data. Jest. Spring Data Elasticsearch. I to, że istnieje, to jedyna dobra wiadomość 😉

Moduł jest bowiem brandowany marką Springa, ale nie jest on głównym modułem, a „jedynie” modułem community. Bycie pod kuratelą społeczności nie jest co prawda żadną ujmą, ale kiedy spojrzysz na kompatybilność wersji, to od razu rzuci Ci się w oczy fakt, że Spring Data Elasticsearch nie nadąża za tym co wypuszcza firma Elastic. W przeszłości było jeszcze gorzej.

Dodatkowym minusem jest fakt, że na chwilę obecną Spring Data Elasticsearch korzysta z Transport Clienta, co dorzuca mu problemów opisanych powyżej.

Rekomendacja: obserwować.

Co jeszcze jest na rynku?

Oprócz oficjalnych klientów dostarczanych przez firmę Elastic, jest jeszcze długa lista klientów tworzonych przez społeczność. Nie korzystałem z żadnego, ale w ramach uzupełnienia postaram się przejrzeć te kręcące się wokół JVM-a.

Java

JESTFlummi. Obydwa wyglądają na nierozwijane. Ostatnie zmiany są sprzed ładnych kilkunastu miesięcy.

Kotlin

ES KotlinES Kotlin Wrapper Client. Pierwszy stara się dostarczyć query DSL dla Kotlina z wykorzystaniem Transport Clienta, drugi opakowuje Java High Level REST Clienta. Ładnie to wygląda, bo usuwają sporo nadmiarowego kodu. Na chwilę obecną są jednak w dosyć wczesnej fazie developmentu.

Scala

Wabisabiescalar możemy potraktować jako porzucone. Ostatnie zmiany są sprzed dwóch lat. elastic4sElasticsearch Client wyglądają na rozwijane. I z tego co widzę starają się nadążać za kolejnymi wersjami Elasticsearcha. W szczególności ten pierwszy.

Clojure

spandexElastisch. Są 🙂 Elastisch wygląda na dojrzalszy, ale spandex jest kompatybilny z nowszą wersją Elasticsearcha.

Podsumowanie

Jak widzisz w teorii jest tego sporo. Podejrzewam, że znalazłbym coś więcej, co nie figuruje na liście klientów na stronie Elasticsearcha. Wybór klienta zależy od preferencji i wersji Elasticsearcha z jaką działasz, ale chcąc być najbardziej na czasie i mieć najmniejszy ból głowy polecałbym skierowanie się w pierwszej kolejności na oficjalnego Java High Level REST Clienta, a dopiero w przypadku problemów szukałbym alternatyw. A może się mylę? Jakie masz doświadczenia z wyżej wymienionymi klientami? Podziel się proszę swoimi wrażeniami w komentarzach poniżej.


Bądź na bieżąco!

Podobają Ci się treści publikowane na moim blogu? Nie chcesz niczego pominąć? Zachęcam Cię do subskrybowania kanału RSS, polubienia fanpage na Facebooku, zapisania się na listę mailingową:




Uwaga! Jeżeli w ciągu 24-godzin od zapisania się na listę mailingową nie otrzymasz wybranego przez siebie prezentu to skontaktuj się ze mną.

Zgoda? Zapisując się do newslettera wyrażasz zgodę na przesyłanie Ci starannie wyselekcjonowanych informacji marketingowych. Powyższe dane są przechowywane w systemie MailChimp i nie są udostępniane nikomu więcej.

lub śledzenia mnie na Twitterze. Generalnie polecam wykonanie wszystkich tych czynności, bo często zdarza się tak, że daną treść wrzucam tylko w jedno miejsce. Zawsze możesz zrobić to na próbę, a jeśli Ci się nie spodoba – zrezygnować :)

Dołącz do grup na Facebooku

Chcesz więcej? W takim razie zapraszam Cię do dołączenia do powiązanych grup na Facebooku, gdzie znajdziesz dodatkowe informacje na poruszane tutaj tematy, możesz podzielić się własnymi doświadczeniami i przemyśleniami, a przede wszystkim poznasz ludzi interesujących się tą samą tematyką co Ty.

W grupie Programista Na Swoim znajdziesz wiele doświadczonych osób chętnych do porozmawiania na tematy krążące wokół samozatrudnienia i prowadzenia programistycznej działalności gospodarczej. Vademecum Juniora przeznaczone jest zaś do wymiany wiedzy i doświadczeń na temat życia, kariery i problemów (niekoniecznie młodego) programisty.

Wesprzyj mnie

Jeżeli znalezione tutaj treści sprawiły, że masz ochotę wesprzeć moją działalność online, to zobacz na ile różnych sposobów możesz to zrobić. Niezależnie od tego co wybierzesz, będę Ci za to ogromnie wdzięczny.

Na wsparciu możesz także samemu zyskać. Wystarczy, że rzucisz okiem na listę różnych narzędzi, które używam i polecam. Decydując się na skorzystanie z któregokolwiek linku referencyjnego otrzymasz bonus również dla siebie.

Picture Credits