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