Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wyszukiwanie i dużo pól do przeszukania - optymalnie ?
Mayka
post
Post #1





Grupa: Zarejestrowani
Postów: 304
Pomógł: 1
Dołączył: 12.01.2009
Skąd: Kanapa

Ostrzeżenie: (0%)
-----


Witam

Robie wyszukiwarke która będzie wyszukiwać produkty w tabeli, wyszukiwanie musi być, po kilku polach i teraz nie wiem czy takie coś będzie optymalne ?
  1. $query = "SELECT * FROM produkty WHERE tytul LIKE '%$fraza%' OR autor LIKE '%$fraza%' OR data LIKE '%$fraza%' OR tresc LIKE '%$fraza%'
  2. ORDER BY data DESC LIMIT $limit_g";


I jeszcze mam takie pytanie bo autorzy będą wyświetleni jako lista i będzie można zaznaczyć u którego autora ma szukać jak to zrobić ?

Ten post edytował Mayka 13.03.2012, 17:15:50
Go to the top of the page
+Quote Post
alegorn
post
Post #2





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

Ostrzeżenie: (0%)
-----


jedno slowo okreslajace ten pomysl jesli chodzi o wydajnosc:
masakra ewentualnie, powiedzialbym czyste zło

w jednym zapytaniu udalo ci sie zgromadzic najgorsze pomysly dotyczace wyszukiwarki, a to w sumie tez niezle osiagniecie (IMG:style_emoticons/default/wink.gif)


po pierwsze.
ogranicz maksymalnie po stronie php zakres przeszukiwania! najlepiej jesli udalo by ci sie ograniczyc przeszukiwanie do jednego pola

po drugie.
jesli juz nie uda ci sie ograniczyc ilosci pol do przeszukiwania - zamiast 'or' uzyj 'union'

po trzecie
jesli to mozliwe, ogranicz wyszukiwanie lewostronnie zamkniete (czyli 'LIKE "$costam%"') pozwoli to wykorzystac indexy


w chwili obecnej za tak napisane zapytanie - moj admin zaproponowal by ci honorowe seppuku (IMG:style_emoticons/default/wink.gif)


a jesli nie uda ci sie skorzystac na zadnej z tych 3 rad (choc minimum 2 da sie wdrozyc) proponuje uzyc Sphinx, lub cos podobnego.

j.

Ten post edytował alegorn 14.03.2012, 13:22:09
Go to the top of the page
+Quote Post
gothye
post
Post #3





Grupa: Zarejestrowani
Postów: 702
Pomógł: 65
Dołączył: 16.03.2009

Ostrzeżenie: (0%)
-----


zamiast wyszukiwania LIKE zastosuj index Fulltext w bazie i skorzystaj przy wyszukiwaniu za pomocą jego .

zawsze możesz użyć sphinx'a ,budowałem na nim wyszukiwarki mające po 100 i więcej parametrów wyszukiwania a indexy rekordów w takich przypadkach
są zwracane w ciągu 0.015s z bazy zawierającej 3mln rekordów !
Go to the top of the page
+Quote Post
Sephirus
post
Post #4





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Zgadzam się z przedmówcami i dodam, że zdecydowanie lepiej dać Index fulltext na objęte szukaniem pola i używać MATCH AGAINST - zawsze szybsze od tego co proponujesz (IMG:style_emoticons/default/smile.gif)

Go to the top of the page
+Quote Post
cudny
post
Post #5





Grupa: Zarejestrowani
Postów: 387
Pomógł: 66
Dołączył: 31.03.2005
Skąd: Kielce

Ostrzeżenie: (0%)
-----


Powiedzmy, że musisz użyć like i nie możesz pełnotekstowych index'ów (czyli źle zaprojektowana baza) to jest rozwiązanie, które pasuje do tego jak to mój przedmówca napisał honorowego sepuku (IMG:style_emoticons/default/biggrin.gif)

  1. $query = "SELECT * FROM produkty WHERE concat(tytul,autor,data,tresc) LIKE '%fraza%' ORDER BY data DESC LIMIT $limit_g"


Ten post edytował cudny 15.03.2012, 22:02:32
Go to the top of the page
+Quote Post
Mayka
post
Post #6





Grupa: Zarejestrowani
Postów: 304
Pomógł: 1
Dołączył: 12.01.2009
Skąd: Kanapa

