Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: wyszukiwanie pełnotekstowe
Forum PHP.pl > Forum > Bazy danych > MySQL
di@blo
Mam zapytanie pełnotekstowe jednak nic nie zwraca

  1. .
  2. mysql_query("SELECT * FROM sprzet WHERE match(nazwa, opis, firma) against('$szuk') ") OR die(mysql_error());
  3. .


Powie mi ktos czy jest to dobrze zbudowane? pierwszy raz uzywam wyszukiwania pełnotekstowego wiec nie wiem czy dobrze sie do tego zabieram. Chce przeszukac 3 pola (nazwa, opis, firma) w bazie pod katem jednego slowa

i tak przy okazji co zrobic by przy wyswietlaniu wynikow z bazy wyswietal mi alfabetycznie ale z uwzglednieniem polski znakow bo teraz a mi znaki a;cznie ale znaki polskie sa po "z"

z gory dzieki
nevt
składnia jest właściwa.
czy tabela `sprzet` jest typu MyISAM ?
czy na kolumnach `nazwa`, `opis`, `firma` msz założony index FULLTEXT ?

a co do sortowania ... jakie porównywanie (collation) masz dla bazy / tabeli / pola po którym sortujesz? jakie masz kodowanie ogonków w bazie ?
di@blo
Baza typu MyISAM
index FULLTEXT tez jest

metody porownywania napisow to latin2_general_ci
a co do kodowania ogonkow to nie wiem jakie i jak to sprawdzic
nevt
wstaw przed mysql_query
  1. <?php
  2. $sql = "SELECT * FROM sprzet WHERE match(nazwa, opis, firma) against('$szuk') ";
  3. echo $sql;
  4. ?>

i pokaż mi co się wyświetla ...

a co do kodowania - skoro dane z bazy poprawnie wyświetlają się na jakiejś stronce, to znaczy że są w takim samym kodowaniu jak ta stronka - sprawdź nagłowki i daj znać ...
di@blo
wyswietla sie SELECT * FROM sprzet WHERE match(nazwa, opis, firma) against('dobry')
a swoja droga fajna sztuczka Przyda sie smile.gif

mi nie chodzi o wyswietlanie polskich znakow tylko o to zeby przy sortowaniu np "ł" bylo po "l" a nie po "z" chyba ze to ma jakis zwiazek
nevt
na pewno w tych polach masz wpis ze słowem dobry questionmark.gif
pokaż strukture tej tabeli, tzn. rezultat:
  1. SHOW CREATE TABLE sprzet


co do drugiego - skoro widzisz, że źle ci sortuje - to znaczy że jakoś to wyświetlasz. to weź w tym okienku "pogląd źródła" i popatrz w nagłówkach HTML jakie jest kodowanie stronki i będziesz wiedział jak kodowane są dane w bazie... a żeby ci pomóc z sortowaniem musze wiedzieć jak są kodowane dane ...
di@blo
Słowo 'dobry' napewno jest w bazie. jak wyszukuje nazwa LIKE $szuk to ladnie znajduje a po wyszukiwaniu pelnotekstowym juz nie

CREATE TABLE `sprzet` (
`id` int(11) NOT NULL auto_increment,
`nazwa` varchar(40) NOT NULL,
`kategoria` int(2) NOT NULL default '0',
`podkategoria` int(11) default '0',
`cena` float(6,2) NOT NULL default '0.00',
`kolor` text,
`rozmiar` text,
`firma` text,
`wypozyczalnia` int(11) NOT NULL default '0',
`opis` text,
`foto` text,
`ilosc` int(3) NOT NULL default '0',
`stan` int(3) unsigned zerofill default NULL,
KEY `id` (`id`),
FULLTEXT KEY `search` (`nazwa`,`opis`,`firma`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin2

charset=ISO-8859-2

// Dodaj bbcode.
// ~webdicepl
phpion
Kiedyś czytałem na mysql.com, że przy niewielkiej ilości rekordów wyszukiwanie pełnotekstowe nie zwraca oczekiwanych wyników (konkretnie nie zwraca nic). Nie będę teraz tłumaczył dlaczego bo po prostu nie pamiętam, a głupot nie chcę pisać. Nie jestem w stanie teraz podać konrketnego źródła, ale również miałem taki problem jak Ty i szukałem pomocy.

// Edit:
http://forumphp.nq.pl/index.php?showtopic=48504
tutaj miałem problem, z krótkimi wyrazami. Nie pamiętam czy w końcu go rozwiązałem czy nie, ale może to będzie przyczyną. 'dobry' ma 5 znaków więc może w tym leży problem.
di@blo
Tez sie nad tym zastanawialem ale przy 12 znakach to samo
MMPrime
Podaj także dane jakie występują w tej bazie.
Słowo dobre nie może być zbyt popularne też by zostało znalezione.
Jak i słowo szukane nie może być mniejsze jak 4 znaki(zależnie od ustawień MySQL)
phpion
Cytat(MMPrime @ 24.04.2008, 20:46:06 ) *
...
Słowo dobre nie może być zbyt popularne też by zostało znalezione.
...

Możliwe, że właśnie o to chodziło. Przy małej liczbie rekordów występowanie danego słowa będzie procentowo większe, niż przy wiekszej liczbie rekordów.
di@blo
calosc jest dopiero w budowie dlatego narazie jest tylko 1 rekord ktory dodalem dla celow testowych
W polu nazwa mam 'lyzwy' w polu opis 'dobry sprzet do lyzwiarstwa figurowego' a w polu firma nie ma nic zawartosci pozostaych chyba jest nieistotna wiec nie podaje
nevt
a spróbuj wprowadzić coś do pola `firma` ... nie jestem pewien, ale możliwe, że gdy w indeksie założonym na kilku polach nie ma wszystkich danych, to dany wiersz nie zostaje w ogóle zindeksowany (w normalnych jednopolowych indeksach też nie ma informacji o pustych - NULL - polach)
artega
Słowa w polach z indeksem FULLTEXT są indeksowane jeżeli spełniają minimalną i maksymalną długość oraz nie znajdują się domyślnie na tej liście. Jeżeli z jakiś względów nie pasuje nam domyślna wartość ft_min_word_len lub ft_max_word_len (długość znaków) można dodać do pliku my.ini
Kod
[mysqld]
ft_min_word_len = 3
ft_max_word_len = 10

Po takich zmianach reset serwera jest konieczny a indeks musi zostać "odświeżony".
  1. REPAIR TABLE tablica QUICK

Słowa, które są popularne w wierszach zostaną zignorowane nawet jeżeli spełniają wymagane kryteria.
Cytat
i tak przy okazji co zrobic by przy wyswietlaniu wynikow z bazy wyswietal mi alfabetycznie ale z uwzglednieniem polski znakow bo teraz a mi znaki a;cznie ale znaki polskie sa po "z"

Upewnij się, że character_set_database i collation_database za pomocą zapytania
  1. SHOW VARIABLES LIKE '%database%'

są ustatione odpowiednio na latin2, latin2_general_ci
Hacker
Cytat
MySQL does not index any words less than or equal to 3 characters in length, nor does it index any words that appear in more than 50% of the rows. This means that if your table contains 2 or less rows, a search on a FULLTEXT index will never return anything.


Dodaj jeszcze kilka rekordow i powinno zadziałać ;]
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.