Nikdy nevíš, kdy to přijde
Zobrazit menu   MENU

13. Fulltextové vyhledávání

Fulltextové vyhledávání slouží k vyhledávání zadaného textu (řetězce) uvnitř jiných textu. Narozdíl od prostého porování pomocí operátoru = nebo částečné shody při použití LIKE nám fulltextové vyhledávání poskytuje více možností.

Trocha teorie

Abychom mohli fulltextové hledání použít, musíme pro daný sloupec nastavit index FULLTEXT, což je možné pouze na sloupcích typu CHAR, VARCHAR a TEXT. Detailněji o indexech budeme mluvit ještě později. Fulltextové vyhledávání nebere v potaz pouhou shodu hledaného řetezce v textu, ale zohledňuje jeho četnost, vzájemnou vzdálenost a podobně. Dle toho dokáže určit také relevanci, podle které je možné výsledky i řadit.

Tento způsob vyhledávání má několik vlastností, které je třeba při použití brát v potaz:



Fulltextové hledání v praxi

Protože v naší současné databázi se nevyskytuje vhodná tabulka, vytvoříme si jednu novou - tabulku chemických prvků, která nijak nesouvisí s naší knižní databází:

CREATE TABLE `prvky` (
`prvek_id` int(10) NOT NULL AUTO_INCREMENT,
`nazev` varchar(50) COLLATE utf8_czech_ci NOT NULL,
`popis` text COLLATE utf8_czech_ci NOT NULL,
PRIMARY KEY (`prvek_id`)
);

INSERT INTO `prvky` (`prvek_id`, `nazev`, `popis`) VALUES
(1, 'Kyslík', 'Kyslík (chemická značka O, latinsky Oxygenium) je plynný chemický prvek, tvořící druhou hlavní složku zemské atmosféry. Je biogenním prvkem a jeho přítomnost je nezbytná pro existenci většiny živých organismů na této planetě. Autorem jeho českého názvu je Jan Svatopluk Presl.[1] Při dýchání vzduchu o obsahu kyslíku větším než 75 % (za normálního atmosférického tlaku) však dochází k většinou nenávratnému poškození plic. '),
(2, 'Dusík', 'Dusík (chemická značka N, latinsky Nitrogenium) je plynný chemický prvek, tvořící hlavní složku zemské atmosféry. Patří mezi biogenní prvky, které jsou základními stavebními kameny živé hmoty. '),
(3, 'Helium', 'Helium, (chemická značka He, latinsky Helium) je plynný chemický prvek, patřící mezi vzácné plyny a tvořící druhou nejvíce zastoupenou složku vesmírné hmoty. V přírodě se vyskytuje jako izotop 4He (se čtyřmi nukleony) a ve stopovém množství i izotop 3He (se třemi nukleony). '),
(4, 'Argon', 'Argon, (chemická značka Ar, latinsky Argon) je chemický prvek patřící mezi vzácné plyny, které tvoří přibližně 1 % zemské atmosféry. '),
(5, 'Uhlík', 'Uhlík (chemická značka C, latinsky Carboneum) je chemický prvek, tvořící základní stavební kámen všech organických sloučenin a tím i všech živých organismů na této planetě. Sloučeniny uhlíku jsou jedním ze základů světové energetiky, kde především fosilní paliva jako zemní plyn a uhlí slouží jako energetický zdroj pro výrobu elektřiny a vytápění, produkty zpracování ropy jsou nezbytné pro pohon spalovacích motorů a tak silniční a železniční dopravu. Výrobky chemického průmyslu na bázi uhlíku jsou součástí našeho každodenního života, ať jde o plastické hmoty, umělá vlákna, nátěrové hmoty, léčiva a mnoho dalších. V současné době bylo popsáno přibližně 10 milionů organických sloučenin.[1][2] '),
(6, 'Neon', 'Neon (chemická značka Ne, latinsky Neonum) je plynný chemický prvek, patřící mezi vzácné plyny. Patří mezi prvky 2. periody. '),
(7, 'Sodík', 'Sodík (chemická značka Na, latinsky Natrium) je nejběžnějším prvkem z řady alkalických kovů, hojně zastoupený v zemské kůře, mořské vodě i živých organismech. '),
(8, 'Železo', 'Železo (chemická značka Fe, latinsky Ferrum) je nejrozšířenější přechodný kovový prvek a druhý nejrozšířenější kov na Zemi, je také hojně zastoupen i ve vesmíru. Lidstvu je znám již od pravěku. V přírodě se minerály železa vyskytují velmi hojně a železo se z nich (ve formě slitiny s uhlíkem) získává redukcí ve vysoké peci. ');

ALTER TABLE `prvky` ADD FULLTEXT KEY `popis` (`popis`);


Na poslední řádce kódu můžete vidět příkaz k vytvoření FULLTEXT indexu na sloupci popis. Popisy chemických prvků jsou přejaté k Wikipedie.

Vyzkoušíme si hned vyhledávání. K tomu nám poslouží nová funkce MATCH(), hledat budeme výraz plyny:
SELECT nazev
FROM prvky
WHERE MATCH (popis) AGAINST ('plyny');

+--------+
| nazev  |
+--------+
| Argon  |
| Neon   |
| Helium |
+--------+


Výsledky jsou automaticky seřazené dle relevance. Pokud bychom ji chtěli explicitně vypsat, můžeme takto:
SELECT prvky.nazev, MATCH(popis) AGAINST ('plyny')
FROM prvky
WHERE MATCH (popis) AGAINST ('plyny');

+--------+--------------------------------+
| nazev  | MATCH(popis) AGAINST ('plyny') |
+--------+--------------------------------+
| Argon  |             0.4164290428161621 |
| Neon   |             0.4164290428161621 |
| Helium |             0.3574410676956177 |
+--------+--------------------------------+


Můžete si libovolně vyzkoušet další hledané výrazy. Pokud vyzkoušíte například slovo "prvek", nedostanete překvapivě žádné výsledky. Je to ale zcela v pořádku, stačí se podívat na vlasnosti fulltextového vyhledávání v teoretické části.


Další díly tutoriálu

11. Agregační funkce
12. Poddotazy
13. Fulltextové vyhledávání
14. Regulární výrazy
15. Operace nad vybranými daty