Как исключить подстветку не полностью совпадающих запросов?

Добрый день!

Просьба подсказать. Есть проиндексирвоанные данные - имя и фамилия, которые проиндексированы через edgeNGram. Когда я делаю поиск с помощью match_prefix, с указанием необходимости сделать highlight, я получаю инетерсный, но не очень подходящий результат. Например, есть два поля:
nam: 'Иван'
fam: 'Иваськин'

При поиске по префиксу, подсветка выглдяит следующим образом:
nam: 'Иван'
fam: 'Иваськин'

Есть ли какой-нибудь флаг, который может ограничить подсветку "неполных" фрагментов? Чтобы fam не подсвечивался, поскольку полностью не соответствует введенной юзером фразе?

Это происходит потому, что по умолчанию подсветка выполняется по тому же запросу, что и поиск. В вашем случае, вы хотите искать по префиксу, а подсвечивать по полному запросу. И это можно сделать c помощью параметра highlight_query.

Прошу прощения, сразу не ответил. В принципе - хороший вариант. Вопрос вот только - это же увеличит время поиска примерно вдвое? Или он будет применять highlight_query только к найденному в основном запросе?

Нет, искать он будет только один раз. Подсветка и поиска не зависят друг от друга. Просто по умолчанию и то и другое происходит по одному запросу.

Не-не, навреное не поняли друг друга. :slight_smile: Изначально суть проблемы была в том, что при поиске по префиксу, например, слова "Иванова", будут подсвечены и "Иванова" и "Иванов", потому что по префиксу "Иванов" тоже часть слова "Иванова".

Как я понимаю, если использовать highligth_query, то можно задать отдельные условия для выделения слов. Например, искать только точные совпадения. Тогда, при запросе "Иванова" подсветится только слово "Иванова", но не Иванов.

Если все так, то не очень понимаю логику работы - разве Elastic не будет "применять" дважды заданные правила? Один раз для поиска по префиксу (например, match_prefix), а второй раз по точному совпадению (например, highlight_query)?

Во время поиска никакой информации о том, почему конкретная запись была найдена, не сохраняется. Поэтому во время подсветки, elasticsearch анализирует найденную запись и запрос и пытается вычислить какие-же слова в записи совпадают со словами в запросе. Другими словами поиск и подсветка - процессы независимые. Так что никакие "правила" применяться дважды не будут. Просто одни "правила" будут использованы при поиске, и другие "правила" будут применены при подсветке.

Отлично! Тогда точно - то, что надо. Спасибо!