[PHP] Vyhladavanie na stranke

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod mavin 3. 8. 2005 07:07

mam nasledovny problem. Je stranka, ktora pozostava z cistych HTML dokumentov a na hlavnej stranke by mala byt moznost prehladavania vsetkych dokumentov ktore stranka obsahuje. Tie musia aj nadalej ostat ako HTML dokumenty. Databaza sa neda pouzit. Potrebujem teda urobit pomocu PHP na uvodnej stranke moznost vyhladavania (s moznostami AND a OR). Poradi mi niekto ako sa do toho pustit. Pripadne nejaky tutorial. Dakujem
mavin
Junior
Uživatelský avatar

Odeslat příspěvekod Blko 3. 8. 2005 08:41

To asi nebude take jednoduche:
1.) HTML obsahuje aj nejake formatovacie znaky (tagy). Tych sa budes musiet zbavit, ak chces vyhladavat spolahlivo. Tu by mohla pomoct funkcia strip_tags(). Nakolko to bude asi dost casovo narocne a robit to zakazdym znova, bolo by dobre odstranit HTML tagy pri prvom hladani a potom vysledok (bez tagov) niekam ulozit pre buduce pouzitie.
2.) vyhladat vsetky HTML subory v adresari - readdir()
3.) fread() na nacitanie suboru a uz iba prehladavat ci uz pomocou regularnych vyrazov alebo pomocou nejakych funkcii na pracu so stringami.

Snad ti to nejako pomoze.
Blko
Junior
Uživatelský avatar

Odeslat příspěvekod Lemur 3. 8. 2005 11:39

Postup, ktery popisuje Blko, by sice fungoval, ale rychlost by byla dost mala, ukz kvuli tomu parsovat HTML. Doporucuju HTML predspacovat tak, aby se zpracovalal pouze text, a vytvorit nad nim (externim programem) vyhledavaci index, kde u kazdeho slova je seznam odkazu na stranky, kde se vyskytuje. Sice je vygenerovani takoveho indexu netrivialni, ale nasledne vyhledavani je pomene jednoduche a hlavne velmi rychle. A navic by tam sly pouzit i logicke operatory.
Lemur
VIP uživatel
Uživatelský avatar

Odeslat příspěvekod Blko 3. 8. 2005 12:25

Ved som mu napisal, ze to nie je najlepsie riesenie. Inak, mohol by urobit to, ze pri prvom hladani (alebo to spusti rucne) odstrani zo vsetkych dokumentov HTML tagy a ulozi vysledok do DB.
No a potom prehladavat databazu. To je asi najjednoduchsie riesenie.
Blko
Junior
Uživatelský avatar

Odeslat příspěvekod malcolmX 3. 8. 2005 12:36

[quote="Blko"]Ved som mu napisal, ze to nie je najlepsie riesenie. Inak, mohol by urobit to, ze pri prvom hladani (alebo to spusti rucne) odstrani zo vsetkych dokumentov HTML tagy a ulozi vysledok do DB.
No a potom prehladavat databazu. To je asi najjednoduchsie riesenie.[/quote]

Vzdyt prece psal, ze db nemuze pouzit :-)

Staci skriptem naindexovat veskery textovy obsah stranek a pak 'hledat' v plain/textovem vystupu indexovani. Jakykoli update stranek by pak samozrejme vyzadoval i aktualizaci.
malcolmX
Junior

Odeslat příspěvekod SoulFly 3. 8. 2005 12:59

zmasti to rovno nad *.html, nebabri sa s tym !!
SoulFly
Kolemjdoucí
Uživatelský avatar

Odeslat příspěvekod SoulFly 3. 8. 2005 13:08

toto ber ako priklad, to som narychlo vysekol z kodu :-))

if(eregi(".htm",$text) && file_exists("htm/$text"))
{
$filename = "htm/$text";
if(is_file($filename))
{
$handle = fopen ($filename, "r");
$contents = fread ($handle, filesize ($filename));
fclose ($handle);
}
$hlad_text=strip_tags ($hlad_text);
if($hlad_text!="" && eregi("$hlad_text",$contents))
{
.............. atd
SoulFly
Kolemjdoucí
Uživatelský avatar

Odeslat příspěvekod Blko 3. 8. 2005 15:07

malcolmX píše:Vzdyt prece psal, ze db nemuze pouzit :-)


Pochopil som to tak, ze DB nemoze pouzit preto, lebo subory musia zostat subormi, nemoze ich zrusit a prehodit do tabulky.
Ale ak by ich nacital do DB, tak je to snad OK.
Potom je problem iba udrzat rovnake subory a zaznamy v DB.
Blko
Junior
Uživatelský avatar

Odeslat příspěvekod Lemur 3. 8. 2005 16:03

SoulFly píše:zmasti to rovno nad *.html, nebabri sa s tym !!


Je prava, ze obcas je pouziti "brute force" reseni nejlepsi (jak to rika Ken Thompson), ale prochazet pri kazdem dotazu vsechny soubory je velmi, velmi neoptialni (a coz teprve pouziti regularnich vyrazu na miste, kde staci mnohem rychlejsi strpos()).

A na vyhledavani pomoci indexu neni treba databaze. Jednou jsem delal cast programoveho reseni CD prezentace s vyhledavani a vyhledavaci index byl bezny textovy soubor, kde bylo na zacatu radky hledane slovo a za nim seznam odkazu. Takze pri dotazu staci vzdy jen jednou nacist vyhledavaci index (ktery bude mit mnohem mensi velikst nez vsechny HTML stranky), popripade ho rozdelit podle zacatezniho znaku jako slovniky (teba A-M, N-Z, cisla a ostani znaky).

A protoze je index serazeny, jde pouzit velmi efektivni binarni vyhledavani. Popripade je mozne pouzit hash tabulky nebotreba B/B* stomy. V kazdem pripade bude casova narocnost zhruba logaritmicka, a to nepocitam usporu casu, ktery by tvalo otevirani a zavirani spoust souboru.
Lemur
VIP uživatel
Uživatelský avatar

Odeslat příspěvekod SoulFly 3. 8. 2005 21:12

je strasne vela sposobov ako to spravit, ja som vychadzal z toho ze dotycna osoba ma zrejme dost chabe skusenosti s PHP, a potrebuje co najjednoduchsie riesenie (co niesom si isty ci to tvoje chape :-) ), a po druhe nepredpokladam ze bude chciet prehladavat vela html suborov (cize na rychlost som zanevrel) .

