Autor Zpráva
prochazka.zde.cz
Profil *
Mam takovy dotazek:
Pisi si pro sve stranky vyhledavaci script. Respektive uz ho mam napsany, a funguje sqvele...
Ale problem je ze vyhleda pouze text ktery zadam. A jeste v tom poradi v kterem jsou slova napsana a pokud se pouziji znamenka tak ty bere taky jako string a ne logicky operator. Jde me jen o to jak to nejpele napsat. Svuj web nemam v databazi ale v prostych souborech. Takze prohledavam text v souborech. Mate nejake sqvele napady jak to elegantne napsat? Reseni mam spoustu ale jejprve se necham instipovat... Jeste podotknu ze hosting jede na PHP4. Takze nemohu pouzivat funkce z PHP5....
Leo
Profil
Zacal bych asi tim, ze bych to ze souboru prevedl do db. Leo
stribny
Profil
No přece - rozparsovat vyhledávací dotaz, zjistit co uživatel přeně hledá (několik slov nebo přesnou frázi) a pokusit se to najít ;)

Ale v db by to bylo jednodušší.
prochazka.zde.cz
Profil *
Zacal bych asi tim, ze bych to ze souboru prevedl do db. Leo

prevod do databaze neklapne. Ponevad to nechci...
prochazka.zde.cz
Profil *
No přece - rozparsovat vyhledávací dotaz, zjistit co uživatel přeně hledá (několik slov nebo přesnou frázi) a pokusit se to najít ;)

presne me jde o to jak to inteligentne rozparsovat. Kdyby nekdo poskytl nejaky kod kam se da nahlednou, jak to mam elegantne napsat. Proc zadam kod? Sice umim VBasic a VCecko, ale co jsem zatim zjistil, tak psani scriptu je trosku odlisne od klasickych programku. Tam mam k dyspozici cely pocitac pro sebe a je jedno zda program bude onu vec delat o 5 sekund dele nez u php.
Co se tyce te databazi: tak kdyz uz konecne jsem rozparsoval hldany vyraz, tak je jedno zda provedu dotaz na databazi a nebo pouziji svoji funkci ktera zaridi dodani hledanych dat ze souboru. Stejne databaze neni nic jineho nez lepsi filesystem. Jedine cim se da rozumne argumentovat pro databazi je ze ona funcke ktera provadi operace s databazi je napsana urcite v cecku a ja ji mam napsanou v interpretovanem jazyku PHP.

Zustaneme jen u dotazu rozumne parsovani hledaneho vyrazu. Co se tyce ulozeni hledanych dat, tak to je bezpredmetne....
llook
Profil
Stejne databaze neni nic jineho nez lepsi filesystem

Přesnější by bylo, že "filesystem není nic jiného než horší databáze". SQL databáze vedou zejména v dotazovacích možnostech. Třeba najít všechny texty, které buďto obsahují "slovo1" nebo obsahují "slovo2" a zároveň "slovo3" ti SQL databáze docela dost usnadní:

SELECT * FROM texty WHERE obsah LIKE '%slovo1%' OR (obsah LIKE '%slovo2%' AND obsah LIKE '%slovo3%');
prochazka.zde.cz
Profil *
Jasne. Ale me zajima jen to parsovani dotazu. O vyhledavani patricnych dat se postara uz moje fce...
stribny
Profil
A pak nemusite prece hleda klasickym LIKE, ale treba v MySQL (a urcite i jinde) je rovnou zabudovany fulltext - relevantnost apod.. co by jste si musel slozite programovat.

Rozparsovani - no tak zalezi jak slozite (jednoduche hledani delate)..

Muzete trebas jen rozdelit slova podle mezer, nebo zjistovat znamenko +- pred vyrazem, uvozovky pro konkretni vyraz ci co.. toho je hodne. Pouzit muzete trebas regularni vyrazi apod. ale pokud v tom nejste zbehli, opravdu doporucuju databazi :)
prochazka.zde.cz
Profil *
Muzete trebas jen rozdelit slova podle mezer, nebo zjistovat znamenko +- pred vyrazem, uvozovky pro konkretni vyraz ci co.. toho je hodne. Pouzit muzete trebas regularni vyrazi apod. ale pokud v tom nejste zbehli, opravdu doporucuju databazi :)

Si dovolim ric ze neco umim naprogramovat, pouze je otazkou jak. Najit nejakou nejvhodnejsi konstrukci. Proto bych uvital nejake priklady. Staci me hledani konkretniho retezce v uvozovkach a hledani jednotlivich slov spojenych znamenky + a - . A v pripade ze bude nekolik slov a nebude tam znamenko + a nebo - tak staci najit jakekoliv slovo aby byl vysledek shledan jako true.
Tak uz jsem zacal spat svoji parsovaci funkci. zatim mam jen to rozpoznavani zda vsutpni hledany retezec je v uvozovkach. Tekda se vrhnu na znamenka. Ja to nejak naprogramuji o tom nemam pochyb. Ale v php nejdu nejak mooc zbehly a tak by to mozna slo lepe. A neuvazuji o zadnych databazich a ani je nehodlam pouzit.
llook
Profil
S takovými požadavky už se dá něco dělat. Z fráze bych si vytahal tyto informace:
- slova, která v hledaném textu musí být (se znaménkem +)
- slova, která v hledaném textu nesmí být (znaménko -)
- ostatní slova (bez znamének)

