Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z wyszukiwaniem na stronie
Forum PHP.pl > Forum > PHP
mefistofeles
Mam coś takiego:
  1. $sql ='SELECT id,tytul,autor,data FROM `'.$tabelka.'` WHERE match(`tytul`) against ("+'.$szukane'*" IN BOOLEAN MODE) LIMIT 100';


Wyszukiwanie to nie działa zbyt dobrze bo gdy frazą do wyszukiwania jest np: "mickiewicz dziady" to wyszukiwarka znajduje wszystko gdzie jest mickiewicz
ale nie koniecznie dziady wiec na poczatku wcale nie ma interesującego nas wyniku jest zwykle gdzieś daleko a chciałbym
żeby to działało tak jak należy czyli żeby oba słowa musiały się znajdować w wyniku który ma zostać wyświetlony.

Sytuacja jest taka sama z dłuższymi frazami.

Jak to poprawić ?
darko
Może to coś pomoże (nie jest to full text search, ale może coś pomoże):
where tytul like '%$szukane%' <- znajdzie wszystko, co zawiera daną frazę (dane frazy)
where tytul like '%$szukane' <- znajdzie wszystko, co zaczyna się od podanej frazy (podanych fraz)
where tytul like '$szukane%' <- znajdzie wszystko, co kończy się na podanej frazie (podanych frazach)
mefistofeles
Niestety nie mogę używać LIKE gdyż strasznie obciąża bazę.
Ma ktoś jeszcze jakieś pomysły ?
darko
Może usuń tą gwiazdkę?, Na stronie http://dev.mysql.com/doc/refman/5.1/en/fulltext-boolean.html znalazłem coś takiego:

SELECT * FROM quotes_table MATCH (quote) AGAINST ('"mangé" "pensé"' IN BOOLEAN MODE)

SELECT * FROM quotes_table MATCH (quote) AGAINST ('+"mangé" +"pensé"' IN BOOLEAN MODE)

Może w ten sposób oddzielaj kolejne frazy?
Crozin
Jaka to jest baza danych? MySQL? http://devzone.zend.com/article/1304 - zwróć uwagę na przykłady z kolumną SCORE.
mefistofeles
Dzięki za przykłady!

Tylko jak podzielić frazę która wpisze osoba szukająca tak aby każde słowo było w innej zmiennej ?

Explode ?

Nigdy nie wiadomo czy ktoś wpisze jedno słowo czy dziesięć (zwykle oddziela je spacja).
Jak to zrobić z głową ?
Crozin
IMO preg_slipt, a jako wzorzec dowolna ilość białych znaków (\s+)
mefistofeles
Preg_split dał radę smile.gif

Teraz w zmiennych c1 do c10 przechowuje kolejne wyrażenia jednak nie mogę sobię poradzić z użyciem więcej niż jednego w zapytaniu:

  1. $sql ='SELECT * FROM `'.$tabelka.'` WHERE match(`tytul`) against ("'.$c1.'" IN BOOLEAN MODE) LIMIT 1000 ';


To działa, ale jak dodaje c2 w taki sposób:

  1. $sql ='SELECT * FROM `'.$tabelka.'` WHERE match(`tytul`) against ("'.$c1.$c2.'" IN BOOLEAN MODE) LIMIT 1000 ';


to wyniki są takie same jak w 1 przypadku pod warunkiem że wyszukiwana fraza to tylko 1 słowo jak dodaje drugie to zwraca mi pusty wynik.
Próbowałem jeszcze tak:

  1. $sql ='SELECT * FROM `'.$tabelka.'` WHERE match(`tytul`) against ("'.$c1.'" IN BOOLEAN MODE) against ("'.$c2.'" IN BOOLEAN MODE) LIMIT 1000 ';


w tym wypadku zawsze zwraca pusty wynik.
Analizowałem strony które mi wcześniej podaliście i ten 1 przykład niby powinien działać ale niestety oba nie dają rady.


Pomożecie jeszcze ?


// EDIT

A jak robię tak:

  1. $sql ='SELECT * FROM `'.$tabelka.'` WHERE match(`tytul`) against ("'.$c1.','.$c2.'" IN BOOLEAN MODE) LIMIT 1000 ';


To po wpisaniu 2 słów zwraca mi trochę inne wyniki ale wcale nie są to rezultaty zawierające oba słowa :/
Crozin
Mialem pisac wczesniej, ale zapomnialem.
Zostaw uzytkownikowi wieksza swobode w formie wpisywanej frazy. Pozwol mu zdecydowac czy chce szukac "ala ma kota" czy moze "+ala ma -kota". Dolacz do tego jakas prosta instrukcje - jest to duzo lepsze rozwiazanie.

PS. Przepraszam za brak polskich znakow, nie mam chwilowo mozliwosci pisania inaczej.
mefistofeles
Bardzo chętnie bym tak zrobił, ale w tym momencie nawet 'ala ma kota' jest nie do znalezienia
gdyż po wpisaniu tego wyszukiwarka znajdzie wszystko gdzie jest ala a nie koniecznie będzie
to 'ala ma kota' tzn ten wynik się pojawi ale gdzieś daleko dlatego na początek chciałem po prosto
rozbić wpisywaną frazę na części i wyszukać w ten sposób aby wynik zawierał wszystkie słowa ale coś
mi to nie idzie. Nigdy nie robiłem wyszukiwarek ale chyba ktoś wie jak to zrobić z głową bo jak mówiłem
można by użyć LIKE ale przy takiej liczbie rekordów w bazie jaką mam jest to poprostu niemożliwe
(koszmarnie obciąża serwer już jedno zapytanie)

Crozin
Tak, 'ala ma kota' zwróci Ci zarówno rekordy, które mają samo 'ala' jak i te z 'ala ma kota', ale stosując to co opisałem wcześniej (http://forum.php.pl/index.php?s=&showtopic=138104&view=findpost&p=693318) będziesz mieć wyniki z 'ala ma kota' na pierwszym miejscu...
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.