Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Opis jak zrobić wyszukiwarkę z wyświetlaniem trafności
spenalzo
post
Post #1





Grupa: Zarejestrowani
Postów: 2 064
Pomógł: 1
Dołączył: 22.01.2003
Skąd: Poznań

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


Ponieważ zaciekawiło mnie to co napisał Dragossani w <b>tym</b>wątku, postudiowałem manual do MySQLa i oto co z tego wynikło - wyszukiwarkę z określaniem trafności można zrobić jednym zapytaniem :-)

<i><b>Jak zrobić wyszukiwarkę?</b></i>

Zacznijmy od początku:
zakładamy, że chcemy zrobić własną wyszukiwarkę do forum phpBB.
Na początku dodajemy do istniejącej tabeli prefix_posts_text jedno pole:
  1. ALTER TABLE prefix_posts_text ADD FULLTEXT (post_subject,post_text)

Jeżeli wszystko przebiegło pomyslne to możemy zająć się stworzeniem zapytania formularza wyszukiwania.
Do wyszukiwania używamy funkcji mysqla
  1. MATCH(col1,col2,..) AGAINST ('szukany_tekst')

która zwraca wyniki trafności wyszukiwania.

Teraz zróbmy z tego zapytanie:
  1. <?php
  2. $q=mysql_query(&#092;"SELECT MATCH(post_subject,post_text) AGAINST ('\".$_POST[\"f\"].\"') AS stopien, post_text, post_ID,post_subject FROM prefix_posts_text ORDER B
    Y
  3. stopien DESC&#092;") or die(mysql_error());?>

zakładając, że w zmiennej $_POST["f"] mamy szukane wyrażenie.

Jeżeli zapytanie działa, to jedziemy dalej, jeżeli nie to szukamy rozwiązania w manualu.
Teraz przypisujemy odpowiednie wartości do tablic:
  1. <?php
  2.  for($i=0; $i<mysql_num_rows($q); $i++)
  3.  {
  4. if($t[&#092;"stopien\"]>0)
  5. {
  6.  $stopnie[]=$t[&#092;"stopien\"];
  7.  $IDs[]=$t[&#092;"post_ID\"];
  8.  $sub[]=$t[&#092;"post_subject\"];
  9.  $post[]=$t[&#092;"post_text\"];
  10. }
  11.  }
  12. ?>


Teraz przygotujmy wyświetlanie wyników.
Ponieważ zwracane wyniki trafności nie są za każdym razem identyczne, wyszukujemy najwiekszą wartość:
  1. <?php
  2.  $max=$stopnie[@array_search(@max($stopnie),$stopnie)];
  3. ?>


Teraz (w pętli) z proporcji obliczamy procenty trafności każdego zapytania, i wyświetlamy dane:
  1. <?php
  2. for($i=0; $i<count($stopnie); $i++)
  3. {
  4.  $proc=floor(($stopnie[$i]*100)/$max);
  5.  // instrukcje wyświetlające
  6. }
  7. ?>


I wyszukiwarka gotowa :-)
:arrow: <b>Przykład</b>
Powyżej można zobaczyć przykład działania wyszukiwarki podpiętej pod phpBB.

<i><b>Metoda działania wyszukiwarki.</b></i>
(na podstawie moich obserwacji)
Trafność zostaje wyliczona w następujący sposób - jest liczona ilosc szukanych słów i podstawiona do ilości ogólnej wyrazów w ciągu i na podstawie tego zostaje zwrócona wartość. Czyli mówiąc prościej - na górze strony wyszukiwania (największa trafność) będą posty z najwyższym stosunkiem wyrazów do szukanego ciągu, czyli np. najkrótsze posty z największą ilością szukanych słów.
Ograniczeniem jest długość ciągu - wyszukiwarka działa dopiero przy szukanych wyrażeniach dłuższych niż 3 znaki.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
msulik
post
Post #2





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 31.03.2002
Skąd: Toruń

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


Może coś zrobiłem nie tak, ale mnie się to nie podoba :|

Po pierwsze:
Cytat
(...) na górze strony wyszukiwania (największa trafność) będą posty z najwyższym stosunkiem wyrazów do szukanego ciągu, czyli np. najkrótsze posty z największą ilością szukanych słów

Hmm... jakoś nie mogę znaleźć sensu takiego kryterium oceniania trafności. <update>Patrz niżej ten post.</update>


Po drugie, po wykonaniu "ALTER TABLE" ponad dwukrotnie wzrosła objętość tabeli (!). Dyskwalifikacja, nie wiem ile zajmuje u Was np. baza phpBB, ale wydaje mi się, że w większysch serwisach - dużo. Pole FULLTEXT staje się bowiem indeksem i kopiuje pole z tekstem każdego rekordu, a więc, jeśli rozpatrywana tabela jest główną tabelą serwisu, to praktycznie objętość bazy wzrasta dwukrotnie.


Zastanawiam się cały czas nad skuteczną wyszukiwarką, np. taką, która opiera się na osobnej tabeli słów kluczowych (relacja {id_słowa, słowo}), generowanych z dodawanych tekstów oraz na relacji {id_słowa, id_tekstu, ilość_wystąpień}. Przy obliczaniu trafności, można połączyć dwa parametry: ilość wystąpień słowa w danym tekście (obliczana jednorazowo przy dodawaniu/edycji tekstu) oraz ilość dopasowanych słów, tzn. ile spośród wpisanych w wyszukiwarce słów, znalazło się w tekście. Nie wiem tylko, jak to połączyć - może sumę "ilości wystąpień"? Albo może średnią z "ilości wystąpień" (tzn. "suma ilości wystąpień" podzielić przez liczbę słów wpisanych w wyszukiwarce)? Tekst z najwyższą średnią (lub sumą, lub innym wyliczonym parametrem) otrzymuje 100%, a następne, odpowiednio mniej. Muszę dokonać obliczeń i wtedy zastanowić się, jaki wzór opracować, może jakaś średnia arytmetyczna ważona czy cuś...

Do tego dochodzi jeszcze ta nieszczęsna odmiana rzeczowników przez przypadki...

Korzyści z fulltextu są nieocenione, ale ten wzrost objętości...

<dodatek date="2003-09-01" time="09:51">
Poza tym nie można podać własnej definicji termu (to określenie pojawia się w teoretycznych opracowaniach dotyczących tego tematu), na przykład term zawierający myślnik zostanie potraktowany jako dwa termy, z których drugi jest termem "zabronionym", czyli takim, który nie może wystąpić w dokumencie.

Poszperałem trochę w sieci i znalazłem kilka prac poświęconych tematowi "ważenia" dokumentów. Już w dokumentaji mysql'a można wyczytać, na czym polega "ważenie" termu kluczowego - im więcej dokumentów, w których ten termu występuje, tym bardziej term traci na wadze. Chodzi o to, żeby wpisując rzadko występujące termy, otrzymać dokument, który zawiera największe jego natężenie. Wzór na wagę termu w dokumencie uwzględnia ilość wystąpień termu w dokumencie ©, ilość dokumentów zawierających term (Dt) oraz ilość wszystkich dokumentów w archiwum (N) i logarytmicznie rośnie wraz ze wzrostem liczby dokumentów w archiwum oraz maleje wraz ze wzrostem liczby dokumentów zawierających term. Ufff (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
waga_termu_w_dokumencie = C * log (N / Dt)
Tylko nie wiem, dlaczego we wzorze pojawia się logarytm :| Logarytm jest funkcją rosnącą wolniej niż funkcja liniowa. Przy dużych argumentach różnice wartości są niewielkie. Poszperam w sieci jeszcze o tym, może trzeba trochę pogrzebać w statystyce matematycznej (IMG:http://forum.php.pl/style_emoticons/default/angrysmiley.gif)
</dodatek>
Go to the top of the page
+Quote Post

Posty w temacie


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: 3.10.2025 - 06:44