A pak bych to nacpal té hledací funkci. Asi zkusím sesmolit parser, který by tohle zvládal, protože mě zajímá, jestli to bude tak jednoduché, jak se mi teď zdá.
llook
Profil
// do týhle proměnný si dosaď hledaný výraz

$query = $_GET['q'];

// tady do těch proměnných se uloží slova/fráze roztříděné podle znaménka
$plusWords =
$minusWords =
$otherWords = array();

// tyhle dva RE budu používat
$re_phrase = '~(?:[+-]?"[^"]+"|[^ ]+)~';
$re_phraseToWord = '~^(?P<sign>[+-]?)"?(?P<word>[^"]+)"?$~';

// parsování
preg_match_all($re_phrase, $query, $matches);
foreach ($matches[0] as $phrase) {
if (preg_match($re_phraseToWord, $phrase, $matches2)) {
if ($matches2['sign'] === '+') {
$plusWords[] = $matches2['word'];
} elseif ($matches2['sign'] === '-') {
$minusWords[] = $matches2['word'];
} else {
$otherWords[] = $matches2['word'];
}
}
}

// nakonec se podíváme, co z toho vylezlo
echo 'plus:<br>'; var_dump($plusWords);
echo 'minus:<br>'; var_dump($minusWords);
echo 'others:<br>'; var_dump($otherWords);
prochazka.zde.cz
Profil *
diky za kodecek :-), skousel jsem ho ale jjak nefunguje. Jako testovaci hledany retezec jsem pouzil toto:

amiga +pokus-nevim "ahoj kuk" bez_mezery

to sice je velice nepravdepodobny ze neco podobneho uzivatel zada ale kdyz neco programuji tak vetsinou se zameruji na velice nepravdepodobne vsupni informace. Neco se me vtom vasem kodu libi neco jsem nepochopil. aspon mam nejaky takovy navod. tak zacnu badat.
krteczek
Profil
http://php.vrana.cz/vyhledavani-v-javascriptu.php
myslím že tohle je to co hledáš :-)
Leo
Profil
"prevod do databaze neklapne. Ponevad to nechci..."

V tom pripade - komu neni rady, tomu neni pomoci, Leo
prochazka.zde.cz
Profil *
"prevod do databaze neklapne. Ponevad to nechci..."

V tom pripade - komu neni rady, tomu neni pomoci, Leo


ja nechapu proc me tu neustale nutite databazi, kdyz muj dotaz vubec nesouvisi s databazi!
Prosim prectite si co vybec tu resim!
Me zajima parsovani vstupnich informaci a az je budu mej, tak uz potom jde to vyhledavani. Vyhledavani uz mam davno vyresene...
krteczek
Profil
Sry tohle neber(opraveno)
takze ti de oto jak načíst soubor aby byl proměnnou???máš několik možnosti:
file()=>vytvoří pole 1 řadek= 1 položka pole;
fopen,fread,...atd prostě kmbinace pro čtení obsahu souboru
vytvoříš si nějaký systém proměnných do kterých v tech souborech uložíš jednotlivé části (třeba nadpis, obsah, styly...meze se nekladou), a stránka bude obalena například funkcí... tohle používám já pro muj rs.

********************************************************************** **************
nejprve bych spojil znaménka s následujícím slovem nějak takhle

$text=preg_match("#([+-])([ \t]{1,}#U"," \\1",$text);

potom bych udelal nejakou fci ktera by vkladany terezec rozdělila na pole jednotlivých _poddotazu_ ktere bych poskladal zasebe a použil při hledání.
krteczek
prochazka.zde.cz
Profil *
mirne jsem kod modifikoval na:

$query=Str_Replace("+"," + ",$query);
$query=Str_Replace("-"," - ",$query);
$query=Str_Replace('"',' " ',$query);
$query=Str_Replace("'"," ' ",$query);
$query=Str_Replace("\\","",$query);

$re_phrase = '(^[a-zA-Z0-9]+[+-]?|[^"]+[ ]+["]|[^\']+[ ]+[\'])';

preg_match_all($re_phrase, $query, $matches);

jako zkusebni retezec pouzivat toto:

amiga +pokus-nevim "ahoj kuk" bez_mezery 'aaa nnn'

taze by se to melo rozsekat na:

amiga
+
pokus
-
nevim
"ahoj kuk"
bez_mezery
'aaa nnn'

ale nejak na to nemohu prijit. At studuji jak studuji. ty znaky pro regurelni vyraz me davaji zabrat...
pomuze nekdo?
prochazka.zde.cz
Profil *
uz nemusete: uz jsem na to prisel:

