Úvod do Sphinx Search

Sphinx Search je fulltextový vyhledávač pro databáze. Je to zajímavá alternativa k javovým řešením, o kterých se, na rozdíl od Sphinxu, mluví mnohem víc. Jelikož s ním mám dobré zkušenosti a používám ho několik let, už od jeho beta verze, rád bych se s vámi podělil o své zkušenosti formou seriálu.

Seriál: Úvod do Sphinx Search (4 díly)

  1. Úvod do Sphinx Search 27.5.2013
  2. Konfigurace Sphinx Search 10.6.2013
  3. Sphinx Search API 24.6.2013
  4. Tipy pro Sphinx Search 8.7.2013

Jak jsem objevil Sphinx Search

Někdy před 8 lety jsem pracoval na vyhledávači zboží SrovnaniCen.cz. První nápad, využít fulltext index z MySQL, z počátku fungoval, ale s přibývajícím počtem dokumentů se začalo neúměrně zpomalovat jak indexování, tak vyhledávání. Když databáze dosáhla 5 milionů záznamů a 2 GB dat, už to bylo neúnosné a museli jsme hledat jinou vyhledávací technologii.

Z těch open-source se tehdy nabízel Lucene nebo Sphinx, mezi kterými jsme se rozhodovali. Vyhrál to Sphinx, a to zejména díky rychlosti, nízkým nárokům na hardware, dobré dokumentaci a rychlé křivce učení. Nasadili jsme ho takřka za víkend. V sobotu jsme si s ním hráli, v neděli integrovali do aplikace a v pondělí jsme běželi na Sphinxu.

Zaindexovat ty 2 GB dat trvalo fulltextu MySQL kolem 6 hodin. Sphinx zvládnul totéž asi za 10 minut. Vyhledávání bylo rychlé a možnosti proti MySQL obrovské. I když ne takové jako dnes, protože tehdejší verze 0.9.5 toho, ve srovnání s aktuální 2.0.8, zase tolik neuměla.

Kdo Sphinx používá

Po letech jsem se znovu setkal Sphinxem ve Wikidi, která ho používá na několika projektech: Wikidi.com (150 GB dat), Tech-specs.com, ale také na Devel.cz.

Největší use case je asi Craig List, který vyřizuje 250 milionů dotazů za den, a Infegy, který Sphinxem analyzuje 22 miliard dokumentů. Přehled dalších projektů najdete v katalogu Powered by Sphinx.

Jaké jsou alternativy

Sphinx Search je open-source. Pokud budu hledat v kategorii open-source, tak je to především Java knihovna Lucene a na ní postavená řešení Solr a Elasticsearch.

Na rozdíl od jmenovaných je Sphinx napsaný v C++. Díky tomu je rychlý a přitom celkem nenáročný na hardware. Ano, nemá takové možnosti jako Elastic, ale s tím bych ho ani nesrovnával. Elastic je daleko komplexnější nástroj. Sphinx je jednoúčelový – umí data zaindexovat a pak v nich hledat. O nic jiného se nesnaží.

Ale dovedu si představit nástroj jako Elasticsearch, ale postavený nad Sphinxem místo nad Lucene. A jak je vidět, nejsem jediný, koho to napadlo.

V jakých datech umí Sphinx hledat

Sphinx, na rozdíl třeba od Elasticu, není úložiště. Je to fulltextový vyhledávací server určený především pro vyhledávání v SQL databázích. Nativně umí indexovat MySQL a PostgreSQL. Přes rozhraní ODBC ale můžete indexovat v podstatě jakoukoliv databázi (Oracle, MS SQL…)

Alternativně můžete jakákoliv data uložit do XML souborů a ty potom zaindexovat. To už ale není zdaleka tak praktické a pohodlné, jako indexovat přímo data v databázi. A ani neznám nikoho, kdo by to tak dělal.

Operační systémy

