He he, az mi sie milo zrobilo ]Unknown column 'slowo' in 'where clause'[/code] czyli, nieznana kolumna "slowo" - no bo ma byc "slowa" I o dziwo nie jest to moj blad tylko przy przepisywaniu pomyliles - zdarza sieDemerzel pisze:Na razie pozostaje poczekać na komentarz od kolegi Stawi.
Co nie zmienia faktu ze dziala to zle - znajduje wprawdzie strony ktore spelniaja dowolnie slowo kluczowe, ale wskaznik hits jest zawsze rowny 1. Wynika to z mojej blednej interpretacji bazy. Myslalem ze zrobiles to w jednej tabelce (co mozna jednak nie jest do konca optymalne ze wzgledu na ciaglosc powtazania adrsu strony.
Jakby baza byla tak ze wpisujesz:
Kod: Zaznacz cały
[url]www.strona1.pl[/url] | slowo
[url]www.strona1.pl[/url] | kluczowe
[url]www.strona1.pl[/url] | debian
[url]www.smieci.com[/url] | costam
[url]www.smieci.com[/url] | dwa wyrazy
[url]www.smieci.com[/url] | debian
To co dziala (napewno, bo testowane) na obecnej bazie:
Kod: Zaznacz cały
$hits = '0';
foreach ($szukane as $slowo) {
$hits .= "+(slowa LIKE '%{$slowo}%')";
}
$hits = "($hits)/".count($szukane)." * 100"; // Bedzie podawac w procentach "trafnosc" jako "ilosc spelnionych" na ilosc wszystkich podanych
$sql = "
SELECT adres, $hits as hits FROM adres
HAVING hits > 0 ORDER BY hits DESC, adres ASC
";
Kod: Zaznacz cały
Tabela strony:
id_strony int auto_increment, // numerek strony pokolei 1, 2, 3 itd..
adres_strony varchar(255) albo text, // faktyczny adres strony
ilosc_slow int, // moze sie przydac - ile stona ma wpisanych slow kluczowych
Indexy: PK na id_strony.
Tabela slowa:
id_slowa int auto_increment, // numerek kolejny slowa
slowo char(200), // wiecej raczej nie trezba, a dzieki char bedzie szybkie bardzo
ilosc_uzyc int, // moze sie przydac - na ilu stronch wystepuje dane slowo
Indexy: PK na id_slowa, unique na slowo.
Tabela krosownica:
id_strony int,
id_slowa int,
Indexy: PK na id_strony i id_slowa (jako jeden index).
Jak nie bedziesz mogl sobie poradzic z implementacja tego (co jednak bardzo polecam zmeczyc samemu) to moge ci pomuc. Narazie "na chamowo" mozesz robic w kilku zapytaniach, potem mozna to przepisac na jedno z odpowiednimi JOIN`ami albo sub-queries.
Rozne teorie chodza po sieci co jest lepsze join czy sub-q.. jednak ja osobiscie jestem zwolennikiem JOINow. Glownie z przyzwyczajenia bo nie bylo sub-q w poprzednich wersjach mysql.
PS: Dalej brak odzewu (lub nie doczytalem?) o indeksowaniu przez wbudowane fulltext-search. To potrafi calkiem sporo, jednak szczerze musze powiedziec ze nie wiem jak z wydajnoscia. Ogolnie to jest tak ze masz jedna tabelke (dokladnie taka jak masz teraz) i nadajesz index na kolumne "slowa", a potem w zapytaniu dodajesz tylko "MATCH() ... AGAINST". Nie bede przepisywac manuala zawartego w oficjalnej dokumentacji, bo to nie ma sensu - w razie pytan wal jak w dzwon
//EDIT: poprawki logiczno stylistyczne )