Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z wyszukiwaniem na stronie, wyniki nie są najlepszej jakości
mefistofeles
post
Post #1





Grupa: Zarejestrowani
Postów: 255
Pomógł: 0
Dołączył: 23.06.2009

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


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ć ?

Ten post edytował mefistofeles 20.12.2009, 11:36:49
Go to the top of the page
+Quote Post
darko
post
Post #2





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


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)

Ten post edytował darko 20.12.2009, 13:50:29
Go to the top of the page
+Quote Post
mefistofeles
post
Post #3





Grupa: Zarejestrowani
Postów: 255
Pomógł: 0
Dołączył: 23.06.2009

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


Niestety nie mogę używać LIKE gdyż strasznie obciąża bazę.
Ma ktoś jeszcze jakieś pomysły ?
Go to the top of the page
+Quote Post
darko
post
Post #4





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


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?
Go to the top of the page
+Quote Post
Crozin
post
Post #5





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Jaka to jest baza danych? MySQL? http://devzone.zend.com/article/1304 - zwróć uwagę na przykłady z kolumną SCORE.
Go to the top of the page
+Quote Post
mefistofeles
post
Post #6





Grupa: Zarejestrowani
Postów: 255
Pomógł: 0
Dołączył: 23.06.2009

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


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ą ?
Go to the top of the page
+Quote Post
Crozin
post
Post #7





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


IMO preg_slipt, a jako wzorzec dowolna ilość białych znaków (\s+)
Go to the top of the page
+Quote Post
mefistofeles
post
Post #8





Grupa: Zarejestrowani
Postów: 255
Pomógł: 0
Dołączył: 23.06.2009

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


Preg_split dał radę (IMG:style_emoticons/default/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 :/


Ten post edytował mefistofeles 21.12.2009, 10:30:20
Go to the top of the page
+Quote Post
Crozin
post
Post #9





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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.
Go to the top of the page
+Quote Post
mefistofeles
post
Post #10





Grupa: Zarejestrowani
Postów: 255
Pomógł: 0
Dołączył: 23.06.2009

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


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)

Go to the top of the page
+Quote Post
Crozin
post
Post #11





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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...
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: 18.09.2025 - 17:24