Подтвердить что ты не робот

Elasticsearch нечеткое соответствие max_expansions & min_similarity

Я использую нечеткое сопоставление в своем проекте в основном для поиска орфографических ошибок и разных написаний с одинаковыми именами. Мне нужно точно понять, как работает нечеткое согласование работы по упругому поиску, и как он использует 2 параметра, упомянутых в названии.

Как я понимаю, min_similarity - это процент, с помощью которого запрашиваемая строка соответствует строке в базе данных. Я не смог найти точное описание того, как вычисляется это значение.

max_expansions, насколько я понимаю, это расстояние Левенштейна, по которому должен выполняться поиск. Если бы это было расстояние Левенштейна, это было бы идеальным решением для меня. Во всяком случае, он не работает например, у меня есть слово "Самвел"

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

В документации написано что-то, чего я действительно не понимаю:

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).

Так может понравиться кому-нибудь объяснить мне, как именно эти параметры влияют на результаты поиска.

4b9b3361

Ответ 1

min_similarity - это значение от нуля до единицы. Из документов 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

"Расстояние редактирования", на которое ссылается, - это расстояние Левенштейна.

Как работает этот запрос внутри:

  • он находит все термины, которые существуют в индексе, которые могут соответствовать поисковому запросу, принимая во внимание min_similarity
  • тогда он ищет все эти термины.

Вы можете себе представить, насколько тяжелым может быть этот запрос!

Чтобы бороться с этим, вы можете установить параметр max_expansions, чтобы указать максимальное количество согласующих терминов, которые следует учитывать.