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.
Diskuse je zrušena z důvodu spamu.