Filip Górny

Filip Górny Programista,
webdeveloper.

Temat: MySQL i znajdowanie wyników "podobnych"

Szukam szybkiego rozwiązania na funkcję wyszukiwanie podobnych "rowów", z parametrem procentowym podobieństwa. Wiem że sql posiada tego typu funkcję, np sound like. Pytanie brzmi - w którą stronę iśc, oprogramować to w php'ie czy pozostać po stronie sql?

Merytorycznie chodzi o wyszukiwanie podobnych ofert. Dane ofert są "left joinowane".
Grzegorz Zakrzewski

Grzegorz Zakrzewski programista,
przyszły
wędkarz-Emeryt

Temat: MySQL i znajdowanie wyników "podobnych"

Robiłem coś podobnego.
Użyłem wtedy levenshtein() po stronie php.
można zmiennymi ustalać wartość podobieństwa.
Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: MySQL i znajdowanie wyników "podobnych"

hmm ja bym pozostal jednak przy bazie, algorytmy porownywania tego typu jak mowisz czyli np: levenshtein ma zlozonosc bodajze O(n^2) wiec sa wooolne a implementacja tego w php bedzie juz w ogole slamazarna

dodatkowo jezeli zrobisz to porownywanie dla n rekordow to masz juz klase zlozonosi O(n^3) czyli prawdziwy dramat :SŁukasz Cepowski edytował(a) ten post dnia 16.04.10 o godzinie 17:07
Filip Górny

Filip Górny Programista,
webdeveloper.

Temat: MySQL i znajdowanie wyników "podobnych"

Trudny wybór jeśli tabela będzie posiadać na oko 3000 rekordów, a każdy rekord po 30 pól...
Wojciech Sznapka

Wojciech Sznapka CTO @ STS Zakłady
Bukmacherskie

Temat: MySQL i znajdowanie wyników "podobnych"

ja bym robił ddległościami Levenshteina po stronie bazy mysql.
Grzegorz Zakrzewski

Grzegorz Zakrzewski programista,
przyszły
wędkarz-Emeryt

Temat: MySQL i znajdowanie wyników "podobnych"

Jeśli to Ci ułatwi decyzję.
Ja miałem łatwiej bo nie miałem wyboru.
Musiałem stworzyć raport zapisywany w nowej tabeli. Program przeszukiwał bazę i wyszukiwał najbardziej podobne do siebie pary rekordów na podstawie kilku kryteriów z różnych kolumn tabeli i zapisywał wynik w nowej tabeli która służyła do dalszych obliczeń.
O ile dobrze pamiętam ustalenie najbardziej podobnych towarów dla bazy 5000 rekordów trwało ok 20 minut.

uzup. Na lokalnym 2 rdzeniowym kompie - żaden serwer.Grzegorz Zakrzewski edytował(a) ten post dnia 16.04.10 o godzinie 17:40
Robert B.

Robert B. Web Development
Manager

Temat: MySQL i znajdowanie wyników "podobnych"

Nie wiem na ile to rozwiązanie jest 100%, ale ja bym wykorzystał full text search (zakładam, że masz dodatkowo możliwość zawężenia wyszukiwania do konkretnej kategorii).
1. Kopiujesz oferty do osobnej tabeli MyISAM i zakładasz na niej fulltextowy index
2. Podobnych ofert szukasz tworząc query z nazwy oferty (+ treść ew. tagi).
3. W zależności od kolumn jakie wykorzystasz tak manipulujesz revelance, żeby sensownie zwracał rezultaty.
Łukasz Krzysiak

Łukasz Krzysiak programista, o2.pl

Temat: MySQL i znajdowanie wyników "podobnych"

Trudno będzie osiagnąć dużą trafność dopasowań przy jednoczesnym zapewnieniu wysokiej wydajności.

Wyznacznie podobieństw miarą Levenshteina przy każdym wyszukiwaniu jest zbyt zasobochłonne. Z kolei precachowanie tych danych spowodowałoby ogromy przyrost redundantnych danych, co w dłuższej perspektywie także odbije się na wydajności.

Wyszukiwanie pełnotekstowe po stronie bazy danych także będzie zbyt wolne.

Proponował bym skorzystać z wyszukiwanie pełnotekstowe przy użyciu Sphinxa (http://www.sphinxsearch.com/). Wyszukiwarka poza przeszukiwaniem pełnotekstowym pozwala na dodatkowe filtrowanie wyników wg. zdefiniowanych atrybutów np. kategorii, cen, ilości punktów etc. No i przedewszystkim jest znacznie wydajniejsze niż podobne wyszukiwanie po stronie bazy danych (wg. oficjalnej dokumentacji nawet do 100 razy).

Sphinx pozwala na samodzielne definiowanie funkcji wyznaczającej trafność wyników, a przy każdym zwróconym rekordzie jest dodatkowe pole z wyliczoną jego trafnością.
Filip Górny

Filip Górny Programista,
webdeveloper.

Temat: MySQL i znajdowanie wyników "podobnych"

Byc moze zrezygnuje z porownywania podobienstwa stringow. (bez skojarzen ;-))

W moim przypadku podobienstwo nie jest do konca terminem okreslonym. Moge rozwiazac ta funkcje w sposob taki, iz procent bedzie wskazywal na ilosc parametrow identycznych.

Mamy wiec tabele:
offers

oraz:
offer_fields
offer_data

field to pola typu: ulica, adres
w data sa wartosci

Mysle ze jest jasne jak to jest laczone. Teraz musze znalezc rozwiazanie, aby np. wziasc jedna oferte, i wyswietlic X podobnych, gdzie podobienstwo jest procentem parametrow o identycznych wartosciach.

konto usunięte

Temat: MySQL i znajdowanie wyników "podobnych"

Łukasz Krzysiak:
Trudno będzie osiagnąć dużą trafność dopasowań przy jednoczesnym zapewnieniu wysokiej wydajności.

Sphinx pozwala na samodzielne definiowanie funkcji wyznaczającej trafność wyników, a przy każdym zwróconym rekordzie jest dodatkowe pole z wyliczoną jego trafnością.

A ja podam Lucene , podobna do Sphinx-a



Wyślij zaproszenie do