Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> similar_text w MySQL
#luq
post
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:

  1. SELECT foo.id FROM foo WHERE SIMILAR( foo.name, 'jakis string' ) > 0.9


tyle, że takiej funkcji w MySQL nie ma (IMG:style_emoticons/default/winksmiley.jpg) Da się to w ogóle zrobić na MySQL`u?

Na forum znalazłem identyczny temat http://forum.php.pl/index.php?showtopic=70797 jednak nie rozwiązany...
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
#luq
post
Post #2





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.
  1. SELECT authorName FROM `msh_name_author` WHERE LEVENSHTEIN( authorName, 'kant' ) < 4


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?
  1. SELECT authorId, authorName, (
  2. @t := LEVENSHTEIN_RATIO( authorName, 'kant' )
  3. ) AS similar
  4. FROM msh_name_author
  5. HAVING similar > 70


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:
  1. SELECT authorId, authorName, (
  2. @t := LEVENSHTEIN_RATIO( authorName, 'kant' )
  3. ) AS similar
  4.  
  5. FROM (
  6. SELECT authorId, authorName
  7. FROM msh_name_author
  8. WHERE SUBSTRING( authorName, 1, 1 ) = 'k'
  9. ) AS foo
  10. HAVING similar >70

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

Posty w temacie


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: 27.12.2025 - 21:40