Sphinx to open source’owy silnik wyszukiwarki SQL. Sphinx jest dostępny na licencji GPL 2 i jest całkowicie darmowy do zastosowań webowych.
Sphinx został stworzony przez rosyjskich programistów, aplikacja jest cały czas rozbudowywana i rozwijana, posiada płatny support.
Zasada działania Sphinxa
Sphinx jest aplikacją stand-alone, musi zostać skompilowany i zainstalowany na serwerze. Działa na zadadzie deamon-client.
Sphinx składa się z kilku narzędzi:
- searchd – deamon wyszukiwarki. Musi być cały czas uruchomiony, na podstawie parametrów wywołania oraz konfiguracji przeszukuje indeksy i zwraca rezultaty.
- indexer – generator indeksu. Służy do budowania indeksu, po którym następuje wyszukiwanie.
- search – narzędzie pozwalają testować wyszukiwarkę z poziomu linii komend.
- spelldump – narzędzie pomocne przy budowania słownika
- indextool – narzędzie wprowadzone dopiero w wersji 0.9.9-rc2. Służy do debugowania i wyświetlania informacji o zbudowanym indeksie.
Cechy Sphinxa
- Ekstremalnie szybkie indeksowanie (aż do 10MB/sec).
- Ekstremalnie szybkie wyszukiwanie (około 0.1 sekundy dla 2-4 GB zbiorów danych).
- Bardzo duża skalowalność (aż do 100 GB zbiorów danych na pojedyńczym CPU).
- Współpracuje z wieloma typami baz danych: PostgreSQL, MySQL i MSSQL.
- Posiada API dla języków takich jak PHP, Python, Java, Perl, Ruby i C/C++.
- Obsługuję morfologię (przeszukiwanie pełnotekstowe (brak języka polskiego)).
- Umożliwia sortowanie/filtrowanie wyników po zadanych atrybutach.
- Umożliwia grupowanie rezultatów po zadanym atrybucie.
- Wspiera stronnicowanie rezultatów.
- Prosty, a zarazem dostarczający wiele możliwści plik konfiguracyjny.
Sphinx nie operuje bezpośrednio na bazie danych a jedynie na wcześniej przygotowanych indeksach. Dzięki temu zdejmujemy obciążenie z „wąskiego gardła”, którym w praktycznie każdej aplikacji jest baza danych i przeżucamy na serwer.
Wady Sphinxa
Jedyną znaną mi wadą Sphinxa jest to, że wcześniej stworzony indeks (po którym odbywa się wyszukiwanie) nie jest automatycznie aktualizowany o zmiany wykonane na bazie danych. Dotyczy to zarówno nowych wierszy w zaindeksowanej tabeli jak i modyfikacji zaindeksowanych już danych.
Nowe/zmienione dane pojawią się w indeksie dopiero po jego zaktualizowaniu poprzez polecenie:
indexer nazwa_indeksu --rotate
Pomimo dużej szybkości indexera, operację tą nie nie można wykonywać po każdej zmianie w bazie danych a jednie cyklicznie co kilka godzin/dni (w zależności od wielkości indeksu).
O ile brak aktualizacji indeksu o zmodyfikowane rekordy nie stanowi większego problemu, to brak nowych rekordów może stanowić dla wielu serwisów poważny problem. Często bywa tak, że użytkownicy wprowadzają jakieś dane do bazy a następnie chcą ich użyć wyszukując je. Rozwiązaniem jest mechanizm Live index updates.
W skrócie działa to następująco:
- Na indeksowanej tabeli tworzymy 2 indexy: główny (main) i dodatkowy (delta).
- Tworzymy tabelę sph_counter, w której będziemy zapisywać max(id) z indeksu głównego.
- Indeks główny będzie wyszukiwał w 99,9% danych indeksowanej tabeli, indeks dodatkowy będzie wyszukiwał w 0.1% danych tabeli.
- Dzięki rozbiciu indeksowania na 2 indeksy (duży główny, mały dodatkowy) możliwe jest dużo częstsze indeksowanie indeksu dodatkowego gdyż będzie zawierał on niewiele danych, zatem reindeksacja nie będzie obciążać serwera i bazy danych.
- Modyfikujemy sphinx.conf wg. wytycznych z linka.
- Ustawiamy w cronie reindeksowanie głównego indeksu „raz na dzień” oraz dodatkowego indeksu np. „co 3 minuty”.
- Zatem, co 3 minuty będziemy uzupełniać indeks dodatkowy, natomiast raz dziennie będzie uzupełniany indeks główny.
- Każdorazowo przy aktualizacji indeksu głównego do tabeli sph_counter zostanie zapisany wartość klucza głównego (sql_query_pre), przez co indeks pomocniczy będzie startował od zera.
Zasada działania aplikacji opartej na Sphinx’ie
- Skonfigurowanie konfiga „sphinx.conf” i zbudowanie indeksów.
- W aplikacji, poprzez api następuje wywołanie Sphinxa z parametrami (szukana fraza, limit, offset, order etc…).
- Sphinx zwraca wyszukane rekordy w postaci tablicy kluczy głównych (+ zdefiniowane atrybuty).
- Na podstawie ID’ków kluczy głównych wyciągamy dane z bazy (lub z cache’a) i prezentujemy w serwisie.
Szybki tutorial
- Tworzymy i konfigurujemy plik konfiguracyjny sphinx.conf.
- Bujemy indeks(y)
indexer --all
- Odpalamy demona:
/usr/local/bin/searchd -c /usr/local/etc/sphinx.conf
- Testujemy wyszukiwanie po indeksie:
search [INDEX_NAME] SZUKANA_FRAZA
- Podpinamy API
- Testujemy wyszukiwanie poprzez API
Błąd „connection to 127.0.0.1:9312 failed (errno=111 ….”
W przypadku gdy najpierw został uruchomiony deamon Sphinxa a dopiero później stworzony indeks to aby API działało poprawnie należy zrestartować demona. To samo tyczy się przypadku gdy w indeksie sphinx.conf zostały zmienione zwracane atrybuty.
/usr/local/bin/searchd --stop /usr/local/bin/searchd -c /usr/local/etc/sphinx.conf
Błąd „błąd „searchd error: offset out of bounds””
W przypadku gdy chcemy zwiększyć domyślną liczbę zwracanych (przetwarzanych) rekordów z 1000 na więcej należy:
- zmienić max_matches w sekcji searchd w konfigu sphinx.conf,
- zrestartować demona searchd,
- ustawić 3 parametr w metodzie SetLimits().
Z Sphinx’a korzystają między innym: craigslist.org, filestube.com, netlog.com, thepiratebay.org, wikimapia.org i wiele więcej.
Niedługo, jak czas pozwoli, postaram się jeszcze napisać coś o samym pliku konfiguracyjnym Sphinxa „sphinx.conf”.