Dost v pohode je aj moznost hodenia html do *.txt a je to dost rychle, ja som tak robil prehladavanie viac ako 100 stran a je to otazka 2-3 sekund, samozrejme ze zalezi na akej linke hehehe.

Samozrejme ze kazde riesenie zavisi od konkretnej situacie, a dalsich okolnostiach. prehladavanie sa da dost perfektne nadupat, ale asi sa tomu nefce venovat niekolko dni. Ale zase cim viac raad tym ma vecsiu moznost vyberu :-))

PeopleHatePearl :-))))) zdar :-B
SoulFly
Kolemjdoucí
Uživatelský avatar

Odeslat příspěvekod SoulFly 3. 8. 2005 21:15

och sorrrac => Perl (nei Pearl)

hambiiiim sa :wink:
SoulFly
Kolemjdoucí
Uživatelský avatar

Odeslat příspěvekod mavin 3. 8. 2005 21:23

dakujem za vase napady... co sa tyka indexovania a vyhladavania tak s tym v php naozaj nemam vela skusenosti. Mohol by mi niekto priblizit ako to vyhladvanie pomocou tych indexov prebieha a ako taky subor vytvorim. Pripadne odkazat na nejaky tutorial na webe. Dakujem
mavin
Junior
Uživatelský avatar

Odeslat příspěvekod Lemur 4. 8. 2005 14:57

Vyhledeavaci index se deal zhruba stejne v jakemkoliv jazyce, i kdyz v PHP a podobnych skripovacich jazycich je to v nekterych ohledech jednodussi (ja osobne jsem delal generator indexu v C, ale hlavne z ducvodu rychlosti, protoze musel zpracovacvad radove megabyty textu).

Generovani indexu:

Jako hlavni datova struktura Index je datova struktura (napr. v PHP asociativni pole), kde je klic hledane slovo a obsahem seznam odkazu.
Kód: Vybrat vše
  Pro kazdy indexovany soubor
    Nacti soubor
    Odstran HTML tagy
    Rozsekej na jednotliva slova
    Pro kazde slovo
      Je slovo v Indexu?
      Ano - Pridej odkaz na soubor do seznamu odkazu v Index[slovo] (nejlepe jako cislo)
      Ne - Vytvor novy prvek Indexu[slovo] a jako hodnota jednocleny seznam s odkazem na soubor

  Setrid index abecedne
  Uloz index jako soubor

Vyhledavani:

Kód: Vybrat vše
  Nacti index jako pole
 
  Najdi a precti hodnotu Index[hlednavy_vyraz]

  Vypis seznam odkazu, popr. pridej k nim jmena stranek (pres prekladaci tabylku cisla-> jmena stranek)

Tot vse.

Pri pouziti logickych operatoru se prvne vytvori seznamy, pri pouzit operatoru AND se kontroluje, je-li prvek ve vsech seznamech, u operatoru OR je-li alespon v jednom z nich.
Lemur
VIP uživatel
Uživatelský avatar

Odeslat příspěvekod mavin 4. 8. 2005 18:42

Dakujem Lemur,
uz tomu asi rozumiem. Nemal som doteraz s tymto ziadnu skusenost. Tak pre istotu este zhrniem ako to asi budem robit (resp. nazorne predvediem ako som to nepochopil :) )

vytvorim si pole, do ktoreho natlacim postupnym "skenovanim" slova vsetkych html dokumentov (1 az 3 znakove slova odignorujem - napadlo ma, ze by sa mozno hodil este nejaky zoznam slov, ktore by sa mali tiez odignorovat, to by som vsak musel pouzit nejaky uz vytvoreny, lebo vytvorit ho rucne by bola otrocina, ak nahodou nejaky taky pre slovencinu niekde volne stiahnutelny existuje, dajte mi prosim vediet).

Prvok pola bude vyzerat asi nejak takto:
$pole["hladane_slovo_1"] = "1|4|7|22|23"
zoradim abecedne a ulozim do suboru.

Pocas vytvarania tohto indexu(pola) vytvorim taktiez index dokumentov:
naprl
$pole["1"] = "adresar/dokument1.html"

Toto cele sa bude opakovat vzdy po aktualizacii webu.
Samotne vyhladavanie mi uz je jasne.
Dakujem
mavin
Junior
Uživatelský avatar

Odeslat příspěvekod mavin 4. 8. 2005 18:46

este otazocka... hotovy index subor by mal vyzerat nejak takto?:

slovo1;2|4|6|10
slovo2;5
slovo3;11|18|22
slovo4;5|28|29
.....
mavin
Junior
Uživatelský avatar

Další stránka

Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků