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! |
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... |
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.
|
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 :) |
Lucene ?
|
Sphinx ?
|
Citat:
|
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. |
@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... |
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 04:05. |
Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.