Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zaawansowana wyszukiwarka
Forum PHP.pl > Forum > PHP > Pro > Archiwum Pro
ElemenT
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 ?
Marcin_m
Myślę że lepiej będzie stworzyć tabele z indexem typu FULLTEXT, następnie wyszukiwać przy pomocy AGAINST i MATCH.
NuLL
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
hwao
Kiedys na forum byl taki watek w ktorym dyskusja byla na temat porownywania stringow i pokazania w ilu procentach sa podobne.

Poszukaj.
ElemenT
dobra poradzilem sobie
wyszukuje pieknie i wstawia % trafnosci smile.gif
Vengeance
To sie podziel :]
ElemenT
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
paniwladca
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
ElemenT
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
matid
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ą...
SongoQ
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.
MStaniszczak
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
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-2024 Invision Power Services, Inc.