Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> zaawansowana wyszukiwarka, jak wyszukiwac by obliczyc trafnosc ...
ElemenT
post
Post #1





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 29.03.2003
Skąd: Warszawa

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


Witam

Mam nastepujacy problem.

Tabela SQLowa z tekstami oraz tabela ze slowami indeksowymi.
Slowa indexowe tworza sie podczas dodawania tekstu do bazy, wywalane sa niepotrzebne znaki oraz slowa nie znaczace nic podczas wyszukiwania (np, a, lub itp), dodatkowo obliczana jest ilosc wystapienia danego slowa w tekscie.

Sprawa wyszukania niby prosta.

Wpisujemy slowo np 'minister' i znajduje mi 30 tekstow posortowanych wg trafnosci (ilosc wystapien w tekscie). Wylistowanie wynikow.
Wszyskto pieknie.

Problem pojawia sie w momencie wpisania do wyszukiwarki 'minister kalisz wyjechal do moskwy'.
Obecnie program mam tak zrobiony ze szuka slowa minister, potem kalisz, podem wyjechal i na koncu moskwy.
I wyswietla wyniki, z tym ze nie wylatuja teksty gdzie np bylo 30 wystapien slowa minister a ani jednego kalisz, wyjechal i moskwy. A tekst w ktorym wszystkie te slowa wystepuja wyskakuje gdzies na koncu.

Zapytanie do bazki robi sie takie :
  1. SELECT cms_ure_searchwords.ile, cms_ure_searchwords.id, cms_ure_dzialy.nazwa, cms_ure_dzialy.wstep, cms_ure_dzialy.kat, cms_ure_dzialy.publikacja
  2. FROM cms_ure_searchwords,cms_ure_dzialy WHERE cms_ure_dzialy.id=cms_ure_searchwords.id AND cms_ure_searchwords.slowa IN ('minister','kalisz','wyjechał','moskwy') GROUP BY cms_ure_searchwords.id ORDER BY cms_ure_searchwords.ile DESC


Wyszukiwarka jest swietna jezeli ktos wyszukuje 1 slowo. Problem jest jak ktos szuka frazy.
Jak byscie zaprojektowali wyszukiwarke reagujaca na frazy, z uzyciem tabeli slow indeksowych i by byla wyliczana trafnosc ?

Ten post edytował ElemenT 13.05.2005, 14:42:16


--------------------
lighttpd 1.4.22 / PHP 5.2.9 / MySQL 5.0.51 at hostname.pl
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 11)
Marcin_m
post
Post #2





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 1.06.2005

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


Myślę że lepiej będzie stworzyć tabele z indexem typu FULLTEXT, następnie wyszukiwać przy pomocy AGAINST i MATCH.
Go to the top of the page
+Quote Post
NuLL
post
Post #3





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

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


Tu się zgadzam - co do trafności - najłatwiej jest to stworzyć na podstawie ilości wystąpień danych slow poprostu smile.gif Taka troche skomplikowana matma..tongue.gif


--------------------
Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
Go to the top of the page
+Quote Post
hwao
post
Post #4


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




Kiedys na forum byl taki watek w ktorym dyskusja byla na temat porownywania stringow i pokazania w ilu procentach sa podobne.

Poszukaj.
Go to the top of the page
+Quote Post
ElemenT
post
Post #5





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 29.03.2003
Skąd: Warszawa

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


dobra poradzilem sobie
wyszukuje pieknie i wstawia % trafnosci smile.gif


--------------------
lighttpd 1.4.22 / PHP 5.2.9 / MySQL 5.0.51 at hostname.pl
Go to the top of the page
+Quote Post
Vengeance
post
Post #6





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

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


To sie podziel :]


--------------------
Go to the top of the page
+Quote Post
ElemenT
post
Post #7





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 29.03.2003
Skąd: Warszawa

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


tak jak napisal marcin
fulltext z pola ktore ma tylko tekst, wywalone tagi html itp.
potem match , against
  1. SELECT MATCH (nazwa,wstep,tresc) AGAINST ('slowo') AS trafnosc
  2. FROM baza WHERE MATCH (nazwa,wstep,tresc) AGAINST ('slowo')


przy sprawdzaniu poprawnosci wyszukiwanych danych zrobilem takie cos
dalo mi to max punkt odniesienia - 100%

potem zaladowanie informacji o szukaniu do bazy szukaj - wlasnie ta trafnosc, w jakich dzialach sie szuka, czego sie szuka itp.
przeladowanie stronki

i zapytanie
wyliczenie procentu
  1. <?php
  2.  
  3. $procent = round((round($row[trafnosc],5)/$search[trafnosc])*100,1);
  4. ?>


