Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL]Wyszukiwarka, błędy w wpisywaniu
Forum PHP.pl > Forum > Przedszkole
kill15
Witam.
Chciałbym zrobić wyszukiwarkę ale radzącą sobie z błędami w pisowni.
Mój problem polega na tym że nie mam pojęcia jak użyć SOUNDEX z LIKE
Załóżmy że w bazie mam tabele posty która ma kolumne tytul.
Dodamy tam rekord o wartości pola tytul: fajna fajniejsza i najfajniejsza kiełbasa u nas.

Teraz użytkownik wpisuje w wyszukiwarce np kiełbsa i chciałbym żeby mimo to wyszukało mu ten odpowiedni rekord.

Tzn ma wyszukać np post o tytule: fajna fajniejsza i najfajniejsza kiełbasa u nas.
Kiedy w wyszukiwarce wpisze użytkownik np: kiełbsa

Poniższe zapytanie działa jedynie gdy w polu tytul jest tylko: kiełbasa.
  1. SELECT * FROM posty WHERE soundex(tytul) = SOUNDEX("kiełbsa");


Jak zmodyfikować to zapytanie?

Z góry dzięki
zordon
Spróbuj coś takiego, nie wierzyłem że będzie działać więc dobrze przetestuj smile.gif

  1. SELECT soundex(col), TABLE.*, concat("%", soundex('searchtext'), "%") FROM `table` WHERE
  2. soundex(col) LIKE concat("%", soundex('searchtext'), "%")
