Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

PHP pro experty: Vyhledávání (2) - praktická realizace

V minulém dílu jste se dozvěděli o teorii chytrého vyhledávání, na kterou dnes navážeme praktickou realizací. Součástí ukázky bude konkrétní případ a jednoduchá knihovna, kterou můžete začlenit do vašeho projektu pod licencí LGPL.

Tweetni to Twitter Jaggni to! Jagg Del.icio.us Delicious

Výběr typu databáze

Tento krok je zásadní pro celou realizaci vyhledávání. I když předpokládám, že většina z vás používá databázi MySQL, můžete díky abstraktní knihovně EzSQL využívat i databáze PostgreSQL, Oracle či SQLite, výběr je tedy opravdu jen na vás.

Nicméně i při použití databáze MySQL stojíte před rozhodnutím, kterou verzi zvolit. Databáze MySQL verze tři se od verze čtyři liší zásadním způsobem – podporou transakcí. Protože počítám s tím, že tuto knihovnu můžete provozovat i na starších verzích databáze, máte možnost změnit proměnnou $trans (podpora transakcí) z hodnoty true (pro MySQL4 a vyšší) na hodnotu false (pro MySQL3).

Poznámka: Rozhodnutí, na jakém typu budete databázi provozovat, je vhodné provést ještě před tvorbou tabulek, kde je u MySQL4 lepší využít typ InnoDB, který na rozdíl od běžného MyISAM podporuje transakce.

Ještě než uzavřu kapitolu o výběru databáze, mohou někteří z vás mít pochopitelnou otázku, k čemu je užitečná podpora transakcí. Zprvu tato podpora byla určena zejména pro zajištění integrity, například bankovních informací, kdy je třeba, aby v případě pádu databáze nebyla provedena jen část operací. V našem případě ovšem využíváme transakce z jiného důvodu – rychlosti. Pokud totiž vkládáte do databáze mnoho záznamů v jedné transakci, může se mnohem lépe využít cache, a zvýšit tak celkový výkon databáze. Využití transakcí má tedy vliv pouze na vkládání dat do databáze, nikoliv již na samotné vyhledávání.

Instalace knihovny – tvorba tabulek

Z mých zkušeností mi bylo zřejmé, že pokud nevytvořím knihovnu, jež se po samotném spuštění sama nainstaluje a vyhledá slovo, jen málokdo pochopí princip implementace. Proto pro instalaci tabulek stačí pouze správně ve skriptu search.class.php nastavit přístupové údaje k databázi, skript spustit a těšit se z rychlé instalace, která vytvoří tyto tabulky.

Ovšem pozor, po prvním spuštění je na oplátku třeba zakomentovat příkaz k instalaci. Ten naleznete v souboru search.class.php za řádkem // === COMMENT AFTER INSTALL (zní to logicky, že :)).

Původní příkaz pro instalaci vypadá takto

//*
$search->install();
$search->clanky_install();
$search->index_all();
// */

A po zakomentování to vypadá takto

/*
$search->install();
$search->clanky_install();
$search->index_all();
// */

Možná někteří z vás právě bloumají nad tím, proč tu uvádím tak jednoduchou věc jako zakomentování bloku kódu. Důvod je prostý, ne každý programátor zná tento způsob komentování. Tento způsob komentování bloků má tu výhodu, že blok textu komentujete pouze na jednom a nikoli na dvou místech.

Úprava pro vaše konkrétní účely

Přestože je prvotní příkladová tabulka jednoduchého redakčního systému předdefinovaná, již předem jsem myslel na to, že budete vyhledávání chtít konkretizovat pro svou konkrétní aplikaci. To ostatně není vůbec složité, protože knihovna je rozdělena na dvě třídy, přičemž první třída je univerzální a druhá třída teprve personifikuje vyhledávání na konkrétní využití. Díky tomu je možné provádět změny knihovny u několika produktů najednou relativně snadno.

class search {
  // univerzální
  ...
}

class article_search extends search {
  // personalizovana
  ...
  var $table = 'articles';
  // zde nastavite tabulku, kde se bude vyhledavat
  ...
  function index(...){
    $this->add_results('nadpis',5,$id);
    // zde nastavite sloupec a jeho skore
    // napriklad sloupec "nadpis" a skore "5"
    ...
  }
  ...
  function article_query(...){
    ...
    SELECT ...
    LEFT JOIN `articles` ON articles.id = search_tmp.goods_id
    // tato cast je velmi dulezita
    // zde pomoci JOINu spojime vysledky vyhledavani
    // s tabulkou, kde vyhledavame
    ...
  }
} 

