Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> 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
 
Start new topic
Odpowiedzi (1 - 14)
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 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 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 !


--------------------
Nie udzielam pomocy poprzez PW
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 smile.gif



--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
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 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


--------------------
..::: Jak pomogłem to kliknij pomógł. Tak rzadko używacie tej opcji :( :::..
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ć 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 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


--------------------
..::: Jak pomogłem to kliknij pomógł. Tak rzadko używacie tej opcji :( :::..
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)


--------------------
..::: Jak pomogłem to kliknij pomógł. Tak rzadko używacie tej opcji :( :::..
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


--------------------
..::: Jak pomogłem to kliknij pomógł. Tak rzadko używacie tej opcji :( :::..
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 biggrin.gif Oczywiście, że nie przeglądałem tego linka (wcześniej) 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 wink.gif


--------------------
..::: Jak pomogłem to kliknij pomógł. Tak rzadko używacie tej opcji :( :::..
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 19.08.2025 - 07:01