Ú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)
- Úvod do Sphinx Search 27. 5. 2013
- Konfigurace Sphinx Search 10. 6. 2013
- Sphinx Search API 24. 6. 2013
- Tipy pro Sphinx Search 8. 7. 2013
Nálepky:
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ů.
Ahoj,
jaká je prosím podpora češtiny pro Sphinx? Předpokládám, že existují komerční podpory češtiny, existují i nějaké s open-source (či ještě lépe free software) licencí?
Dík,
Lukáš
Lukáš Vlček: Sphinx má přímo v sobě stemmer pro češtinu, ale „nic moc“ je slabé slovo. Pak má ale možnost natáhnout slovní tvary z open-source slovníků Ispell nebo MySpell a to celkem funguje.
Ahoj, to by mě právě zajímalo.
Dělal jsem nějaké expeimenty s iSpell slovníkem pro Lucene (pomocí Hunspell), ale příjde mi, že ten slovník je vyroben spíš pro spellchecking a né pro stemming. To znamená, že mi to pro jednotlivé termy navrhuje i zavádějící varianty (např. pro slovo „Karel“ to vygeneruje „krabice“ a podobně). Setkal ses s něčím podobným? Možná je chyba u mě.
A ještě co se týká čsštiny, jak je to třeba se sortováním? Umí Sphinx správně setřídit slova, kde se vyskutyje „ch“? (pokud Sphinx umí sortovat).
Pardon, jen upřesním, že pro slovo „Karel“ mi Hunspell vrací „karta“ a „kareta“.
Ah… tak už jsem na to asi přišel. :-) Chyba byla na mé straně.
Ono totiž mezi „Karel“ a „karel“ je z pohledu Hunspellu rozdíl (a právem).
Aha, ale uživatelé asi nebudou při hledání rozlišovat malé/velké písmeno.
Jinak třeba Pravidla.cz používají pro generování slovních tvarů Ispell a vypadá to, že jim to generuje správně: http://www.pravidla.cz/hledej.php?qr=karel
Ano, uživatelé to nebudou dělat (a je to tak dobře), ale pokud bys třeba chtěl nastavit správně analyzér v Lucene s použitím Hunspell token filtru, tak je třeba na to myslet.
Mimochodem, zajímalo by mě, jakou verzi Ispellu Pravidla.cz používají, jestli je to jiná verze slovníku, než co jde pro češtinu stáhnout z http://src.chromium.org/viewvc/chrome/trunk/deps/third_party/hunspell_dictionaries/
Tak to nevim. Já jsem při experimentech používal tuhle češtinu: https://github.com/tvondra/ispell_czech.git
Sphinx tuším využívá i Seznam:)
Ano, pro některé současné i nové projekty Sphinx používáme.
to mě zajímá – pro které projekty?
a proč nepoužíváte váš vlastní fulltext?
Pokud vím, tak třeba Zbozi.cz. Nevím jestli stále, ale svého času na tom běželo. Dokonce je uvedeno v Powered by Sphinx: http://sphinxsearch.com/info/powered/