kill15
Niestety nie działa a wpisałem poprawnie nawet słowo które ma być szukane

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TABLE.*, concat("%", soundex('kiełbasa'), "%") FROM forum_post WHERE soundex(na' at line 1
zordon
oj faktycznie, pisząc table.* chodziło mi o nazwę tabeli - w Twoim przypadku `posty`
kill15
Teraz wykonuje się zapytanie ale zwraca pusty wynik tzn nie znajduje nic - też oczywiście próba z poprawnym słowem
zordon
Wydaje mi się, że chyba już wiem co chcesz zrobić tylko nie wiem czy Ty na pewno wiesz smile.gif
Przede wszystkim zrób sobie zapytanie w stylu "SELECT soundex(col) FROM `table`" żebyś wiedział CZYM jest soundex

Ja na szybko zrobiłem test : w bazie miałem rekordy:
admin
admni
adminx

W moim zapytaniu gdzie szukam tekstu 'admin' wyszukał mi słowa admin i admni, dlatego że soundex dla tych słów to "A350"
Soundex dla słowa adminx to "A352" więc go nie wypisał, bo i wypisać nie mógł

Podejrzewam, że chcesz zrobić zapytanie szukające soundexa typu "A35%" - tylko pytanie czy na pewno o to Ci chodzi - w tym konkretnym przypadku znajdzie również adminx, ale w innych przypadków pewnie również masę śmieci, które nie powinny być dopasowane.
kill15
nie o to mi chodzi.
w tabeli name mam zdanie nie koniecznie pojedyńczy wyraz tzn np: Ala ma kota.
jest wyszukiwarka w której użytkownik wpisze: ma kota.
I chcę aby pobrało mi właśnie wszystkie rekordy których zawartośc pola name będzie zawierało: ma kota.
Tylko właśnie jest jedno ale tj. chcę żeby np gdy użytkownik wpisze coś z literówką to żeby i tak znalazło tzn np zamiast: ma kota wpisze: ma koa


PS: wpisz sobie np w google: ala ma kta to i tak znajdzie ci wyniki dla Ala ma kota - o takie coś mi chodzi

PS2: Co do tego:
Cytat
soundex(col) LIKE concat("%", soundex('searchtext'), "%")

to nie ma być prawa równe bo np:
K120 = kiełbasa
D2323212 = dasdasd kiełbasa

jaslanin
Samą bazą MySQL (domyślam się po błędzie) tego nie zrealizujesz, w pewnym stopniu obsługuje to baza danych MS SQL FULLTEXT (morfologia) z zainstalowanym odpowiednim słownikiem (nie znam się zbytnio na tej bazie danych więc nie wiem jak to się sprawdza):
http://msdn.microsoft.com/en-us/library/ms...(v=SQL.90).aspx

Potrzebujesz natomiast:
http://blog.thedigitals.pl/wdrozenie-sphinx-search/
lub
http://lucene.apache.org/solr/

Zwróć uwagę na zagadnienia:

morphology ? uruchomienia automatycznego wyłapywania odmiany wyrazów dla języka angielskiego. Poza językiem angielskim sphinx wspiera za pomocą moduły libstemmer kilka innych języków, niestety nie Polski
wordforms ? Wygenerowany plik ze słownikie wyrazów, wykorzystaliśmy do zaimplementowania odmiany morfologicznej dla języka polskiego (przykładowy plik załączony na końcu artykułu, a w komentarzach instrukcja jak stworzyć własny)
http://blog.thedigitals.pl/wdrozenie-sphinx-search/

Przetwarzanie języka naturalnego - natural language processing (jeżeli interesuje Cię to jak to robi google)
kill15
A gdybym tak zrobił że np wpisuje kiełbasa co daje k120(jako soundex) potem:
rozbić to na:
12 - kiełbasa jest w środku lub na końcu
k12 - kiełbasa jest na początku ale coś dalej jest jeszcze w tytule
k120 - jest w tytule tylko kielbasa
i jeżeli w bazie jest D2323212 = dasdasd kiełbasa - to znalazłoby 12 - końcowe 12 to jest ta nasza kiełbasa(0 jest tylko wtedy gdy ciąg znaków nie daje nam 4 znaków tzn np zamiast k12 daje k120 - dlatego 12 w tym wypadku)
no to mógłby zrobić zapytanie

SELECT * FROM test WHERE soundex(tytul) LIKE %"12"% OR soundex(tytul) LIKE %"k12"% AND soundex(tytul) LIKE %"xxxx"% OR LIKE itd
xxxx - soundex z drugiego szukanego wyrazu

Troche jeszcze przbliże o co chodzi:
użytkownik wpisuje w szukajke np nie kiełbasa a np: kiełbasa ser szynka.
Podzieliłbym to na:
kiełbasa
ser
szynka
potem z każdemu zrobił shoudex.
co w przypadku kiełbasy dało by k120.
potem rozważyłbym 2 pozostałe możliwości tj. z k120 miałbym: k12, k120, 12 co byłoby w tablicach.
tak samo z każdym następnym wyrazem.
potem pętlą skleiłbym zapytanie które wyglądało by mnie więcej jak już pokazywałem wyżej ale jesze raz:

SELECT **FROM test WHERE soundex(tytul) LIKE %"x"% OR soundex(tytul) LIKE %"y"% ... AND soundex(tytul) LIKE %"z"% OR LIKE itd
x - pierwsza 'niepełna' możliwość tzn np k12 - pierwszego wyrazu
y - druga 'niepełna' możliwość tzn np k12 - pierwszego wyrazu
z - pierwsza 'niepełna' możliwość tzn np d15 - drugiego wyrazu
AND byłoby o jedno więcej z każdym przykładem no i jeszcze byłby tam "pełne wyrazy"

No i na końcu sprawdzałbym wszystkie wyniki które poprało po stronie php tzn np 12 może wystąpić w zupełnie innym tytule nie związanym z tym co szuka user dlatego po stronie php sprawdzałbym jeszcze raz rozbijąc już wynik na osobne wyrazy tak więc jeśli:
D2323212 = dasdasd kiełbasa
i znalazło by mi to w bazie(dlatego że na końcu jest 12 - czyli kiełbasa[k120] bez dopisanego zera i litery) to w php rozbiłbym to na:
D23232 = dasdasd
k120 = kiełbasa
i sprawdził czy faktycznie jest tu ta kiełbasa jeśli np okzało by się że jest nie k120 a np d120 to te wynik bym kasował.

I pytanie: Czy to by nie było zbyt wolne rozwiązanie?


PS: wiem że shoundex na polskie znaki nie działa i np kiełbasa i kielbasa to całkiem inne znaki więc po prostu miałbym jeszcze jedną kolumne w której byłby tytuł bez polskich znaków
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.