![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 4 Pomógł: 0 Dołączył: 1.08.2011 Ostrzeżenie: (0%) ![]() ![]() |
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:) |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 2 885 Pomógł: 463 Dołączył: 3.10.2009 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 915 Pomógł: 210 Dołączył: 8.09.2009 Skąd: Tomaszów Lubelski/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Co do Levenstheina to http://www.artfulsoftware.com/infotree/queries.php#552
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 4 Pomógł: 0 Dołączył: 1.08.2011 Ostrzeżenie: (0%) ![]() ![]() |
Może w taki sposób (na zasadzie "zawiera"):
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 :/ |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
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. Ten post edytował Crozin 8.11.2012, 15:08:05 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 2.10.2025 - 14:55 |