Fulltextové vyhledávání

Zdroj: SOOM.cz [ISSN 1804-7270]
Autor: nejmenuje
Datum: 22.12.2006
Hodnocení/Hlasovalo: 0/0

V tomto článku se dozvíte, jak fulltextově vyhledávat data uložená v MySQL a jak řešit problémy vyhledávání (diakritika, velká malá písmena).

V tomto článku se dozvíte, jak fulltextově vyhledávat data uložená v MySQL a jak řešit problémy vyhledávání (diakritika, velká malá písmena).

Vyhledávání pomocí MySQL dotazů

Data lze vyhledávat pomocí samotného MySQL, musíme mít však sloupce, v kterých chceme vyhledávat převedeny na FULLTEXT INDEX.

Takhle vytvoříme tabulku se sloupecem FULLTEXT (tuto tabulku budu používat v následujících příkladech):

CREATE TABLE articles (
id MEDIUMINT UNSIGNED NOT NULL auto_increment,
name VARCHAR(15) NOT NULL,
shortdescr TINYTEXT NOT NULL,
text MEDIUMTEXT NOT NULL,
fulltext(name),
fulltext(shortdescr),
fulltext(text),
primary key(id)
);

Pokud máme už vytvořenou tabulku můžeme přebudovat některé sloupce na FULLTEXT. Takhle například přebudujeme sloupec `text` :

ALTER TABLE articles ADD FULLTEXT (text)

Nyní máme vytvořenou tabulku s fulltexty, tak se pustíme do samotné problematiky vyhledávání. K tomu se v MySQL používají kombinace funkcí MATCH() AGAINST(). Takhle například vybereme řádek z tabulky `articles`, v kterém se v sloupci `text` nalezne výraz "automobil" :

SELECT * FROM articles WHERE MATCH(text) AGAINST('automobil')

To je sice hezké, mohl bych se tu zabývat dalšími možnostmi booleanovského vyhledávání, ale hlavní problém se kterým musíme počítat je, že tento způsob bere ohled na diakritiku a velká/malá písmena, takže když chceme hledat "automobil" , tak nám to nenajde "Automobil" a když chceme hledat "pocitac", tak nám to nenajde "počítač". Proto je výhodnější používat vyhledávání pomocí kombinací funkcí pro práci s řetězci v PHP

Vyhledávání pomocí PHP

Pomocí PHP scriptu lze efektivně vyhledávat, jsme omezeni jen možnostmi jazyka. Pro následující příklad vyhledávání jsem použil tyto funkce:

string strtr( string str, string from, string to ) //nahrazuje znaky, bude se nám hodit pro odstranění diakritiky
string strtolower(string input) //převede znaky na malá písmena
int substr_count( string haystrack, string needle ) //vypíše kolikrát se needle (jehla) vyskytla v haystack (kupka sena)

A teď k samotnému scriptu, prochází v tabulce sloupce name, shortdescr a text a hledá v nich řetězec v proměnné $_GET['srch_text'], pak vypisuje výsledky hledání uživateli:

<?php
function strip_diacritic($input)
{
 return(strtolower(strtr($input, "ÁÄČÇĎÉĚËÍŇÓÖŘŠŤÚŮÜÝŽáäčçďéěëíňóöřšťúůüýž", "AACCDEEEINOORSTUUUYZaaccdeeeinoorstuuuyz")));
}
function search_function()
{
 global $srch_text;
 global $srch_view;
 $srch_partall = explode(" ", $srch_text);
 foreach ($srch_partall as $srch_part)
 {
  if (strlen($srch_part) >= 3)
  {
   if ((substr_count(strip_diacritic($srch_view['name']),$srch_part) + substr_count(strip_tags(strip_diacritic($srch_view['shortdescr'])),$srch_part) + substr_count(strip_tags(strip_diacritic($srch_view['text'])),$srch_part)) > 0)
   {$srch_count++;}
  }
 }
 if (!$srch_count)
 {return(false);}
 else
 {return(true);}
}
@mysql_connect("sv","usr","pswd");
@mysql_select_db("dbName");
$srch_text = htmlspecialchars(strip_diacritic($_GET['srch_text']));
$srch_select = mysql_query("SELECT * FROM articles ORDER BY id DESC");
if (mysql_num_rows($srch_select) > 0)
{
 while ($srch_view = mysql_fetch_array($srch_select))
 {
  if (search_function())
  {
   echo("<p>".$srch_view['name']."</p>");
   $srch_countview++;
  }
 }
 if (!$srch_countview)
 {echo("<p>Žádný záznam nenalezen!</p>");}
}
else
{echo("<p>V tabulce nic není, nelze v ní tudíž vyhledávat!</p>");}
?>

Written by neimenuje, neimenuje.ic.cz | triim.net