Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Inteligentne wyszukiwanie
Forum PHP.pl > Forum > PHP
slash^
Witam

Zaczalem pisac zaawansowana wyszukiwarke do sklepu internetowego, napotkalem jednak nastepujacy problem:
co zrobic jezeli uzytkownik w wyszukiwanej frazie zrobi literowke??

tzn. mam sklep internetowy i wyszukiwarke typu "wpisz slowo", skrypt przeszukuje baze danych i wyswietla znalezione rzeczy i teraz wszystko jest super jezeli wpisze np. laptop to znajduje laptop xxx, laptop xyz, abc laptop itp. ale co zrobic jezeli ktos omylkowo wpisze "laotop" - literowka przy szybkim pisaniu o blisko p? wyskakuje ze nic nie znaleziono - problem jest niby nikly gdyz latwo to wypatrzyc, ale co jezeli np. ktos szuka po nazwie firmy, ktora to tylko slyszal a nie potrafi jej dokladnie przeliterowac? zamiast coca-cola wpisze koka-kola??

poszukuje jakiegos rozwiazania, ktore mnie naprowadzi na wlasciwe rozwiazanie tego problemu, czy ktos sie juz z czyms takim spotkal? jak to zostalo rozwiazane?

Znalazlem tylko cos w stylu takim:
  1. SELECT *, MATCH (nazwa) AGAINST ('abc') AS cnt FROM produkt WHERE MATCH (nazwa) AGAINST ('abc') ORDER BY cnt DESC


...ale to kompletnie nie to o co mi chodzi smile.gif

pozdrawiam
glorification
to trywialne co pisze ale im bardziej zasady beda uogólnione tym rezultat bedzie mniej wlasciwy do teg co szukasz ... takie cos jak piszesz robi sie miedzy innymi w javascript , popatrz sobie na przyklady autouzupełniania stosowane przez google ... To zaawansowana rzecz, wyamaga uzycia ajaxu i slownika z wyrazami ... Moim zdaniem lepiej pojsc na latwizne i przy rezultacie wyszukiwania rownym zero dodac cos w stylu 'sprawdz czy podana fraza zostala poprawinie wpisana'. Naprawa bledów przy wpisywaniu to po prostu duzo roboty a i tak nie obejmi
sz skryptem wszystkich mozliwych bledów, pomnóż sobie dodatkowo liczbe roboty pr
ez 
ilość specyficznych znaków jakie wystepuja w jezyku polskim ... 
poza tym czlowiek szukajac za pomoca przegladarki oczekuje scislych rezultatow ... jak chcesz cos takiego budowac to musisz dopisac jeszcze skrypt ktory ulozy 
ezultaty od najbardziej scislych do najmniej , a co jezeli ten najbardziej scisl
 jest bledny 
wodniesienie tego czego uzytkownik oczekiwal questionmark.gif zaczyna sie szukanie po podstronach z rezultatami ... szkoda czasu jak dla mnie ...

g.
seaquest
Po 1. Poczytaj trochę o Lucene i jego implementacji w PHP (Zend_Search_Lucene). Całkiem niezłe rozwiązanie jeśli chodzi o trafność wynikow.

Po 2. Co do samego problemu, to jeśli masz do dyspozycji słownik to możesz napisać algorytm, który wykorzystuje np similar_text" title="Zobacz w manualu PHP" target="_manual.

Poza tym możesz jeszcze poczytać o: http://pl.wikipedia.org/wiki/Odległość_Hamminga i http://pl.wikipedia.org/wiki/Odległość_Levenshteina
slash^
Dzieki to powinno wystarczyc.
Teraz tylko pytanie jak zrobic najprosciej similar_text w mysql?questionmark.gif
seaquest
Wydaje mi się, że lepiej i szybciej będzie to działać w PHP.

Słownik polskich wyrazów możesz pobrać tutaj: http://www.kurnik.pl/slownik/

Musisz go sobie tylko jakoś sparsować i zserializować tak, żeby wyszukiwanie było bardzo szybkie.

Wydaje mi się, że w Twoim przypadku najlepiej pogrupować wyrazy po ilości liter, a następnie jak dostaniesz jakieś słowo, to dołączać taki plik, żeby ilość liter była taka sama. Później liczysz odległość Hamminga dla każdego ze słów i jeśli żadna nie równa się 0 (słowo nie istnieje w słowniku), to bierzesz słowo, które najbardziej pasuje i wyszukujesz w bazie po jednym i drugim.

Jednak zastanawiam się teraz, czy nie powinieneś jakoś inaczej liczyć odległości między słowami dla słowa laptop np: laotop i labtop będą miały taką samą odległość, a "o" jest bliżej "p". Więc może by stworzyć tablicę z odległościami liter od siebie i np jeśli algorytm zwróci Ci na podstawie podanego laotop: [laptop, labtop] to sprawdzasz, która litera jest bliżej "o" na klawiaturze i wybierasz lepsze słowo do wyszukiwania, czyli laptop.

Mam nadzieję, że wystarczająco jasno to opisałem.
slash^
Dzieki az takiego zaawansowanego skryptu nie potrzebuje.
Wystarczy, ze jako slownik podepne wszystkie slowa wystepujace w nazwach i opisach produktow (zastanawiam sie jak to automagicznie sparsowac, czy np. po dodaniu kolejnego produktu explode po spacji i jesli slowo nie istniej to dodac do slownika)

Teraz tylko czy aby metoda z porownywaniem po dlugosci wyrazow jest w 100% dobra, mam przypadki w statystykach ze ktos napisal "napend dvd" ...

Ale tak czy inaczej wiem juz jak sie za to zabrac, dzieki za pomoc.
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.