Ostrzeżenie: (0%)
-----


No baza jest jeszcze w takim stadium że można ją troche przeprojektować (IMG:style_emoticons/default/smile.gif)
i własnie dla tego wolałem zapytać czy jest jakaś możliwość żeby nie obciążać za mocno serwera przy wielu zapytaniach..
Dzieki za pomoc i pomysły. Bede się odyzwał jeszcze w tej sprawie (IMG:style_emoticons/default/wink.gif)

Bo tak w międzyczasie znalazłem jeszcze na forum takie coś :
  1. $wh = array();
  2. if (!empty($_POST['imie'])) {
  3. $wh[] = 'imie = '.'"'.$_POST['imie'].'"'; //imie
  4. }
  5. if (!empty($_POST['nazwisko'])) {
  6. $wh[] = 'nazwisko = '.'"'.$_POST['nazwisko'].'"'; //nazwisko
  7. }
  8. if (!empty($_POST['adres'])) {
  9. $wh[] = 'adres = '.'"'.$_POST['adres'].'"'; //adres
  10. }
  11. if (!empty($_POST['miejscowosc'])) {
  12. $wh[] = 'miejscowosc = '.'"'.$_POST['miejscowosc'].'"'; //miejscowosc
  13. }
  14. if (!empty($wh)) {
  15. $where = 'WHERE '.implode(' and ', $wh);
  16. $query = 'SELECT * FROM tabela '.$where.' ORDER BY id DESC';
  17. } else {
  18. $query = 'SELECT * FROM tabela ORDER BY id DESC';
  19. }

Ale to chyba nie wiele zmienia ?

ilość pól niestety nie może być ograniczona.. Będzie wyszukiwanie po 6 polach

Ten post edytował Mayka 16.03.2012, 13:15:49
Go to the top of the page
+Quote Post
cudny
post
Post #7





Grupa: Zarejestrowani
Postów: 387
Pomógł: 66
Dołączył: 31.03.2005
Skąd: Kielce

Ostrzeżenie: (0%)
-----


Więc użyj to co Ci zaproponowałem - poprostu łączysz sobie pola textowe i używasz na nich tylko raz LIKE, które jest wyrażeniem regularnym, a dzięki połączeniu pól textowych wykonujesz je tylko raz
Go to the top of the page
+Quote Post
Mayka
post
Post #8





Grupa: Zarejestrowani
Postów: 304
Pomógł: 1
Dołączył: 12.01.2009
Skąd: Kanapa

Ostrzeżenie: (0%)
-----


Cytat(cudny @ 16.03.2012, 13:32:29 ) *
Więc użyj to co Ci zaproponowałem - poprostu łączysz sobie pola textowe i używasz na nich tylko raz LIKE, które jest wyrażeniem regularnym, a dzięki połączeniu pól textowych wykonujesz je tylko raz


No mogę dodać
  1. ALTER TABLE Artukuly
  2. ADD FULLTEXT INDEX (tytul(20),tresc(20));
do każdego z pól ale mam pytanie jak będzie wyglądało szukanie po np. 3 polach ? Bedą brane pod uwage wszystkie 3 na raz przy wyświetlaniu wyników ?

Więc fulltext czy Like ?
Edit:
Wiec przetestowałem i :
  1. $wynik = mysql_query("SELECT * FROM produkty WHERE MATCH (tytul,autor,data,login) AGAINST('".$szukaj."') ")

Nie działa.. nie wiem dla czego jak by mogl ktoś to poprawić to bede wdzieczny..
natomiast :
  1. $wynik = mysql_query("SELECT * FROM produkty WHERE concat(tytul,autor,data,login) LIKE '%".$szukaj."%' ")

działa ale mam jeden problem jak wpisze.. 'login' to wszystko działa ale jak wpisze 'login o obrotach' -> 'mayka o obrotach' to nic nie znajduje dlaczego ?
mayka jest w tabeli z loginami, o obrotach jest w tabeli tytuł.

Ten post edytował Mayka 16.03.2012, 17:04:10
Go to the top of the page
+Quote Post
Niktoś
post
Post #9





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


A zajrzyj tutaj,może Cie to naprowadzi:
http://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html
Go to the top of the page
+Quote Post
cudny
post
Post #10





Grupa: Zarejestrowani
Postów: 387
Pomógł: 66
Dołączył: 31.03.2005
Skąd: Kielce

