Wpis z mikrobloga

Mirki z #elasticsearch, możecie polecić jakieś ciekawe tutoriale do niego?
Tyle, że chodzi mi o coś więcej, niż proste zapytania czy proste wrzucanie danych. Raczej interesuje mnie, jak używać tego w praktyce, kiedy przebudowywać indeksy, jak to najlepiej robić itp.
Jak mapować bazę SQL na Elastica, żeby przyspieszyć wyszukiwanie itd.
Ktoś coś? Z góry dzięki.
#programowanie #webdev
  • 15
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@zdzisiek-bula: Ogólnie jeśli chodzi o zaawansowane rzeczy, to raczej są to miesiące czytania/nauki/testowania (niż tygodnie). A i tak zawsze się okażę, że coś ci umknęło i można było zrobić lepiej/szybciej/efektywniej.

Robię duży projekt z ES (agregacje, zaawansowane wyszukiwania, autocomplete, geosearch, snapshoty, synchronizacja z SQL) i nie ma tygodnia żebym nie natknął się na coś nowego.

Ogólnie mają bardzo dobrą dokumentację na stronie. Tylko czasami zdarza się, że jakaś właściwość nie jest
  • Odpowiedz
@budyn: skoro masz już spory bagaż doświadczenia, to pozwolę sobie zadać najbardziej nurtujące mnie aktualnie pytanie.
Zakładam, że Elastica nie używasz jako głównej bazy tylko jako jej indeksu do przeszukiwania. W którym momencie i w jaki sposób przebudowujesz indeksy w momencie zmian w bazie źródłowej (CRUD)? W momencie wykonywania operacji, jakoś cronem czasowo czy jeszcze inaczej?
Tak z ciekawości, w jakim języku projekt?
  • Odpowiedz
@zdzisiek-bula: Elasticsearch nie nadaję się do użycia jako główna baza. Synchronizujemy bazę na podstawie timestampów. Jest usługa, która co minutę sprawdza bazę czy jakieś nowe zmiany są do wysłania. Zakładamy również, że nigdy nie usuwamy rekordów z bazy (powodowałoby to problemy z synchronizacją)

Idealnie powinna być jakaś kolejka (message bus), która trzyma eventy, które są czytane przez usługę, która synchronizuje zmiany do ES. Ale to nie przeszło, bo mamy za
  • Odpowiedz
@budyn: Skoro update Elastica robiony jest co minutę, to zaraz po jakiejś operacji (np. dodaniu rekordu) wszelkie wyszukiwania z niego korzystające nie zwrócą nowego rekordu. Zastanawiam się, jak to obejść. Potrzebuje pokazać listę elementów zaraz po dodaniu nowego, a lista ta właśnie miała by korzystać z Elastica.
Druga sprawa: czy takie odświeżanie indeksu (dodawanie rekordu do niego) jest na tyle szybkie, że jego wywoływanie powiedzmy ten raz na minutę nie
  • Odpowiedz
@budyn: Czy duże znaczenie ma typ danych który się mapuje?
Czy indeksowanie można oprzeć na bazie jakiś zewnętrznych taksonomii bez przebudowywania całego projektu?
  • Odpowiedz
@zdzisiek-bula: Musisz odróżnić kiedy ty robisz update a kiedy w ES ten update jest przetworzony.
https://www.elastic.co/guide/en/elasticsearch/guide/current/near-real-time.html
Ja robię update co minutę, defaultowo ES robi commit zmian co jedną sekundę. Dlatego zawsze minimum tą sekundę musisz poczekać zanim dane będą dostępne. Nie zalecany jest ręczny commit (w ES zwany "refresh")

@Verbatino: Nie rozumiem zbytnio o co Ci może chodzić. W ES masz podobne typy jak wszędzie indziej https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html
To
  • Odpowiedz
@budyn: W zakresie pytania pierwszego miałem na myśli szybkość działania w zależności od typu danych...
W zakresie pytania drugiego miałem na myśli przypadek w którym np wyszukujesz specyficzną frazę przygotowaną przez własny algorytm...np kategoryzacja produktu po jego specyficznych cechach...
  • Odpowiedz
@budyn: Ale jak robisz update co minutę, to godzisz się z tym, że wprowadzone dane będą dostępne w wyszukiwanie dopiero po minucie?
Masz jakiś patent, jak to obejść? Dodawanie rekordu do ES w momencie tworzenia rekordu w SQL w locie? Dobry pomysł?
  • Odpowiedz
@zdzisiek-bula: Też można tak zrobić. Ale co się stanie jak jakimś cudem insert do ES się nie powiedzie? Albo prąd padnie? Możesz sobie pozwolić, żeby obie bazy się rozschyronizowały? Musi to przez jakąś kolejkę iść, która jest odporna na nagłe odłączenie zasilania. 100% synchronizację możesz uzyskać, albo przez zapisywanie, który ostatnio rekord został wysłany do SQL (np 2 timestampy, updated, published i ściąganie tych co mają update > published i
  • Odpowiedz
@budyn: Wszystkie Twoje uwagi jak najbardziej cenne, pytanie tylko jest takie:
czy wrzucenie danych do ES przy odpowiednio dużej ilości danych może być wolne? Albo inaczej: czy czas wykonania wrzucenia danych do ES rośnie (liniowo/wykładniczo/inaczej?) wraz z przyrostem ilości danych w indeksie? Czy jednak trzyma swój poziom? Jak to wygląda z Twoich doświadczeń?
  • Odpowiedz
@zdzisiek-bula: Nie zauważyłem żadnych problemów. Najdłuższe requesty jakie wykonuję to wyszukiwanie używająć wielu polygonów oraz multisearch 50 zapytań w jednym. Wszystko poniżej 100ms. Zwykłe wyszukiwanie < 10ms. Indeksowanie też prawie natychmiastowe. Mam kilka milionów rekordów.
  • Odpowiedz