Wyszukiwanie treści - Elastic search czy czysty MySQL?

Nie ważne, czy prowadzisz bloga, masz sklep internetowy lub portal ogłoszeniowy - dobrze jest zaopatrzyć zaplecze pełne artykułów w wyszukiwarkę. Nie tylko pomoże to użytkownikom znaleźć produkt ale też ułatwi pracę edytorską.

przykładowa wyszukiwarka

Wyszukiwanie w bazie danych

Przeszukiwanie bazy danych można rozwiązać na wiele sposobów. W tym artykule skupimy się na przeszukiwaniu bazy MySQL oraz Elastic. Oba rozwiązania sprawdzają się lepiej w różnych środowiskach. Zacznijmy więc od przeszukiwania bazy MySQL.

Wyszukiwanie w bazie MySQL

Przeszukiwanie po MySQL jest wystarczające jeśli nasza baza nie jest bardzo obszerna i nie zawiera wielu, skomplikowanych tabel dodatkowych dla filtrów. Przykładem może być tutaj blog. Artykuły na blogu zazwyczaj wyszukuje się po treści, tytule, tagach i kategoriach, jeśli są to blogi jednoosobowe tych artykułów nie ma też tak dużo - nie są generowane w zastraszającym tempie. Podczas wyszukiwania łączymy wtedy ze sobą zaznaczone tagi i kategorie oraz dwa warunki wyszukiwania tekstowego - tytuł oraz treść. Tagi i kategorie są z góry definiowane więc nie szukamy ich tekstowo a po identyfikatorze. Przeszukiwanie tekstowe sprawdzi nam dwa pola w kilkudziesięciu tysiącach artykułów wystarczająco sprawnie, żeby użytkownik nie zanudził się czekając na wynik. W przypadku większych baz może to się skończyć przerwaniem skryptu przez zbyt długi czas jego wykonania. Do tego trzeba też dodać czas potrzebny aplikacji na dostosowanie wyników do wyświetlenia.

MySQL

Czas wyszukiwania będzie się też powiększał w zależności od ilości pól po których chcemy zawężać wyniki tekstowo, więc jeśli dodamy do tego szukanie po imieniu autora, treści załącznika lub innych, nie słownikowych filtrach wyniki będą zwracane z coraz większym opóźnieniem.

Pozytywnym aspektem tego rozwiązania jest koszt utrzymania. Baza danych MySQL nie wymaga wielu zasobów dla niedużych zbiorów, a koszty wsparcia są wliczone w koszt utrzymania aplikacji opartej na bazie danych.

Wyszukiwarki oparte o Elastic Search

Elastic nie potrzebuje zdefiniowanej struktury danych, dlatego mamy możliwość połączenia wszystkich danych w jeden zbiór przypisując je od razu do konkretnych obiektów. Pozwala nam to na znacznie szybsze i dokładniejsze przeszukiwanie bazy z wieloma filtrami. Elastic w pełni obsługuje wyszukiwania typu full text - oznacza to, że możemy bez żadnych przeszkód i bez znaczących spadków wydajności wyszukiwać treści korzystając z samych tekstów nawet przy bardzo dużych zbiorach danych. Dobrym przykładem mogą być tutaj sklepy internetowe.

elastic search

Poza zawężaniem wyników przy pomocy wybrania odpowiedniej kategorii lub tagu, możemy słowa kluczowe wpisać w samo pole wyszukiwarki. Odpowiednio zbudowane zapytanie pozwoli nam w łatwy sposób przeszukać wszystkie pola tekstowe obiektów, w tym nazwy kategorii i tagów, a nawet odmieniać wyszukiwane słowo aby dopasować je do treści ogłoszeń.

Dodatkowo do zwróconych danych możemy dodać ilość wyników w podziale na poszczególne grupy według pola, a nawet posortować wyniki według według dopasowania tekstów.

Minusem jest potrzeba utrzymania dodatkowego środowiska Java, który jest podstawą silnika Elastic Search. Dane można dodawać na żywo, ale zdecydowanie lepszym rozwiązaniem jest stworzenie skryptu, który odświeża bazę co jakiś czas pozwalając zachować integralność struktury.

Puenta

Podsumowując - wybór rozwiązania powinien być uzależniony od obszerności bazy. Oba przytoczone sposoby przeszukiwania mają swoje wady i zalety, które dla ułatwienia wypiszemy poniżej:

MySQL - plusy, minusy

  • + niskobudżetowy - nie wymaga dodatkowych zasobów, MySQL jest zazwyczaj standardem w hostingach www
  • + niski koszt wsparcia - przy stronach z nie dużą bazą danych MySQL nie wymaga wiele uwagi.
  • + prosta budowa zapytań - tworzenie zapytań dla mało skomplikowanych struktur bazy jest proste nawet dla początkujących programistów
  • - szybkość działania - szukanie po MySQL może być bardzo wolne przy obszernych i skomplikowanych bazach danych
  • - full text - wyszukiwanie słów lub fraz jest mocno ograniczone przez brak możliwości manipulacji ich treścią
  • - doczytywanie danych - często wyszukiwania danych w bazach MySQL wymagają łączenia dodatkowych tabel aby otrzymać kompletny obiekt, co może pożreć dodatkowe zasoby w postaci pamięci i czasu wykonania.

Elastic Search - plusy, minusy

  • + Kompletny obiekt w wyniku - obiekt w bazie Elastic może zawierać wszystkie dane jakich potrzebujemy, a nawet więcej jeśli weźmiemy pod uwagę przyszły rozwój
  • + szybkość działania - Elastic radzi sobie wyśmienicie z obszernymi bazami danych nawet przy wyszukiwaniu pełnych fraz
  • + agregacje - konstrukcja zapytań pozwala na dodanie do zwracanych danych pogrupowane dodatkowe wyniki np.: w postaci ilości obiektów z danymi kategoriami
  • + pełny full text - Elastic jest wyszukiwarką pełnotekstową, oznacza to że pozwala wyszukać dowolne frazy, zezwala na manipulację nimi oraz niedokładne dopasowanie aby poszerzyć wynik
  • - utrzymanie - silnik bazy zbudowany jest w Java, nie każdy hosting www daje możliwość obsługi tego środowiska i jest to dodatkowa technologia, która wymaga dopilnowania
  • - wymagania - mimo wielu pozytywnych argumentów za stosowaniem tego rozwiązania, ta negatywna zapewne będzie w większości przypadków kluczowa - Elastic wymaga sporej ilości zasobów (głównie RAM) w porównaniu do MySQL aby działać płynnie

Mimo wszystkich za i przeciw warto zastanowić się nad uruchomieniem Elastica dla dużych baz danych. Koszty utrzymania są rekompensowane z nawiązką przez zwiększenie wydajności całego systemu. Szukanie po MySQL warto jednak zachować w pamięci dla mniejszych baz żeby nie obciążać budżetu przy starcie projektu.