PHP

Kurz PHP (22.)

Úvodem  |  Kurz PHP |  Odkazy  |  Aplikace  |  Otázky a odpovědi

 

Full-textové vyhledávání v MySQL

Od verze 3.23.23 podporuje databázový systém MySQL full-textové indexování a vyhledávání. Vyhledávání se nám bude hodit například v případě, že vytváříme publikační systémy a jiné skripty, které pracují s daty v MySQL tabulkách. Vyhledávat můžeme pouze ve sloupcích typu VARCHAR, CHAR a TEXT. Vytvořit indexovanou položku (pole, ve kterém budeme vyhledávat) můžeme přímo při zakládání tabulky nebo pomocí ALTER TABLE (CREATE INDEX).

Jako příklad si ukážeme tabulku, která bude mít jako full-textové vyhledávání nastaveno název článku, anotaci článku a text článku.

CREATE TABLE tisk (
  id int(11) NOT NULL auto_increment,
  nazev varchar(100) NOT NULL default '',
  anotace text NOT NULL,
  text text NOT NULL,
  cas datetime NOT NULL default '0000-00-00 00:00:00',
  ctenaru int(11) NOT NULL default '0',
  kategorie varchar(50) NOT NULL default '',
  PRIMARY KEY  (id),
  UNIQUE KEY id (id),
  FULLTEXT (nazev,anotace,text)
) TYPE=MyISAM;

Nyní do této ukázkové tabulky vložíme nějaká data.


INSERT INTO tisk VALUES (1, 'Článek 1', 'Vítejte u článku číslo 1 !', 
'V dnešním příkladě si vysvětlíme práci s full-textovým vyhledáváním v MySQL.', 
'2001-12-12 00:00:00', 29, 'Obecné');

INSERT INTO tisk VALUES (2, 'Článek 2', 'Vítejte u článku číslo 2 !', 
'V dnešním příkladě si vysvětlíme práci s databázovým systémem MySQL.', 
'2001-12-11 00:00:00', 29, 'Obecné');

INSERT INTO tisk VALUES (3, 'Článek 1', 'Vítejte u článku číslo 1 !', 
'V dnešním příkladě si vysvětlíme práci s vyhledáváním v MySQL.', 
'2001-12-12 00:00:00', 29, 'Obecné');

INSERT INTO tisk VALUES (4, 'Článek 2', 'Vítejte u článku číslo 2 !', 
'V dnešním příkladě si vysvětlíme práci s databázovým systémem MySQL.', 
'2001-12-11 00:00:00', 29, 'Obecné');

Nyní, když máme vytvořenu strukturu tabulky a vložena ukázková data, můžeme klást vyhledávací dotazy. Jako ukázku si uvedeme příklad, kdy budeme chtít vyhledat v naší tabulce slovo "full-textovým".

SELECT * FROM tisk WHERE MATCH (nazev,anotace,text) AGAINST ('full-textovým');

+----+----------+--------------+-------------+--------------+---------+-----------+
| id | nazev    | anotace      | text        | cas          | ctenaru | kategorie |
+----+----------+--------------+-------------+--------------+---------+-----------+
|  1 | Článek 1 | Vítejte u č..| V dnešním ..| 2001-12-12 ..|    29   | Obecné    |
+----+----------+--------------+-------------+--------------+---------+-----------+

Vysvětlení činnosti:

Příkazem "SELECT * FROM tisk" vybereme všechny záznamy z tabulky tisk. Ve funkci MATCH je uveden seznam indexovaných sloupců, ve kterých bude probíhat hledání a ve funkci AGAINST jsou uvedeny hledaná slova (může jich být více, odděleny mezerou). Vyhledávaná slova musí mít minimálně tři znaky, menší slova jsou ignorovány!

Možná vás bude zajímat, co se stane, když dáme vyhledat slovo "článku":

SELECT * FROM tisk WHERE MATCH (nazev,anotace,text) AGAINST ('článku');

Jako výsledek MySQL nezobrazí nic, protože slovo "článku" se vyskytuje v mnoha sloupcích anotace. Má tedy malou váhu na výsledek vyhledávání. Větší váhu mají slova, která nemají duplicitní hodnoty v jednotlivých záznamech. Vše si můžeme ukázat na příkladě. Položíme následující dotaz, který nám ukáže, jakou váhu má dané slovo na vyhledávání

SELECT id, MATCH nazev,anotace,text AGAINST ('full-textovým') as stat FROM tisk;

+----+-----------------+
| id | stat            |
+----+-----------------+
|  1 | 2.0121104298397 |
|  2 |               0 |
|  3 |               0 |
|  4 |               0 |
+----+-----------------+

Od verze 4.0.1 databázového serveru MySQL můžeme také "upřesnit" vyhledávání tzv. BOOLEAN mód.

SELECT * FROM tisk WHERE MATCH (nazev,anotace,text) AGAINST ( '+dalším' IN BOOLEAN MODE );

Při používání tohoto módu máme na výběr z následujících operátorů:

  • + - znamená, že zvolené slovo musí být "vráceno" v každém řádku.
  • - - znamená, že zvolené slovo nesmí být "vráceno" v žádném řádku.
  • < > - tyto dva operátory se používají k zvětšení hodnoty nalezeného záznamu.
  • ( ) - závorky se používají obvykle ke seskupování výrazů.
  • * - používá se k zvětšení hodnoty nalezených slov (více viz. příklady níže).

webmaster guru - najde řádek, který obsahuje alespoň jedno slovo.

+webmaster +guru - najde řádek, který obsahuje obě slova.

+webmaster guru - najde řádek, který obsahuje obě slova, ale slovo webmaster má větší prioritu.

+webmaster -guru - najde řádek, který obsahuje slovo webmaster, ale ne slovo guru.

+webmaster +(>guru <internet) - najde řádek, který obsahuje slova webmaster a guru nebo webmaster a internet, ale slova webmaster a guru mají větší hodnotu.

webmaster* - najde řádek, který obsahuje slova webmaster, webmasterová apd.


Pro tento díl to bude vše. V příštím díle budeme dále pokračovat v poznávání jazyka PHP.

 

Petr Rympler