Hlavní navigace

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

Martin Koníček 17. 1. 2005

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.

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).

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ů).

Našli jste v článku chybu?

29. 1. 2005 21:22

mrk (neregistrovaný)

v clanku pise, ze zvolil innodb :)

22. 1. 2005 0:38

Ondrej Jombik (neregistrovaný)

Prepacte, ale na tom kode nie je nic hrozneho. Nasli by sa aj ovela horsie veci, mozno dokonca aj v samotnom PHP.

Vas kod je samozrejme efektivnejsi a aj podla mna zrozumitelnejsi, to vsak neznamena, ze:

a. vsetci zdielaju tento nazor
b. nutne musi byt subor pre-patchovany

PHP je otvorena komunita, jedna z najtvorenejsich na internete. Tak ako sa aj v "slusnej" spolocnosti najdu zlodeji a vrahovia, najdu sa aj v PHP komunite menej poriadni koderi. Na tom nic nie je :-)








DigiZone.cz: ČRo rozšiřuje DAB do Berouna

ČRo rozšiřuje DAB do Berouna

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Lupa.cz: Google měl výpadek, nejel Gmail ani YouTube

Google měl výpadek, nejel Gmail ani YouTube

Lupa.cz: Teletext je „internetem hipsterů“

Teletext je „internetem hipsterů“

Vitalia.cz: Paštiky plné masa ho zatím neuživí

Paštiky plné masa ho zatím neuživí

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

DigiZone.cz: ČRa DVB-T2 ověřeno: Hisense a Sencor

ČRa DVB-T2 ověřeno: Hisense a Sencor

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

Lupa.cz: UX přestává pro firmy být magie

UX přestává pro firmy být magie

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

Podnikatel.cz: Na poslední chvíli šokuje vyjímkami v EET

Na poslední chvíli šokuje vyjímkami v EET

Podnikatel.cz: Víme první výsledky doby odezvy #EET

Víme první výsledky doby odezvy #EET

Vitalia.cz: „Připluly“ z Německa a možná obsahují jed

„Připluly“ z Německa a možná obsahují jed