Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyszukiwanie pełnotekstowe, wyszukiwanie podobnych wyrażeń
Forum PHP.pl > Forum > Bazy danych > MySQL
foo.noob
Witam.

Jestem w trakcie implementacji wyszukiwarki do sklepu internetowego.
Poczytałam trochę o wyszukiwaniu pełnotekstowym i postanowiłam zastosować je w rozwiązaniach. Jednak nie do końca spełnia to moje oczekiwania, stąd ten temat i pytanie - czy klauzula jest dobrze napisana, czy może należy ją w jakiś sposób zmodyfikować aby wyniki były lepsze?

Przypuśćmy, że mam tabelę products z polami: id, name (VARCHAR), description (TEXT). Na pola name i description nałożony jest indeks FULLTEXT.
W tabeli produktów mam m.in produkty o następującej nazwie:
"Brelok fioletowy", "Brelok myszka", "Brelok ludzik", "Breloki zajączki", "Breloki rybki".

Stworzyłam następującą klauzulę do wyszukiwania po zadanej frazie:

'SELECT name FROM products WHERE MATCH (name, description) AGAINST ("'.$fraza.'")'

Problem w tym, że gdy jako frazę podaję słowo "brelok" - wyszukuje mi jedynie te produkty, które w nazwie mają "brelok", czyli "brelok fioletowy", "brelok myszka" oraz "brelok ludzik".
W zwracanych wynikach nie ma produktów, których nazwa zaczyna się od "Breloki".
W jaki sposób sprawić, aby również produkty które posiadają daną frazę w nazwie lub opisie (ale z dodatkowymi znakami, np. tak jak w przypadku "brelok" i "breloki"), były zwracane w wynikach?

Jak inaczej można podejść do tematu wyszukiwania, tak aby w wynikach zwracane były nie tylko exact match, ale także rekordy bardzo podobne do danej frazy (różniące się np. jedną lub dwiema literami)?

Czytałam tu i tam na temat algorytmu Levenshteina, ale niestety nie potrafiłam tego zaimplementować - być może ktoś z forum byłby pomocny w tej kwestii?

Z góry dziękuję za pomoc:)
darko
Może w taki sposób (na zasadzie "zawiera"):
  1. "SELECT name FROM products WHERE MATCH (name, description) AGAINST ('%" . $fraza . "%')";
redeemer
Co do Levenstheina to http://www.artfulsoftware.com/infotree/queries.php#552
foo.noob
Cytat(darko @ 8.10.2012, 16:45:32 ) *
Może w taki sposób (na zasadzie "zawiera"):
  1. "SELECT name FROM products WHERE MATCH (name, description) AGAINST ('%" . $fraza . "%')";


Też o tym pomyślałam, ale niestety nie przynosi to efektu.
Czy to normalne, że wyszukiwanie pełnotekstowe działa w taki sposób, że przy wpisaniu "brelok" zwraca tylko rekordy z tytułem zawierającym słowo "brelok", a "breloki" już nie?

Jeśli tak, to nie wiem dlaczego wyszukiwanie fulltext jest tak zachwalane, w opozycji do LIKE :/
Crozin
To czego potrzebujesz tutaj to... słownik. A właściwie silnik wyszukiwania pełnotekstowego z obsługą słownika. Dzięki temu, wyszukiwarka będzie wstanie rozpatrywać brelok, breloki, brelokom, brelokowi i wiele innych jako jeden i ten sam wyraz. A właściwie wariant słowa, bo nie koniecznie każda z odmian musi mieć taką samą "siłę" przy uwzględnianiu trafności wyszukiwania.

Wyszukiwanie pełnotekstowe w MySQL jest zrealizowane w dosyć podstawowym zakresie. Prawdopodobnie będziesz musiał tutaj skorzystać z dedykowanych rozwiązań typu Sphinx, Lucene/Solr czy ElasticSearch.
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.