Elasticsearch w WordPress

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 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 😉

Podziel się:

Mikołaj Niedbała

I'm a Poland based IT administrator, linux administrator and IT engineer creating professional IT infrastructure solutions based on Linux and virtual environments.

One thought to “Elasticsearch w WordPress”

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *