Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Problem z długimi zapytaniami w wyszukiwarce
Forum PHP.pl > Forum > Przedszkole
oi.
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. ...
drPayton
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
oi.
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.
sadistic_son
  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 ';
melkorm
@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.
singollo
1. Lucene
2. Przeszukiwanie pełnotekstowe
3. Wszystkie rozwiązania opierające się na obustronnie otwartym LIKE szybko zajadą ci bazę danych.
oi.
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?
mat-bi
strlen
sadistic_son
Linijka 5 z mojego kodu:
  1. if($i>0 && strlen($z)>3){
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.