Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zaawansowana wyszukiwarka
Forum PHP.pl > Forum > PHP
tomaszh
Stworzenie prostej wyszukiwarki opartej na Mysql wraz z porcjowaniem zapytań z pewnością nie sprawia żadnego problemu. Problem pojawia się gdy chcem stworzyć wyszukiwarkę z mechanizmem podobnym do wyszukiwarki google. A konkretnie o sortowanie wyników według trafności wyszukiwania. Gdy mamy dla przykładu bazę:
1: warszawa, stolica, polska, unia
2: polska, ue, unia
3: poznan, krakow, szczecin, ue
Gdy wyszukujemy słowa (polska, ue, unia), jako pierwsze powinno pokazac sie 2,1,3. Po rozbiciu frazy na słowa, sam kod jest kombinacją tych słów:
  1. <?php
  2. $kat1=&#092;"SELECT * from baza WHERE fraza LIKE %$a% AND fraza LIKE %$b% AND fraza LIKE %$c%\"
  3. $kat2=&#092;"SELECT * from baza WHERE fraza LIKE %$a% AND fraza LIKE %$c% AND fraza LIKE %$b%\"
  4. $kat3=&#092;"SELECT * from baza WHERE fraza LIKE %$b% OR fraza LIKE %$a% AND fraza LIKE %$c%\"
  5. $kat4=&#092;"SELECT * from baza WHERE fraza LIKE %$b% AND fraza LIKE %$c% AND fraza LIKE %$a%\"
  6. $kat5=&#092;"SELECT * from baza WHERE fraza LIKE %$c% AND fraza LIKE %$b% AND fraza LIKE %$a%\"
  7. $kat5=&#092;"SELECT * from baza WHERE fraza LIKE %$c% AND fraza LIKE %$a% AND fraza LIKE %$b%\"
  8.  
  9. ?>

W ten sposób powstało mi 5 poleceń i wystarczy pokazać rekordy które odpowiadają $kat1, $kat2, $ka3,... . Czy jest jakiś inny sposób na stworzenie wyszukiwarki która zwróci rekordy według trafności. Z 3 słowami można sobie jeszcze poradzić, ale gdy użytkownik wpisze np. 5 słów do wyszukania to kombinacja tych słów stworzy sporą liczbę poleceń SQL.
stach
jest takie zapytanie SQL
MATCH .... AGAINST
coprawda nie jest doskonale bo jesli pytana fraza znajduje sie w wiecej niz 50% rzedow pytanej columny zwraca 0.
akubiczek
Zastosuj wagi w zapytaniu, i wynik sortuj na podstawie tych wag. Ma to jeszcze t± zaletę, że możesz na przykład dać wyższ± wagę dla tytuły dokumenty, a niższ± np. do jego tre¶ci. I w ten sposób w jednym zapytaniu SQL stworzysz zaawansowan± wyszukiwarkę z sortowaniem wyników:

  1. ELECT DISTINCT ID, (((Title LIKE '%forum%' OR Title LIKE '%FORUM%') AND (Title LIKE '%php%' OR Title LIKE '%php%'))*8)+(((Contents LIKE '%forum%' OR Contents LIKE '%FORUM%') AND (Contents LIKE '%php%' OR Contents LIKE '%php%'))*4)+(((Title LIKE '%forum%' OR Title LIKE '%FORUM%') OR (Title LIKE '%php%' OR Title LIKE '%php%'))*2)+(((Contents LIKE '%forum%' OR Contents LIKE '%FORUM%') OR (Contents LIKE '%php%' OR Contents LIKE '%php%'))*1) AS W FROM _dDoc WHERE ((Title LIKE '%forum%' OR Title LIKE '%FORUM%') OR (Title LIKE '%php%' OR Title LIKE '%php%') OR (Contents LIKE '%forum%' OR Contents LIKE '%FORUM%') OR (Contents LIKE '%php%' OR Contents LIKE '%php%')) HAVING W>0 ORDER BY W DESC


Jak się przez ten przykład przegryziesz to wszystko będzie jasne. Szukali¶my słów "forum php" w polach Title i Contents (Title ma wyższ± wagę)
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.