Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wyszukiwanie pełnotekstowe, wyszukiwanie podobnych wyrażeń
foo.noob
post
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:)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
darko
post
Post #2





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Może w taki sposób (na zasadzie "zawiera"):
  1. "SELECT name FROM products WHERE MATCH (name, description) AGAINST ('%" . $fraza . "%')";
Go to the top of the page
+Quote Post
redeemer
post
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
Go to the top of the page
+Quote Post
foo.noob
post
Post #4





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 1.08.2011

Ostrzeżenie: (0%)
-----


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 :/
Go to the top of the page
+Quote Post
Crozin
post
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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 2.10.2025 - 14:55