Jak pierwszy raz dodawałem wyszukiwarkę do aplikacji Railsowej, to wybór był prosty, bo właściwie nie było żadnego – acts_as_ferret. W pierwszej chwili byłem bardzo mile zaskoczony, bowiem korzysta się z tego niezwykle prosto, można indeksować nie tylko pola znajdujące się w bazie, ale również wyniki wywołania metod modelu, indeksowanie odbywa się na żywo. Super sprawa.
Jakiś czas później jednak zaczęły się schody – indeksowanie na żywo po pewnym czasie generowało błędne wyniki, poważnie zwalniało operacje na większej ilości danych (konieczność przeindeksowania po każdej zmianie), a na koniec na serwerze produkcyjnym ferret w pewnym momencie całkowicie odmówił współpracy, sypiąc jakimiś błędami, o których developerzy wiedzą, ale nie mogą ich powtórzyć, a co za tym idzie, naprawić.
Szczęśliwie wtedy już sytuacja na polu wyszukiwania w Railsach nie była już taka jednoznaczna. Poza Ferretem był również javowski Solr (którego można używać za pomocą acts_as_solr) i rosyjski Sphinx. Zdecydowałem się na tego ostatniego i okazało się to potem świetną decyzją. Ma niesamowite tempo indeksowania – zbiory, których indeksowanie przez Ferreta nie zmieściłoby się w ośmiogodzinnym dniu pracy były trawione w kilka minut. Oczywiście, są też pewne minusy – brak indeksowania na żywo (podobno do obejścia przez zastosowanie delta indeksów, ja nie miałem jak dotąd takiej potrzeby), wydłużony czas indeksowania jeśli chcemy później przeszukiwać z użyciem infiksów i prefiksów (lecz nadal o wiele szybszy niż w przypadku Ferreta) i brak możliwości indeksowania treści, które nie znajdują się bezpośrednio w bazie.
Sphinxa łatwo zintegrujemy z aplikacją korzystając z jednego z dwóch sprawdzonych przeze mnie pluginów – Thinking Sphinx i Ultrasphinx. Ten pierwszy jest prostszy w konfiguracji, wygodniejszy w użyciu, ale Ultrasphinx posiada większe możliwości i jest tym pluginem, którego nalezy użyć jeśli posiada się nietypowo umieszczone dane w bazie (jako, że pozwala na pisanie własnych zapytań SQL do wyciągania danych).
Przy podłączaniu Sphinxa do Railsowej aplikacji jest jedna rzecz, która sprawiała problemy – reprezentacja polskich znaków. Baza jest w UTF-8, ale znając lenistwo niektórych przy wpisywaniu polskich znaków chcielibyśmy, aby frazy wyszukiwania ‘Zażółć gęślą jaźń’ i ‘zazOlC gesLA jazN’ dawały te same wyniki. Należy wtedy dokonać drobnej manipulacji zmienną charset_table w pliku konfiguracyjnym Sphinxa. W moim przypadku przyjęła ona taką postać.
Jest to zapożyczenie wzbogacone przeze mnie o niektóre brakujące polskie znaki diakrytyczne. Dane z bazy są sprowadzane do zbioru małych liter alfabetu łacińskiego i takoż indeksowane. Jeśli komuś brakuje jakiegoś znaku wśród tych reguł, to warto skorzystać z wyszukiwarki znaków i znaleziony tam kod dodać do pliku konfiguracyjnego.