DevProTalk

DevProTalk (http://www.devprotalk.com/index.php)
-   PHP (http://www.devprotalk.com/forumdisplay.php?f=9)
-   -   database pretraga (and pa posle or) (http://www.devprotalk.com/showthread.php?t=7462)

LiquidBrain 06. 05. 2009. 23:48

database pretraga (and pa posle or)
 
Pozz,
razmisljam kako da napravim funkcionalnost pretrage tako da prvo prikazuje rezultate po "AND" kritrtijumu a posle po "OR"?

dakle ako trazim "predsednik srbije" da mi prvo izbaci rezultate gde ima obe reci a tek posle rezultate sa nekom od njih...

Jel ima neko neki bolji predlog od toga da pravim dva upita gde je jedan za "and" a drugi za "or"?

Hvala!

Blood 07. 05. 2009. 00:41

Ja sam to jednom prilikom odradio ovako:
(da se odma ogradim, nije bila nesto ogromna baza)

Znaci povuces podatke sa OR i onda preko preg_match-a za dobijene rezultate odradis pretragu za svaku rec. Rezultate stavis u novi niz, a za index niza stavis broj koliko reci ima match. Recimo:

imas 3 rekorda u bazi:
- predsednik je uspeo
- predsednik srbije je nesto uradio
- pocetak nove srbije

Kad prodje kroz match, dobio bi ovakav niz:
$res[2][] => "predsednik srbije je nesto uradio"
$res[1][] => "predsednik je uspeo"
$res[1][] => "pocetak nove srbije"

Nadam se da ti ovo moze pomoci...

razno 07. 05. 2009. 00:46

Mogao bi da koristis union all da spojis ta dva upita u jedan posto pretpostavljam da je selektovani broj kolona isti.Ovo ce ti dati dvaput isti zapis.Mozes da uradis i grupisanje pa da izbacis duplikate. Ne znam kako ce uticati na performanse,ali testiraj ako se odlucis za tako nesto.

LiquidBrain 07. 05. 2009. 01:01

uf... konkretno se radi o bazi koja ima preko 2 miliona rekorda...

@blood, interesantno resenje, ali na zalost nece bash da moze sa ovom kolicinom podataka...

@razno, union i subqueriji na mysql-u nisu bash dobri sto se tice performansi...

Ja sam nesto razmisljao, kao varijaciju na blood-ovu ideju tako da izvucem sve sa "OR", a da zatim prilikom obrade samog reda u petlji stavim testiranje da li se svi pojmovi nalaze u samom stringu, pa ako da onda da ih stavim u jedan niz, a ako ne onda da ih stavim u drugi...

To mi izgleda kao najjednostavnije resenje, i verovatno najefikasnije, posto bi duplo drndanje po bazi bio poprilican problem, a svakako mi je neophodno da to sortiram...

Jedina mana u celom ovom slucaju je to sto moze da bude proizvoljan broj reci, sto bi samim tim vodilo do broja nizova koji je ekvivalentan broju reci u pretrazi... uf... jel neko ima google source? :P

Hvala svima, necu ovo do sutra sigurno da radim, pa ako neko ima bio bih zahvalan, i platio bih pivo na okupljanju sledece nedelje :)

Heheh, mito i korupcija :)

nixa 07. 05. 2009. 01:13

Lucene ?

nn.nn 07. 05. 2009. 03:08

Sphinx ?

Vladimir Rodic 07. 05. 2009. 07:50

Citat:

Originalno napisao LiquidBrain (Napišite 69097)
i platio bih pivo na okupljanju sledece nedelje :)

:1043:

jablan 07. 05. 2009. 09:07

Malo je kontraintuitivno da se korisniku u rezultatima pretrage prikazuju mešani rezultati AND i OR, jer on kad kuca obično ima predstavu da se pretraga radi ili po jednom ili po drugom mehanizmu.

Moj predlog je da svakako radiš dva upita (na kraju krajeva, koliko često korisnici pretražuju), prvo AND, pa
1) Ako nema rezultata za AND, odmah uradiš OR i prikažeš korisniku rezultate OR, sa napomenom da je urađen fallback.
2) Ako rezultata za AND ima za manje od jedne strane, vratiš ih i ponudiš korisniku link kojim može da uradi OR
3) Ako AND rezultata ima za više od jedne strane, uopšte ne pominješ OR pretragu.

LiquidBrain 07. 05. 2009. 14:16

@jablan,
eh, kada bih se ja pitao, to bi bilo tako... ali s'obzirom da klijent to trazi bash tako onda nemam sta sem da napravim kako zeli...

Borba sa vetrenjacama nikad nije uradila plodom...

ivanhoe 07. 05. 2009. 18:30

gresis oko uniona, ponekad je UNION ALL brze od OR, zavisi od indexa. Ja sam imao slucaj sa fultext searchom po naslovi i textu clanka, koji je jos trebalo sortirati po relevantnosti, i sa OR nikako nije hteo da koristi indexe kako treba, pa je UNION ALL bio znacajno brzi..

Posto pretpostavljam da ce i ti koristi fulltext search, ako koristis binary opciju onda ti je relevance prakticno broj reci koje se matchuju. Mogao bi sa UNION da uzimas rezultate, pa da ih sortiras po relevance i tako bi prvo dobio one koji matchuju sve reci, pa sve sem jedne, itd...


Vreme je GMT +2. Trenutno vreme je 20:07.

Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.

Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.