Wbudowane w WordPress’a mechanizmy wyszukiwania nie są ani szczególnie wydajne ani skuteczne. Chcąc dostarczyć naszym odbiorcom wyszukiwanie na satysfakcjonującym poziomie musimy sięgnąć po zewnętrzne narzędzia wyszukiwania. Jednym z nich jest Elasticsearch – nowoczesny i wydajny engine wyszukiwania, którego społeczność dostarcza także plugin do integracji z WordPress.
Biznesowe uzasadnienie dla wyboru Elastic (przemianowanego z Elasticsearch) znajdziemy oczywiście na stronie producenta. Jednak poza marketingowym opisem Elastic ma kilka atutów, które obiektywnie skłaniają do wybrania tego rozwiązania.
Pierwszym i najważniejszym z nich jest łatwość skalowania Elastic. Z punktu widzenia dzisiejszych standardów infrastruktur dla serwisów WWW istotna jest prostota implementacji jako rozwiązania w architekturze rozproszonej. Dzięki nieskomplikowanemu sposobowi zestawiania klastra można zapewnić nie tylko wysoką dostępność, ale także łatwy przyrost wydajności.
Ze względu na charakter administrowanych przeze mnie infrastruktur opiszę implementację Elastic w obrębie Debiana.
Elastic do działania wymaga Java 7 . Warto zwrócić na to uwagę umieszczając go w naszej infrastrukturze. Użycie Java implikuje pewien narzut, więc w przypadku środowisk wirtualizowanych polecałbym przygotowanie dedykowanej maszyny 🙂 Do instalacji wybrałem openjdk z repozytoriów Debiana:
apt-get install openjdk-7-jre
nastomiast Elastic zainstalowałem z prekompilowanych paczek z repozytorium producenta. Opis instalacji znajdziemy w specjalnym artykule. Program można oczywiście skompilować ze źródeł, co jest standardową procedurą instalacji 🙂
Plik konfiguracyjny – elasticsearch.yml zlokalizowany jest w Debianie w katalogu:
/etc/elasticsearch/
jego struktura i sposób edytowania są proste i czytelne. Większą część opcji zajmują ustawienia związane ze skalowalnością Elastic, w tym szczegółowe ustawienia klastrowania, o czym nie będę rozpisywał się w tym artykule. Z punktu widzenia podstawowej (jednoinstancyjnej) konfiguracji istotnych jest kilka innych opcji.
Po pierwsze warto wskazać miejsce, gdzie składowana będzie baza wyszukiwania. Wskazanie dedykowanej ich lokalizacji (innej niż domyślne {path.home}/data) jest o tyle istotne, że baza wyszukiwania trzymana jest w plikach. Dobrze więc zapewnić miejsce na składowanie tychże gwarantujące wysoką przepustowość (zarówno w kontekście IOPS, jak i uchwytów do plików) oraz łatwo dające się backupować. W konfiguracji miejsce składowania bazy definiujemy:
path.data: /var/elasticDataDir
Kolejną opcją, której zmiana może poprawić komfort korzystania z Elastic jest włączenie opcji mlockall poprzez ustawienie / odkomentowanie:
bootstrap.mlockall: true
Jak przyznaje sam producent:
Elasticsearch performs poorly when JVM starts swapping: you should ensure that it _never_ swaps.
Wymieniona wyżej zmienna pozwala zalokować pamięć używaną przez Elastic. Rozwiązanie to jest zalecane, jednak należy pamiętać o kilku rzeczach, aby zadziałało poprawnie. Po pierwsze ilość pamięci jaką chcemy alokować dla Elastic musimy określić w zmiennych środowiskowych Java. Możemy użyć domyślnej zmiennej JAVA_OPTS albo wykorzystać dedykowaną – ES_JAVA_OPTS. W jej obrębie definiujemy dwa parametry -Xmx oraz -Xms (określające odpowiednio maksymalną i minimalną ilość pamięci alokowaną dla procesu).
export set ES_JAVA_OPTS="-Xmx2g -Xms2g"
Następnie musimy zdefiniować dwie kolejne zmienne środowiskowe ES_MIN_MEM oraz ES_MAX_MEM. Zmienne te określają minimalną i maksymalną ilość pamięci alokowanej przez JVM i według zaleceń producenta powinny być ustawione na jednakową wartość:
export set ES_MIN_MEM="2g" export set ES_MAX_MEM="2g"
Tak przygotowaną konfigurację Elastic możemy uruchomić standardowo, skryptem zainstalowanym w /etc/init.d .
Kolejnym etapem jest integracja z WordPress. Jak wspomniałem na początku społeczność dostarcza plugin do integracji, dlatego odbywa się ona niezwykle prosto. Plugin można pobrać z oficjalnego repozytorium Wordpress, a nazywa się Fantastic ElasticSearch .
Konfiguracja opisana jest na stronie pluginu, warto pamiętać jednak do dwóch istotnych rzeczach. Pierwszą z nich jest przemyślane ustawienie zmiennych w sekcji Result Scoring pluginu. Zawiera ona ustawienia niedokładności określające z jakim przybliżeniem semantycznym będą wyszukiwane słowa oraz z jaką wagą traktowane są w wyszukiwaniu poszczególne pola (np. tytuł, treść posta, tagi).
Druga istotna rzecz związana jest z ponownie z samym Elastic oraz językiem polskim (oczywiście jeżeli w takim języku prowadzimy stronę 😉 ). Aby wyszukiwanie przybliżone działało dla języka polskiego należy zainstalować plugin odpowiadający za wyszukiwanie z polską semantyką. Stempel, bo tak nazywa się ten plugin można pobrać stąd. Do instalacji wykorzystać można standardowy mechanizm Elastic:
/usr/share/elasticsearch/bin/plugin install elasticsearch/elasticsearch-analysis-stempel/2.4.2
Niestety, mechanizm plugin dostarczany wraz z Elastic w tak prosty sposób działa tylko z pluginami wspieranymi przez producenta. Szczegółowy opis instalacji pluginów, również tych niewspieranych przez Elastic znajdziemy w dokumentacji.
Powyższy opis jest oczywiście tylko podstawową konfiguracją integracji Elastic i WordPress. Poza klastrem do konfiguracji pozostaje szereg parametrów administracyjnych (np. adres nasłuchiwania) oraz merytorycznych (np. wspomniana już niedokładność wyszukiwania). Być może temat ten uda się rozwinąć w kolejnych postach 😉
Przydatna funkcja.