![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 589 Pomógł: 91 Dołączył: 22.05.2008 Skąd: Gliwice Ostrzeżenie: (0%) ![]() ![]() |
Potrzebuje na poziomie bazy wyciągnąć rekordy w których jedno z pól jest zbliżone w 90% do podanego ciągu. Tak w PHP jest funckja similar_text jednak to powinno się robić na poziomie bazy. Chodzi o coś takiego:
tyle, że takiej funkcji w MySQL nie ma ![]() Na forum znalazłem identyczny temat http://forum.php.pl/index.php?showtopic=70797 jednak nie rozwiązany... -------------------- Moja gra - scraby.io
|
|
|
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
W mysql jest wyszukiwanie pełnotekstowe (FULLTEXT) dla tabel na silniku MyIsam. Na silniku InnoDb powinieneś użyć sphinxa.
Zapomnij o soundex, służy do czegoś innego. Levensthein jest czymś podobnym ale potrzebuje funkcji składowanej http://codejanitor.com/wp/2007/02/10/leven...tored-function/ Podpowiedź aby zainstalować procedurę.
-------------------- |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 589 Pomógł: 91 Dołączył: 22.05.2008 Skąd: Gliwice Ostrzeżenie: (0%) ![]() ![]() |
Super. Dzięki!
Btw. rozumiem, że to inne algorytmy są, bo dla dostaje: 77,(7) natomiast dla:
dostaje: 64 -------------------- Moja gra - scraby.io
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
Jest to różnica algorytmów.
similar_text korzysta z algorytma Olivera , drugi Levenshteina Wyniki, które podałeś są oczywiste. Może powiedz co chcesz uzyskać to dobierzemy coś dla Ciebie. -------------------- |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 589 Pomógł: 91 Dołączył: 22.05.2008 Skąd: Gliwice Ostrzeżenie: (0%) ![]() ![]() |
W sumie to dla mnie chyba bez różnicy który algorytm, wystarczy skalibrować przy ilu % otrzymuje dane które są na tyle podobne, że możliwe, że to literówka.
-------------------- Moja gra - scraby.io
|
|
|
![]()
Post
#6
|
|
![]() Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
Przy prostych literówkach lepiej nie porównywać procentowo tylko po prostu liczbowo.
Odległość levenstheina mówi ile zmian musisz dokonać aby jedno słowo zamienić w drugie. Więc myślę że 3 (max 4) są w zupełności zadowalające. -------------------- |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 589 Pomógł: 91 Dołączył: 22.05.2008 Skąd: Gliwice Ostrzeżenie: (0%) ![]() ![]() |
Sprawdzę. Na pewno będzie to szybsze
![]() Nie będę zakładać nowego tematu, ale mam kolejne zapytanie:
i ogólnie chodzi mi o to, że hm... funkcja LEVENSHTEIN_RATIO jest wykonywana 2 razy tak? Czy nie wiem jest ten wynik jakoś cachowany w bazie? Jeśli nie to jak zrobić tak aby nie liczyć tego 2 razy bo przy kilku tys. rekordów to troszkę trwa. Nie sprawdzałem (jest późno a mnie się oczy kleją) ale podzapytanie dało by chyba radę. Jakieś inne rozwiązanie? -------------------- Moja gra - scraby.io
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
Szczerze to nie chce mi się teraz kombinować ale wystarczy użyć having albo zmiennej. Co lepiej, niestety za późno by testować
![]() -------------------- |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 589 Pomógł: 91 Dołączył: 22.05.2008 Skąd: Gliwice Ostrzeżenie: (0%) ![]() ![]() |
Okej to tak, zwykła odległość Levenstheina przy małych stringach powinna być mała.
Dostaje: Kod Ray TEST kant kant. Dla warunku < 3 wyniki są jak dla mnie zadowalające Kod kant kant. Ale przy długich stringach max 2 zmieny to imho mało, więc chyba zostanę jednak na procentowej wersji. Użyłem zmiennej i HAVING i nie zauważam zmniejszenia czasu wykonani, może jednak to nie jest liczone 2 razy?
Jeszcze jedna sprawa - dla tabelki w której mam ~1200 rekordów to jest strasznie wolne (~7 sec) więc pomyślałem, żeby nie mielić całej tabelki tylko rekordy o inentycznej pierwszej literze, wygląda to tak:
Prawie przy 'k' wykonuje się ~0.2 sec więc jest okej. Przy szukaniu literówek to chyba dobry pomysł bo raczej rzadko robi się literówkę w pierwszym znaku, chyba że ma ktoś inny pomysł? Ten post edytował #luq 21.05.2010, 09:57:15 -------------------- Moja gra - scraby.io
|
|
|
![]()
Post
#10
|
|
![]() Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
Ten pomysł jest ok, ale stworzyłbym dodatkową kolumne przedstawiajaca ilosc znakow w słowie.
Dzięki temu np jak szukasz słowo "test" to założysz warunek co jeszcze lepiej ograniczy wyniki Jeżeli chcesz szukać jeszcze inaczej zainteresuj się n-gramami. -------------------- |
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.08.2025 - 05:24 |