tak po krotce

w dzialaniu : wyszukiwarka


--------------------
lighttpd 1.4.22 / PHP 5.2.9 / MySQL 5.0.51 at hostname.pl
Go to the top of the page
+Quote Post
paniwladca
post
Post #8





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 9.12.2005

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


moglbys to jeszcze raz wytlumaczyc jak glupkowi biggrin.gif

bo uzywajac match against w swojej wyszukiwarce raz wyszukuje mi frazy raz nie
od czego jest to uwarunkowane bo z tego co czytalem moje rozumowanie na temat tej funkcji jest takie ze porownuje ona slowa w kolumnach z podana fraza. dobrze wszystko ok tylko dlaczego raz wyszukuje raz nie wyszukuje mi wskazanych wyrazow jesli sa one w bazie questionmark.gif
robie tym oto twoim sposobem
  1. <?php
  2.  
  3. $query="
  4. SELECT id_str, opis, MATCH (title,opis,url) AGAINST ('$slowo') 
  5. AS score 
  6. FROM strony 
  7. WHERE MATCH (title,opis,url) AGAINST('$slowo') 
  8. ORDER BY score";
  9.  
  10. ?>


i jeszcze jedno
  1. <?php
  2.  
  3. $procent = round((round($row[trafnosc],5)/$search[trafnosc])*100,1);
  4.  
  5. ?>


nie rozumie skad masz te dwa rozne elemnty tablic z trafnoscia questionmark.gif
moglbys mi to wyjasnic


dzieki i pozdrawiam aarambo.gif


--------------------
Go to the top of the page
+Quote Post
ElemenT
post
Post #9





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 29.03.2003
Skąd: Warszawa

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


jezeli wynikow jest wiecej niz polowa rekordow dla bazy to nie znajduje nic
ma to na celu zmniejszenie obciazenia bazy

tak samo nie znajdzie ci nic jak szukasz w bazie ktora ma 5 rekordow

wtedy mozesz uzyc funkcji sql np like (%slowo%)

co do samej funkcji
  1. <?php
  2.  
  3. $procent =  round((round($row[trafnosc],5)/$search[trafnosc])*100,1);
  4.  
  5. ?>



$row[trafnosc] - to trafnosc wyrzuconego rekordu w pkt
$search[trafnosc] - to najwieksza trafnosc jako pkt odniesienia

robisz iloczyn i obliczasz procent

Ten post edytował ElemenT 13.12.2005, 14:05:34


--------------------
lighttpd 1.4.22 / PHP 5.2.9 / MySQL 5.0.51 at hostname.pl
Go to the top of the page
+Quote Post
matid
post
Post #10





Grupa: Zarejestrowani
Postów: 362
Pomógł: 0
Dołączył: 18.02.2004
Skąd: Knurów

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


Cytat(ElemenT @ 2005-12-13 15:03:13)
$row[trafnosc] - to trafnosc wyrzuconego rekordu w pkt
$search[trafnosc] - to najwieksza trafnosc jako pkt odniesienia

robisz iloczyn i obliczasz procent

Najwyższa trafność nie jest koniecznie trafnością 100%.
Może być taka sytuacja, że najlepsze tranfienie będzie miało tylko 50% zgodności z frazą wyszukiwaną...
Go to the top of the page
+Quote Post
SongoQ
post
Post #11





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


Cytat
jezeli wynikow jest wiecej niz polowa rekordow dla bazy to nie znajduje nic
ma to na celu zmniejszenie obciazenia bazy

A nie lepiej jest wykluczyc podzapytaniem rekordy w ktorych nie ma pojedynczych slow? A dopiero wtedy szukanie frazy.

Co do wydajnosci bedzie lepsze niz przeszukiwanie calej bazki i szukajac okreslonej frazy. Odnosnie pierszego zapytania sproboj to troche ulepszyc bo z tym IN to CI nie przejdzie, prosty test wstaw kilka milionow rekordow i wpisz np 20 slow do szukania.


--------------------
Go to the top of the page
+Quote Post
MStaniszczak
post
Post #12





Grupa: Zarejestrowani
Postów: 71
Pomógł: 1
Dołączył: 3.10.2004

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


A jako że bark tu informacji o tym że to ma być MySQL, to ja polecam PostgreSQL-a + TSearch2. Dzięki niemu można nawet wyszukiwać w bazie słów "podobnych" do szukanego (np. w innej postaci).

Tu takie tam wprowadzenie:
http://www.sai.msu.su/~megera/postgres/gis...h-V2-intro.html

Pozdrawiam
Marcin Staniszczak
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 17:26