Fulltextové vyhledávání
Úvod
Fulltextové vyhledávání je velmi užitečné pro větší weby. Umožňuje poměrně jednoduchým způsobem realizovat vyhledávání na webu bez použití externích služeb. MySQL má fulltextové vyhledávání poměrně dobře propracované, takže ho lze většinou použít bez úprav.
Fulltext lze použít pouze pokud splníme následující podmínky:
- Tabulka v MySQL musí být typu MyISAM [1]
- Prohledávat lze pouze sloupce, které mají datový typ CHAR, VARCHAR, [2] TEXT [3]
Sloupcům, které chceme prohledávat musíme nastavit fulltextový index. To lze udělat buď při vytváření tabulky nebo dodatečně. Např.:
CREATE TABLE `fulltext` (
`ID` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT ,
`Nazev` VARCHAR( 150 ) NOT NULL ,
`Clanek` TEXT NOT NULL ,
PRIMARY KEY ( `ID` ) ,
FULLTEXT (`Clanek`)
) TYPE = MYISAM CHARACTER SET utf8 COLLATE utf8_czech_ci
Případně můžeme tento klíč vytvořit později pomocí příkazu ALTER TABLE:
ALTER TABLE `fulltext` ADD FULLTEXT (`Clanek`)
Klíč lze samozřejmě vytvořit na více sloupcích. Potom budou prohledávány všechny najednou.
Nyní máme tedy hotovou tabulku a vytvořený fulltextový klíč. Aby mělo vyhledávání smysl, je nutné mít v tabulce dostatečný počet záznamů. Já mám na svém počítači uloženy v databázi zajímavé články a vyhledávání je realizovány PHP skripty, které budou uvedeny níže. SQL příkaz pro fulltextové vyhledávání může vypadat následovně.
select * from `fulltext`
where match (`clanek`) against ('hledaný text')
Výsledky jsou seřazeny podle relevance.
Při vyhledávání je třeba mít v paměti několik skutečností:
- Hledání nefunguje s řetězci, které mají míň než čtyři znaky. Tuto hodnotu lze změnit v konfiguračním souboru (direktiva ft_min_word_len), podobně lze nastavit i maximalní délku vyhledávaného řetězce (ft_max_word_len). [4]
- Databáze má slovník tzv. stop slov (stop word), která se nevyhledávají. [5]
- Pokud se některé slovo vyskytuje ve více jak polovině prohledávaných zánamů, tak ho databáze ignoruje.
PHP skript
Předpokládejme, že máme na webu tento formulář (celý soubor).
<form name="search" action="search.php" method="post">
<label for="word">Hledané slovo:</label>
<input type="text" name="word" id="word" size="30">
<input type="submit" name="submit" value="Vyhledat">
</form>
Potom vyhledávácí skript search.php může vypadat třeba takto (celý soubor):
<?php
$connect = MySQL_Connect('localhost','test','test');
MySQL_Select_DB('test', $connect);
$text = AddSlashes($_POST['word']); // V PRAXI JE VHODNE UDELAT LEPSI KONTROLU
/* SQL DOTAZ
VRATI NAM NAZEV CLANKU A JEHO ID */
$sql = "SELECT `ID`, `Nazev`
FROM `fulltext`
WHERE MATCH(`clanek`) AGAINST ('".$Text."')";
$res = MySQL_Query($sql, $connect);
?>