2011-08-22 14 views
17

Używam dopasowania rozmytego w moim projekcie, głównie w celu znalezienia błędów pisowni i różnych pisowni tych samych nazw. Muszę dokładnie zrozumieć, w jaki sposób sprawdza się rozmyte dopasowanie elastycznego wyszukiwania i jak korzysta z 2 parametrów wymienionych w tytule.elasticsearch fuzzy matching max_expansions & min_similarity

Jak rozumiem, min_similarity to procent, o jaki zapytanie odpowiada ciągowi w bazie danych. Nie mogłem znaleźć dokładnego opisu, w jaki sposób obliczana jest ta wartość.

Zgodnie z moją wiedzą jest to odległość Levenshtein, według której należy wykonać wyszukiwanie. Gdyby to była odległość Levenshteina, byłoby to dla mnie idealne rozwiązanie. W każdym razie, to nie działa na przykład mam słowo „Samvel”

queryStr  max_expansions   matches? 
samvel  0      Should not be 0. error (but levenshtein distance can be 0!) 
samvel  1      Yes 
samvvel  1      Yes 
samvvell  1      Yes (but it shouldn't have) 
samvelll  1      Yes (but it shouldn't have) 
saamvelll  1      No (but for some weird reason it matches with Samvelian) 
saamvelll  anything bigger than 1 No 

Dokumentacja mówi coś ja naprawdę nie rozumiem:

Add max_expansions to the fuzzy query allowing to control the maximum number 
of terms to match. Default to unbounded (or bounded by the max clause count in 
boolean query). 

Więc można zadowolić ktoś mi wyjaśnić, jak dokładnie te parametry wpływa na wyniki wyszukiwania.

Odpowiedz

21

Wartość min_similarity jest wartością zera na jedną. Od docs Lucene:

For example, for a minimumSimilarity of 0.5 a term of the same length 
as the query term is considered similar to the query term if the edit 
distance between both terms is less than length(term)*0.5 

'Edit odległość', która jest określana jest Levenshtein distance.

Droga ta kwerenda działa wewnętrznie jest:

  • znajdzie wszystkie warunki, które istnieją w indeksie, które mogą dopasować wyszukiwany termin, kiedy biorąc min_similarity uwzględnieniu
  • następnie wyszukuje dla wszystkich tych, warunki.

Możesz sobie wyobrazić jak ciężkie może być to zapytanie!

Aby temu zaradzić, można ustawić parametr max_expansions, aby określić maksymalną liczbę zgodnych terminów, które należy wziąć pod uwagę.

+0

ah, następnie max_expansions i min_similarity powinny być używane razem. więc rzeczywiste ograniczenie odległości jest wykonywane przez 'min_similarity', a' max_expansions' działa tak samo jak klauzula "LIMIT" MySQL? Po prostu ogranicza liczbę potencjalnych wyników? –

+4

tak, działa podobnie do klauzuli "LIMIT", a nie do ostatecznego zapytania, które jest uruchamiane, ale do tymczasowego zapytania, które jest używane do znajdowania listy terminów do wyszukania w ostatecznym zapytaniu – DrTech

+0

Wielkie dzięki :) Pomogło to dużo :) –