Dříve mě netrpělivost a hlad po nových fíčurách donutily ke kompilaci ze zdrojáků. V Debianu byla příliš stará verze a Sphinx sám nabízel pouze zdrojáky. Dnes má Sphinx připravené vlastní balíčky s aktuální verzí, pro většinu operačních systémů (Debian, Ubuntu, CentOs, Windows, Mac), takže je kompilování většinou zbytečné.

Základní architektura

Sphinx sestává ze dvou základních programů:

  • searchd – běží na pozadí jako démon a vyřizuje dotazy z vaší aplikace.
  • indexer – nástroj pro práci s indexy. Umí indexovat databáze, ale také indexy spojovat (merge), podporuje rotaci indexů, tj. po dokončení indexace umí za chodu prohodit starý a nový index. Dále umí pár užitečných věcí, z existujících indexů vygenerovat stop slova nebo udělat frekvenční analýzu slov. Pouští se ručně nebo, častěji, cronem v určitých intervalech.

API – aneb komunikace se searchd

Se Sphinxem můžete z aplikace komunikovat třemi způsoby, které lze i kombinovat (jednu instanci searchd lze nakonfigurovat na víc způsobů).

1) SphinxAPI

API je nejpoužívanější a nejuniverzálnější varianta. Sphinx dodává API pro PHP, Perl, Python, Ruby a Javu. Pro další jazyky existují řešení třetích stran. Komunikace se searchd probíhá přes TCP sockety a nebo přes unixové sockety, podle toho, jak si searchd nakonfigurujete.

2) SphinxSE

Sphinx má i variantu, kdy může fungovat jako úložiště do MySQL. Součástí toho úložiště ale není searchd. Ten musí i tak běžet a SphinxSE s ním pouze komunikuje, takže to není úložiště v pravém slova smyslu. Toto zvláštní řešení není, z několika důvodů, příliš využívané. Jednak funguje pouze pro MySQL. Dále si musíte SphinxSE zkompilovat a nastavit jako úložiště do MySQL (do verze 5.1 bylo dokonce nutné překompilovat celé MySQL). Ale jestli se prosadí MariaDB, možný nástupce MySQL, tak tyto nevýhody zmizí, protože tam má být úložiště SphinxSE už přímou součástí.

3) SphinxQL

Sphinx Query Language je jiné zvláštní řešení, kdy démon searchd emuluje MySQL protokol, takže s ním komunikujete jako s MySQL. Dotazy se pokládají v modifikovaném SQL, zvaném SphinxQL. Hlavní výhodou SphinxQL je, že jako jediný podporuje real-time indexy (o těch v příštích dílech). Tedy vyhledávat v real-time indexech lze všemi třemi způsoby, ale aktualizovat je lze jen přes SphinxQL.

Závěr

V dalších dílech se chci zaměřit už na praktičtější věci. Vysvětlit, jak Sphinx rozchodit a nakonfigurovat, jak řešit diakritiku, podporu pro češtinu nebo jiné jazyky, jak řešit aktualizaci dat pomocí delta indexů nebo pomocí real-time indexů nebo jak třeba použít Sphinx jako zdroj dat pro našeptávač.

Budu rád za případné otázky nebo náměty, které mi budou inspirací pro psaní dalších dílů.

Komentáře: 12

Přehled komentářů

Lukáš Vlček Podpora češtiny?
Vojtěch Semecký Re: Podpora češtiny?
Lukáš Vlček Re: Podpora češtiny?
Lukáš Vlček Re: Podpora češtiny?
Lukáš Vlček Re: Podpora češtiny?
Vojtěch Semecký Re: Podpora češtiny?
Lukáš Vlček Re: Podpora češtiny?
Vojtěch Semecký Re: Podpora češtiny?
Petr
krivanek Sphinx
Michal Illich Sphinx - Seznam
Vojtěch Semecký Re: Sphinx - Seznam
Zdroj: https://www.zdrojak.cz/?p=8275