Problémy s relevancí vyhledávání

Pokud jste pozorně pročetli kód knihovny a zaimplementovali jej do vašeho projektu, jistě jste si museli položit jednu otázku – kolik váhových bodů má být přiřazeno jednotlivým sloupcům?

V tom je právě ten háček, neexistuje obecné pravidlo, podle nějž by se dala výše bodového ohodnocení sloupců zjistit. Lze ji proto buďto náhodně zvolit (což u jednodušších webů nese také dobré výsledky), a nebo zvolit předpokládaný správný výsledek vyhledávání (jak chcete, aby dopadlo vyhledávání určitého slova) a pomocí matice dopočítat, jaké by mělo být bodové ohodnocení. Ovšem pozor, matici lze vždy vyřešit pouze s takovým počtem výsledků, kolik porovnáváte sloupců, aby měla rozměr třeba 3×3 nebo 4×4. Počítání jiných matic nemusí mít řešení, ale hlavně výsledky vyhledávání pravděpodobně znatelně neovlivní.

Co zbývá vyřešit

Podle mého názoru v tomto vyhledávání schází ještě počítání relevance podle data přidání či aktualizace záznamu. Jedním ze způsobů, jak to realizovat, je počítat s tím, že čím vyšší ID záznamu, tím je záznam aktuálnější. Toto je možné provést až v posledním vyhodnocení upravením SQL dotazu, pokud by se vám to podařilo, nebuďte líní a podělte se v diskusním fóru o vaše zkušenosti.

Zkušenosti s praktickým nasazení

Zatím jsem tento algoritmus zkoušel reálně nasadit do několika mých komerčních projektů, jako třeba redakčního systému, realitního systému a e-shopu, a vždy se mi jej podařilo za pár minut zprovoznit. Nevýhody, jako pomalejší indexování položek, se ukázaly v reálném provozu jako zcela bezvýznamné. Naopak výhody byly zřetelné, krom vyšší rychlosti a přesnosti vyhledávání lze nyní vyhledávat slova s libovolným počtem znaků, což u normálního fulltextového vyhledávání není standardně možné – v databázi je minimální počet hledaných znaků standardně definován na čtyři a lze jej změnit pouze změnou nastavení MySQL (to je na komerčním hostingu takřka vyloučeno).

davame_internetu_obsah
       

Tato knihovna navíc navazuje na můj další projekt, který umožňuje lepší optimalizaci pro vyhledávače. Pokud například zadáte www.php.net/echo, dostanete stránku s odpovídajícím manuálem. Toto je ovšem možné provést pouze pokud máte dostatečně kvalitní vyhledávání, a také knihovnu pro ošetření přesměrování nenalezených stránek (404), která velmi hluboko dřímá v mém šuplíku knihoven a jež možná vyplave na povrch v některém z dalších dílů tohoto seriálu.

Poděkování / Odkazy

Tímto děkuji Martinu Petříčkovi, který zkontroloval článek po technické stránce a vyzkoušel instalaci knihovny (jež se mu podle mého návodu naštěstí zdařila bez jakýchkoliv problémů).

Školení: Návrh a používání MySQL databáze

 

Naučte se používat jednu z nejrozšířenějších databází. Dozvíte se vše potřebné od návrhu až po samotné využití MySQL v projektech.

Školení pro všechny, kteří se chtějí naučit efektivně pracovat s MySQL nebo se v práci s touto databází zlepšit.

Přihláška a podrobné informace

Ohodnoťte jako ve škole:
Průměrná známka 2,59

Přehled názorů

pre "expertov"
pavel 17. 1. 2005 00:38
Nový
└ 
Re: pre "expertov"
Michal Novotný 17. 1. 2005 10:02
Nový
 
└ 
Re: pre "expertov"
nishkam 17. 1. 2005 12:14
Nový
 
 
├ 
Re: pre "expertov"
markon 17. 1. 2005 12:55
Nový
 
 
│
└ 
Re: pre "expertov"
jkt 18. 1. 2005 22:15
Nový
 
 
│
 
└ 
Re: pre "expertov"
Ondrej Jombik 22. 1. 2005 00:38
Nový
 
 
└ 
Re: pre "expertov"
Ondrej Jombik 17. 1. 2005 17:11
Nový
 
 
 
