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

**URL:** https://discuss.elastic.co/t/topic/25362
**Category:** Вопросы на русском языке
**Created:** [July 11, 2015, 9:59am UTC](https://discuss.elastic.co/t/topic/25362 "2015-07-11T09:59:48Z")
**Posts on this page:** 8
**Page:** 1

<div class="post-metadata">

### Author: ![Stan](https://avatars.discourse-cdn.com/v4/letter/s/51bf81/32.png) [@Stan](https://discuss.elastic.co/u/Stan)
#### Post date: [July 11, 2015, 9:59am UTC](https://discuss.elastic.co/t/topic/25362/1 "2015-07-11T09:59:48Z")

</div>

Добрый день!

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

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

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

---

<div class="post-metadata">

### Author: ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)
#### Post date: [July 11, 2015, 2:25pm UTC](https://discuss.elastic.co/t/topic/25362/2 "2015-07-11T14:25:59Z")

</div>

Это происходит потому, что по умолчанию подсветка выполняется по тому же запросу, что и поиск. В вашем случае, вы хотите искать по префиксу, а подсвечивать по полному запросу. И это можно сделать c помощью параметра [highlight\_query](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-highlighting.html#_highlight_query).

---

<div class="post-metadata">

### Author: ![Stan](https://avatars.discourse-cdn.com/v4/letter/s/51bf81/32.png) [@Stan](https://discuss.elastic.co/u/Stan)
#### Post date: [July 20, 2015, 7:04pm UTC](https://discuss.elastic.co/t/topic/25362/3 "2015-07-20T19:04:20Z")

</div>

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

---

<div class="post-metadata">

### Author: ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)
#### Post date: [July 20, 2015, 7:08pm UTC](https://discuss.elastic.co/t/topic/25362/4 "2015-07-20T19:08:05Z")

</div>

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

---

<div class="post-metadata">

### Author: ![Stan](https://avatars.discourse-cdn.com/v4/letter/s/51bf81/32.png) [@Stan](https://discuss.elastic.co/u/Stan)
#### Post date: [July 20, 2015, 7:24pm UTC](https://discuss.elastic.co/t/topic/25362/5 "2015-07-20T19:24:43Z")

</div>

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

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

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

---

<div class="post-metadata">

### Author: ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)
#### Post date: [July 20, 2015, 7:34pm UTC](https://discuss.elastic.co/t/topic/25362/6 "2015-07-20T19:34:59Z")

</div>

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

---

<div class="post-metadata">

### Author: ![Stan](https://avatars.discourse-cdn.com/v4/letter/s/51bf81/32.png) [@Stan](https://discuss.elastic.co/u/Stan)
#### Post date: [July 20, 2015, 7:53pm UTC](https://discuss.elastic.co/t/topic/25362/7 "2015-07-20T19:53:32Z")

</div>

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

---

<div class="post-metadata">

### Author: ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)
#### Post date: [July 6, 2017, 1:51pm UTC](https://discuss.elastic.co/t/topic/25362/8 "2017-07-06T13:51:40Z")

</div>


