#elasticsearch #fuzzy-search
#эластичный поиск #нечеткий поиск
Вопрос:
У меня есть отображение в elasticsearch с анализатором полей, имеющим маркер:
"tokenizer": { "3gram_tokenizer": { "type": "nGram", "min_gram": "3", "max_gram": "3", "token_chars": [ "letter", "digit" ] } }
теперь я пытаюсь найти имя = «avinash» в Elasticsearch с помощью запроса = «acinash».
Сформированный запрос является:
{ "size": 5, "query": { "bool": { "must": [ { "multi_match": { "query": "acinash", "fields": [ "name" ], "type": "best_fields", "operator": "AND", "slop": 0, "fuzziness": "1", "prefix_length": 0, "max_expansions": 50, "zero_terms_query": "NONE", "auto_generate_synonyms_phrase_query": false, "fuzzy_transpositions": false, "boost": 1.0 } } ], "adjust_pure_negative": true, "boost": 1.0 } } }
Но в версии ES 6.8 я получаю желаемый результат(из-за нечеткости), т. е. «avinash», от запроса «acinash», но в версии ES 7.1 я не получаю результат.
То же самое происходит при попытке поиска «avinash» с помощью «avinaah» в 6.8 я получаю результаты, но в 7.1 я не получаю результатов
Что делает ES, так это преобразует его в токены :[aci, cin, ina, nas, ash], которые в идеале должны совпадать с маркированным инвертированным индексом в ES с токенами : [avi, vin, ina, nas, ash].
Но почему он не совпадает в 7.1?
Ответ №1:
Это не связано с версией ES.
Обновите max_expansions до более чем 50.
max_expansions : Maximum number of variations created.
С 3-граммовыми буквами и цифрами в качестве символов token_chars идеальное максимальное расширение будет (26 алфавитов 10 цифр) * 3