Přejít k navigační liště

Zdroják » Databáze » Úvod do Sphinx Search

Úvod do Sphinx Search

Články Databáze

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.

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

Subscribe
Upozornit na
guest
12 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
View all comments
Lukáš Vlček

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

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).

Lukáš Vlček

Pardon, jen upřesním, že pro slovo „Karel“ mi Hunspell vrací „karta“ a „kareta“.

Lukáš Vlček

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).

Lukáš Vlček

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/

Petr

Sphinx tuším využívá i Seznam:)

krivanek

Ano, pro některé současné i nové projekty Sphinx používáme.

Michal Illich

to mě zajímá – pro které projekty?
a proč nepoužíváte váš vlastní fulltext?

Enum a statická analýza kódu

Mám jednu univerzální radu pro začínající programátorty. V učení sice neexistují rychlé zkratky, ovšem tuhle radu můžete snadno začít používat a zrychlit tak tempo učení. Tou tajemnou ingrediencí je statická analýza kódu. Ukážeme si to na příkladu enum.