![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 184 Pomógł: 14 Dołączył: 21.12.2010 Ostrzeżenie: (0%) ![]() ![]() |
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.
Jak zmodyfikować to zapytanie? Z góry dzięki Ten post edytował kill15 2.04.2012, 13:51:37 |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 358 Pomógł: 78 Dołączył: 4.11.2008 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 184 Pomógł: 14 Dołączył: 21.12.2010 Ostrzeżenie: (0%) ![]() ![]() |
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 |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 358 Pomógł: 78 Dołączył: 4.11.2008 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
oj faktycznie, pisząc table.* chodziło mi o nazwę tabeli - w Twoim przypadku `posty`
Ten post edytował zordon 2.04.2012, 15:08:38 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 184 Pomógł: 14 Dołączył: 21.12.2010 Ostrzeżenie: (0%) ![]() ![]() |
Teraz wykonuje się zapytanie ale zwraca pusty wynik tzn nie znajduje nic - też oczywiście próba z poprawnym słowem
Ten post edytował kill15 2.04.2012, 15:16:35 |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 358 Pomógł: 78 Dołączył: 4.11.2008 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Wydaje mi się, że chyba już wiem co chcesz zrobić tylko nie wiem czy Ty na pewno wiesz
![]() 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. |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 184 Pomógł: 14 Dołączył: 21.12.2010 Ostrzeżenie: (0%) ![]() ![]() |
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 Ten post edytował kill15 2.04.2012, 18:45:05 |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 511 Pomógł: 143 Dołączył: 13.03.2010 Skąd: Jasło Ostrzeżenie: (0%) ![]() ![]() |
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) Ten post edytował jaslanin 3.04.2012, 04:29:25 -------------------- Good luck and happy PHP'ing
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 184 Pomógł: 14 Dołączył: 21.12.2010 Ostrzeżenie: (0%) ![]() ![]() |
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 Ten post edytował kill15 3.04.2012, 18:12:31 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.08.2025 - 12:16 |