Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Problem z długimi zapytaniami w wyszukiwarce
oi.
post 13.06.2011, 14:09:24
Post #1





Grupa: Zarejestrowani
Postów: 145
Pomógł: 1
Dołączył: 12.07.2006

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


Mam problem z wyszukiwarką na stronie, gdy ktoś wpisze długa frazę d przeszukania, np "jaka jest pogoda w Zakopanem"
Zmienna $znajdz przybiera wartość jaka jest pogoda w Zakopanem
Treść na stronie wyszukuję za pomocą:
  1. $pytanie = "SELECT * FROM newsy WHERE tytul LIKE '%$znajdz%' or tresc LIKE '%$znajdz%' LIMIT 10";

Za pomocą jakich funkcji zróżnicowac
  1. $znajdz="jaka jest pogoda w Zakopanem";
na warianty typu:

  1. $znajdz2="jaka jest pogoda";
  2. $znajdz="pogoda w Zakopanem";
  3. $znajdz="jaka jest";
  4. $znajdz="jaka jest w Zakopanem";
  5. ...


Ten post edytował oi. 13.06.2011, 14:48:26
Go to the top of the page
+Quote Post
drPayton
post 13.06.2011, 14:14:36
Post #2





Grupa: Zarejestrowani
Postów: 890
Pomógł: 65
Dołączył: 13.11.2005
Skąd: Olsztyn

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


Albo Fulltext search
albo najprościej ale mało inteligentnie wink.gif
rozbić string zapytania według spacji i:
  1. (..) LIKE '%czesc1%' OR LIKE '%czesc2%' OR LIKE '%czesc3%' (...)


To są dwa możliwe warianty, spośród wielu wink.gif
Go to the top of the page
+Quote Post
oi.
post 13.06.2011, 14:54:48
Post #3





Grupa: Zarejestrowani
Postów: 145
Pomógł: 1
Dołączył: 12.07.2006

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


Nie wiem tylko jak z danego zdania wyciągnąć poszczególne zwroty, by potem użyć w zapytaniu:
  1. $pytanie = "SELECT * FROM newsy WHERE ( tytul LIKE '%$a%' or tytul LIKE '%$b%' or tytul LIKE '%$c%' or tresc LIKE '%$a%' or tresc LIKE '%$b%' or tresc LIKE '%$c%') LIMIT 10";

Zastanawiam się nad użyciem array i foreach by uzyskać zmienne $a, $b, $c.
Go to the top of the page
+Quote Post
sadistic_son
post 13.06.2011, 15:35:52
Post #4





Grupa: Zarejestrowani
Postów: 1 495
Pomógł: 245
Dołączył: 1.07.2009
Skąd: Bydgoszcz

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


  1. $zwrot=explode(' ',$zwrot);
  2. $pytanie = "SELECT * FROM newsy WHERE ( tytul LIKE '%$zwrot[0]%' ";
  3. $i=0;
  4. foreach($zwrot as $z){
  5. if($i>0){
  6. $pytanie=$pytanie." or tytul LIKE '%$z%' ";
  7. }
  8. $i++;
  9. }
  10. $pytanie=$pytanie.' ) LIMIT 10 ';


Ten post edytował sadistic_son 13.06.2011, 15:37:30


--------------------
Uśpieni przez system, wychowani przez media,
Karmieni zmysłami, próżnymi żądzami...

-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Jesteś zbyt leniwy, żeby się zarejestrować? Ja jestem zbyt leniwy aby Ci pomóc!
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Go to the top of the page
+Quote Post
melkorm
post 13.06.2011, 16:18:32
Post #5





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

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


@sadistic_son
Nie lepiej:
  1. $zwrot = explode(' ',$zwrot);
  2. $like = array();
  3. foreach( $zwrot as $z )
  4. {
  5. $like[] = " tytul LIKE '%{$z}%' ";
  6. }
  7. $pytanie = sprintf("SELECT * FROM newsy WHERE %s LIMIT 10", implode(' OR ', $like ));


Oczywiście walidację itp zostawiamy twórcy tematu.

Ten post edytował melkorm 13.06.2011, 16:18:57


--------------------
Go to the top of the page
+Quote Post
singollo
post 13.06.2011, 16:34:20
Post #6





Grupa: Zarejestrowani
Postów: 47
Pomógł: 1
Dołączył: 25.11.2003

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


1. Lucene
2. Przeszukiwanie pełnotekstowe
3. Wszystkie rozwiązania opierające się na obustronnie otwartym LIKE szybko zajadą ci bazę danych.
Go to the top of the page
+Quote Post
oi.
post 13.06.2011, 18:04:46
Post #7





Grupa: Zarejestrowani
Postów: 145
Pomógł: 1
Dołączył: 12.07.2006

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


Sadistic_son Twoje rozwiązanie działa poprawnie.
Melkorm u Ciebie wkradł się błąd podejrzewam że chodzi o
  1. WHERE %s
nie wiem co to jest %s

Skrypt poprawnie wyszukuje dane z tabeli, ma tylko 1 wadę szuka także jednoliterowych zwrotów typu "z" , "o" przez co dane są nijakie.
W jaki sposób sprawić by skrypt brał pod uwagę tylko wyrazy minimum 3 znakowe?

Ten post edytował oi. 13.06.2011, 18:05:17
Go to the top of the page
+Quote Post
mat-bi
post 13.06.2011, 18:12:57
Post #8





Grupa: Zarejestrowani
Postów: 690
Pomógł: 92
Dołączył: 6.02.2011

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


strlen
Go to the top of the page
+Quote Post
sadistic_son
post 13.06.2011, 18:25:18
Post #9





Grupa: Zarejestrowani
Postów: 1 495
Pomógł: 245
Dołączył: 1.07.2009
Skąd: Bydgoszcz

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


Linijka 5 z mojego kodu:
  1. if($i>0 && strlen($z)>3){


--------------------
Uśpieni przez system, wychowani przez media,
Karmieni zmysłami, próżnymi żądzami...

-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Jesteś zbyt leniwy, żeby się zarejestrować? Ja jestem zbyt leniwy aby Ci pomóc!
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
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 Wersja Lo-Fi Aktualny czas: 12.06.2025 - 20:05