MySQL umí vyhledávat fulltextem. Co to je, k čemu to použít a na co dát pozor se dozvíte v dnešním díle seriálu.
9.9.2005 07:00 | Petr Zajíc | přečteno 37003×
Nástroji, které se dají použít pro fulltextové vyhledávání se jednotlivé databázové systémy liší, někdy dosti podstatně. V případě MySQL mám pro Vás dobrou zprávu - tato databáze umí používat fulltext a jde jí to celkem dobře. Fulltextové vyhledávání bude námětem dnešního článku. Protože (zejména při spolupráci MySQL, nějakého skriptovacího jazyka a webu) se Vám tato funkce může velice hodit, rozebereme si ji poměrně podrobně, hned ve dvou dílech. Nejprve však mi dovolte nastínit něco teorie.
Podle definice je fulltext "metoda vyhledávání textu uvnitř dokumentů". Jako klasický příklad se uvádí situace, kdy máte k dispozici sadu textů (možná umístěných v síti internet, na disku a podobně) s různými tématy a jediný cíl - najít text, který se bude zabývat vyhledávaným slovem, slovním spojením nebo frází. Většina definic jedním dechem dodává, že v databázích se k realizaci fulltextového vyhledávání používá speciální typ indexu.
Typickou fulltextovou funkci tedy "nakrmíte" seznamem prohledávaných
textů a hledaným výrazem. Výsledkem je (nejčastěji) číslo, kterému se
říká relevance (český
ekvivalent závažnost nebo váha se v odborných kruzích moc
neujal) a které uvádí pravděpodobnost, že prohledávaný článek obsahuje
to, po
čem jsme pátrali. Velice častým výstupem je potom seřazení výsledků
sestupně podle relevance (tedy nejpravděpodobnější výsledky nejvýše).
Fulltextové vyhledávání plní trochu komplexnější úlohu než funkce
pro práci s textem vyhledávající jeden řetězec v jiném (v MySQL
představované třeba
řetězcovou funkcí INSTR). Fulltext totiž umí při vyhledávání zohlednit
četnost vyhledáváných slov v daném textu, jejich vzájemnou vzdálenost a
podobně. Existují dokonce nástroje pro jemné doladění prohledávání -
třeba příkaz pro "umělé" snížení relevance některého z hledaných slov.
To, co jsme uvedli v definici platí i pro MySQL - s jistými omezeními. Měli byste ale vědět, že v praxi ani sebelepší fulltext není všemocný. Pokud se budete pohybovat v česko-slovenských vodách, měli byste vědět, že v souvislosti s použitím fulltextu v MySQL můžete pěkně narazit na:
Pozn.: V této souvislosti je zajímavé vědět, že existují fulltextové vyhledávače, které skloňování umí. Ne však v MySQL; takové nástroje patří mezi velmi pokročilé a používají se především u internetových vyhledávačů. A ještě doplním, že technologie za většinou vyhledávačů je mnohem komplexnější, než aby obsahovala "pouhý" fulltext.
Při používání fulltextu v MySQL byste měli vědět o dalších
omezeních, které je nutné vzít v úvahu. Patří mezi ně:
Aby těch omezení nebylo málo, platí pro práci s fulltextem v MySQL i další "pravidla hry".
Mějme v MySQL tabulku obsahující sloupce CHAR, VARCHAR nebo TEXT. Klasicky se fulltextové vyhledávání předvádí na fragmentu nějakého webového redakčního systému - je to sice poněkud otřepané, ale typické, takže se toho budu rovněž držet.
create table clanky
(nazev varchar (50), zneni text);
Na této tabulce můžete vytvořit fulltextový index takto:
alter table clanky add
fulltext (zneni);
a/nebo, pokud bychom byli dychtivi vyhledávání rovněž v názvech článků, lze definovat jiný fulltext
alter table clanky add
fulltext (nazev, zneni);
Oba fulltextové indexy mohou existovat na tabulce současně. Dost to zpomalí aktualizaci tabulky, ale umožní to vyhledávat výrazy jak v článku, tak v kombinaci článek + název.
Pozn.: Hořekování nad pomalostí
změny dat v tabulkách však leckdy nemá u fulltextových vyhledávání
valný význam. Často se touto metodou zpracovávají data, která se mění
jen jednou nebo zřídka (jako třeba právě články v databázi redakčního
systému) a právě u nich je ztráta času při vložení záznamů snesitelná.
Tento díl seriálu byl jen teoretický (pro někoho možná až příliš). Nicméně příští díl bude nabit praktickými ukázkami vyhledávání, takže se máte na co těšit. Ukážeme si, jak vyhledávat fulltextově v rozsáhlých datech - ještě prozradím, že to budou opravdu data "ze života", takže doufám, že to bude pro čtenáře přínosné.