└ 
Re: pre "expertov"
markon 17. 1. 2005 21:34
Nový
 
 
 
 
└ 
Re: pre "expertov"
Ondrej Jombik 18. 1. 2005 15:32
Nový
Díky
Vladimír Stwora 17. 1. 2005 02:19
Nový
└ 
Re: Díky
Radek 17. 1. 2005 09:12
Nový
 
├ 
Re: Díky
karci 17. 1. 2005 09:39
Nový
 
└ 
Re: Díky
markon 17. 1. 2005 12:56
Nový
 
 
└ 
Re: Díky
Yeti 17. 1. 2005 13:49
Nový
 
 
 
└ 
Re: Díky
muthafucka 17. 1. 2005 16:11
Nový
Článok, indexovanie textu, MySQL...
Satano 17. 1. 2005 10:02
Nový
└ 
Re: Článok, indexovanie textu, MySQL...
Satano 17. 1. 2005 10:09
Nový
Komerční produkty? Leda ve snu
lzap 17. 1. 2005 12:40
Nový
├ 
Re: Komerční produkty? Leda ve snu
markon 17. 1. 2005 12:59
Nový
│
└ 
Re: Komerční produkty? Leda ve snu
muthafucka 17. 1. 2005 16:14
Nový
│
 
└ 
Re: Komerční produkty? Leda ve snu
markon 17. 1. 2005 21:42
Nový
│
 
 
└ 
Re: Komerční produkty? Leda ve snu
muthafucka 18. 1. 2005 00:48
Nový
│
 
 
 
└ 
Re: Komerční produkty? Leda ve snu
markon 18. 1. 2005 13:22
Nový
│
 
 
 
 
└ 
Re: Komerční produkty? Leda ve snu
muthafucka 18. 1. 2005 14:47
Nový
│
 
 
 
 
 
└ 
Re: Komerční produkty? Leda ve snu
Michal Novotný 18. 1. 2005 16:08
Nový
│
 
 
 
 
 
 
└ 
Re: Komerční produkty? Leda ve snu
markon 19. 1. 2005 07:48
Nový
└ 
Re: Komerční produkty? Leda ve snu
lammer 18. 1. 2005 10:53
Nový
 
└ 
Re: Komerční produkty? Leda ve snu
Ondrej Jombik 18. 1. 2005 15:58
Nový
 
 
└ 
composition vs inheritance
BoneFlute 20. 1. 2005 09:35
Nový
 
 
 
└ 
Re: composition vs inheritance
Ondrej Jombik 21. 1. 2005 23:55
Nový
transakce???
jkt 17. 1. 2005 18:44
Nový
├ 
Re: transakce???
jkt 17. 1. 2005 18:45
Nový
│
├ 
Re: transakce???
Solvina 17. 1. 2005 21:38
Nový
│
└ 
Re: transakce???
markon 17. 1. 2005 21:43
Nový
│
 
└ 
Re: transakce???
jkt 18. 1. 2005 08:27
Nový
│
 
 
└ 
Re: transakce???
markon 18. 1. 2005 13:10
Nový
│
 
 
 
└ 
Re: transakce???
jkt 18. 1. 2005 22:21
Nový
│
 
 
 
 
└ 
Re: transakce???
markon 19. 1. 2005 08:11
Nový
│
 
 
 
 
 
└ 
Re: transakce???
jkt 19. 1. 2005 15:51
Nový
│
 
 
 
 
 
 
└ 
Re: transakce???
mrk 29. 1. 2005 21:22
Nový
└ 
Re: transakce???
Dalibor Šrámek 17. 1. 2005 22:54
Nový
 
└ 
Re: transakce???
jkt 18. 1. 2005 08:53
Nový
 
 
└ 
Re: transakce???
markon 18. 1. 2005 13:15
Nový
Pro expery?
sinuhet 18. 1. 2005 18:24
Nový
└ 
Re: Pro expery?
markon 19. 1. 2005 08:04
Nový
 
├ 
Re: Pro expery?
jkt 19. 1. 2005 15:51
Nový
 
└ 
Re: Pro expery?
sinuhet 19. 1. 2005 22:14
Nový
 
 
└ 
Re: Pro expery?
Ondrej Jombik 22. 1. 2005 00:24
Nový
Viac informacii
Robert 21. 1. 2005 21:11
Nový
       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem