Nastavení fulltextového vyhledávání MySQL

Školení, která pořádám

O fulltextovém vyhledávání v MySQL jsem už psal, dokonce i o jeho základním nastavení. Pro možnost hledat krátká slova je vhodné nastavit ft_min_word_len (minimální délka indexovaného slova) nejvíc na trojku.

Pro hledání v českých textech je vhodné nastavit také ft_stopword_file (neindexovaná slova). Výchozí seznam totiž obsahuje i slova, která v češtině mají význam (např. let nebo most) a naopak neobsahuje česká bezvýznamová slova, která se indexují zbytečně a tím zdržují. Z předložek a spojek jsem sestavil seznam pro češtinu, odstranil jsem slova, která význam mít mohou (např. bez nebo místo), a nabízím ho ke stažení (soubor musí být v kódování character_set_server). Někomu by se mohl hodit také zabudovaný seznam anglických slov – pro prohledávání českých i anglických textů lze tyto seznamy spojit a naopak z nich odstranit slova, která v druhém jazyce mají význam.

Při vyhledávání mi vadí, že se najdou všechny texty obsahující libovolné slovo oddělené mezerou. Vyhledávače se přitom obvykle chovají tak, že hledají jen texty se všemi slovy. Kupodivu i toto se dá změnit pomocí strašidelného nastavení ft_boolean_syntax. Když se nastaví na ' |-><()~*:""&^' (začíná mezerou), tak se budou hledat texty se všemi slovy oddělenými mezerou a pouze slova s operátorem | budou volitelná. Volba se dokonce dá nastavit i při běhu pomocí příkazu SET GLOBAL, k tomu je ale potřeba oprávnění SUPER.

Pro praktické využití chybí jen schopnost skloňování. To se dá částečně řešit přes pravostranné rozšíření (operátor hvězdička), to ale samozřejmě není dokonalé. Rychlejší vyhledávání s podporou českého skloňování nabízí Sphinx Search, s jeho zprovozněním je ale o něco víc práce.

Přijďte si o tomto tématu popovídat na školení Návrh a používání MySQL databáze.

Jakub Vrána, Řešení problému, 24.2.2010, diskuse: 4 (nové: 0)

Diskuse

Washo:

Aha. Tak proto mi to v katalogu architektury nenachazi mariansky most v ul! Diky! :)

pojízdná kočka:

ad "s podporou českého skloňování") to jsem v odkazovaném článku poněkud nenašla (asi jsem se špatně dívala).

ikona Jakub Vrána OpenID:

V době psaní článku to ještě neuměl, umí to až verze 0.9.9 a dokumentace to navíc tají.

ikona Joelp:

Já musel nastavit ft_min_word_len na 2. Někteří mají bohužel v příjmení jen 2 písměna a ty to nenašlo.
Ale to ft_boolean_syntax vypadá dobře.

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.