$re_phrase = '([a-zA-Z0-9 \_]+|[+-]|["]+[ ]+["]|[\']+[ ]+[\'])';

a fungujeto sqvele.... :-)
prochazka.zde.cz
Profil *
ale prece mam jeste na regulerni vyraz dotazek: hledany vyraz jsem modifikoval na:

amiga +pokus-nevim "ahoj kuk" bez_mezery + 'aaa nnn'


$re_phrase = '([a-zA-Z0-9 \_]+|[+-]|[ ]?["]+[ ]+["]|[ ]?[\']+[ ]+[\'])';

a stane se me ze me to vyhodnoti jednu merezu jako dalsi retezec u teto casti retezce:

'aaa nnn'

nejprve to udela retezec +
potom je mezera a
nesleduje dalsi retezec: aaa nnn
nejak se me nepodarilo tu merezu pridat k tomu: aaa nnn,
toto nejak nezabejra: [ ]?
krteczek
Profil
někdy je výhodnější použít funkci trim(); která odstraní přebytečné mezery
prochazka.zde.cz
Profil *
někdy je výhodnější použít funkci trim(); která odstraní přebytečné mezery

tu funkci hojne vyuzivam. Ale zde se me stalo ze mezera ja jako novy retezec...
prochazka.zde.cz
Profil *
tak uz jsem konecne tu parsovaci funkci napsal.... Funguje ok. tu ji mate, pro ty co se chcou inspirovat. kod je sice delsi ale hlavne mu rozumim....

function ParseVyraz ($query){
// tady do těch proměnných se uloží slova/fráze roztříděné podle znaménka
//$plusWords =
//$minusWords =
//$otherWords = array();

$query = 'amiga +pokus-nevim "ahoj kuk" bez_mezery + \'aaa nnn\'' ;

$re_phrase = '([a-zA-Z0-9 \_]+|[+-]|[ ]?["]+[ ]+["]|[ ]?[\']+[ ]+[\'])';

// parsování
preg_match_all($re_phrase, $query, $pole);
for ( $a=0; $a < Count($pole[0]);){
$sBufferA = Trim($pole[0][$a]);

if ($sBufferA == ""){
$a++;
$sBufferA = Trim($pole[0][$a]);
}
if ($sBufferA == '+'){
$sBufferB = $sBufferA;
$a++;
}
elseif($sBufferA == '-'){
$sBufferB = $sBufferA;
$a++;
}
else{
if ($sBufferB == '+'){
$plusWords[] = $sBufferA;
$sBufferB = "";
$a++;
}
elseif ($sBufferB == '-'){
$minusWords[] = $sBufferA;
$sBufferB = "";
$a++;
}
else {
if ($a == 0){
$plusWords[] = $sBufferA;
}
else{
$otherWords[] = $sBufferA;
}
$a++;
}
}
}

// nakonec se podíváme, co z toho vylezlo
echo 'plus: '. var_dump($plusWords) . "<br>";
echo 'minus: '. var_dump($minusWords) . "<br>";
echo 'others: '. var_dump($otherWords) . "<br>";
}
prochazka.zde.cz
Profil *
mam dalsi dotazek:
jak napsat dotaz pro hledani. Mam k dispozici soubor nebo jeden radek ze souboru a tedka chci na neho pouzit ten rozparsovany vyraz. Pouzivat ve smicce prikaz: StrPos se me nezda moc moudre. Napadlo me ze bych podle vysledku rozparsovani udelal dalsi regurelni vyraz a potom vyhodnotil vysledek. Predpokladam ze funkce: preg_match_all vrati true pokud uspeje a false pokud nicnenajde. nezajima me dalsi vysledek. Aspon prozatim. pozdeji bych vysledek pouzil pro oznaceni shodnych slov, spojeni dle hledaneho vyrazu.
Takze mam dotaz jak takovy regulerni vyraz sestavit. Pokud se bude jednat o ostatni tak na to pouziji znak | . Kdyz to bude znak + tak vyraz uzavru do hranatych zavorek. A mam ze to dat znamenko plus? Zde nastava problem kdyz mam nekolik slov spojeni znamenkem. Kdyz sestavim regulerni vyraz treba takto: [ahoj]+[nevim]+[kuk]+ tak by me zajimalo zda se to vyhodnoti ze ty slova musi bejt v poradi "ahoj , nevim , kuk" nebo mohou bejt libovolne pohazena? Podle me regulerni vyraz bude pravdivy pokud se najdou ve stejnem poradi. Jak to zaridit aby se vsechny vyrazi spojene znamenkem plus nalezali v retezci a pritom mohly bejt v libovolnem poradi. Jedine co me napada je vytvorit redulerni vyraz, ktery bude obsahovat vsechny mozne kombinace tech slov a ty spojeni budou oddelene znakem | . Dalsi problem je jak ric regulernimu vyrazu ze zadane slovo nesmy bejt ve hledanem retezci, souboru.

Budu rad ze kazde nakopnuti....
Toto téma je uzamčeno. Odpověď nelze zaslat.

0