Ostrzeżenie: (0%)
-----


Cytat(Mayka @ 16.03.2012, 16:21:25 ) *
No mogę dodać
  1. ALTER TABLE Artukuly
  2. ADD FULLTEXT INDEX (tytul(20),tresc(20));
do każdego z pól ale mam pytanie jak będzie wyglądało szukanie po np. 3 polach ? Bedą brane pod uwage wszystkie 3 na raz przy wyświetlaniu wyników ?

Więc fulltext czy Like ?
Edit:
Wiec przetestowałem i :
  1. $wynik = mysql_query("SELECT * FROM produkty WHERE MATCH (tytul,autor,data,login) AGAINST('".$szukaj."') ")

Nie działa.. nie wiem dla czego jak by mogl ktoś to poprawić to bede wdzieczny..
natomiast :
  1. $wynik = mysql_query("SELECT * FROM produkty WHERE concat(tytul,autor,data,login) LIKE '%".$szukaj."%' ")

działa ale mam jeden problem jak wpisze.. 'login' to wszystko działa ale jak wpisze 'login o obrotach' -> 'mayka o obrotach' to nic nie znajduje dlaczego ?
mayka jest w tabeli z loginami, o obrotach jest w tabeli tytuł.



No bo tak:
kolumna tytul = 'jakis tytul i tak dalej'
kolumna autor = 'to jest autor i w ogole'
kolumna data = '2010-10-12'
kolumna login = 'mayka'

po concat masz:
'jakis tytul i tak dalej to jest autor i w ogole2010-10-12mayka'
musisz dać:

'jakis tytul i tak dalej to jest autor i w ogole2010-10-12mayka' LIKE '%tytul%mayka%' wtedy ci znajdzie.
Ogólnie % to jest coś co zastępuje cokolwiek (jakikolwiek znak)
Go to the top of the page
+Quote Post
Niktoś
post
Post #11





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


Cytat
'jakis tytul i tak dalej to jest autor i w ogole2010-10-12mayka'
musisz dać:

'jakis tytul i tak dalej to jest autor i w ogole2010-10-12mayka' LIKE '%tytul%mayka%' wtedy ci znajdzie.
Ogólnie % to jest coś co zastępuje cokolwiek (jakikolwiek znak)

Po to Kolega chce użyć fulltext, żeby nie używać Like który jest nieoptymalny w procesie wyszukiwania.
Go to the top of the page
+Quote Post
cudny
post
Post #12





Grupa: Zarejestrowani
Postów: 387
Pomógł: 66
Dołączył: 31.03.2005
Skąd: Kielce

Ostrzeżenie: (0%)
-----


No, cały czas jest pisane o full text search ale w tym wyadku lepsze błdzie chyba użycie jednego wyrażenia regularnego niż 4 krotne użycie full text no nie ?
poprzez concat nie zadziała full text i trzeba będize zrobić 4 * OR
Go to the top of the page
+Quote Post
Niktoś
post
Post #13





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


A spojrzałeś chociaż na ten link co podałem?
Go to the top of the page
+Quote Post
Mayka
post
Post #14





Grupa: Zarejestrowani
Postów: 304
Pomógł: 1
Dołączył: 12.01.2009
Skąd: Kanapa

Ostrzeżenie: (0%)
-----


Cytat(Niktoś @ 16.03.2012, 18:12:14 ) *
A spojrzałeś chociaż na ten link co podałem?


Pytasz mnie czy cudnego bo nie wiem..
Jesli mnie to przejzałem.. natomiast niewiem dlaczego moje zapytanie jest nie poprawne..
Go to the top of the page
+Quote Post
cudny
post
Post #15





Grupa: Zarejestrowani
Postów: 387
Pomógł: 66
Dołączył: 31.03.2005
Skąd: Kielce

Ostrzeżenie: (0%)
-----


To było do mnie (IMG:style_emoticons/default/biggrin.gif) Oczywiście, że nie przeglądałem tego linka (wcześniej) (IMG:style_emoticons/default/wink.gif)
Mayka pytał o like więc dałem rozwiązanie, z tym, że $szukaj pokazywała się do każdej kolumny, więc uznałem, że szuka $szukaj w czterech kolumnach - wtedy like to zwykłe wyrażenie pojedyńcze.
Ogólnie można pokombinować z indexami pełnotextowymi, to już nie moja działka (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 21:56