# В каких случаях работает/не работает prefix\_length?

**URL:** <https://discuss.elastic.co/t/prefix-length/33855>\
**Category:** Вопросы на русском языке\
**Created:** [November 5, 2015, 11:19am UTC](https://discuss.elastic.co/t/prefix-length/33855 "2015-11-05T11:19:03Z")\
**Posts on this page:** 6\
**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:** [November 5, 2015, 11:19am UTC](https://discuss.elastic.co/t/prefix-length/33855/1 "2015-11-05T11:19:03Z")

</div>

Префиксный поиск, через запрос match работает весьма странно (анализатор - Edge NGramm). Например, мне нужно найти слово "москва" по введенному пользователем фрагменту "мос". Но в результатах я вижу (условно):  
"москва"  
"молотов"  
"мурманск"

Почему это происходит - я понимаю. По explain хорошо видно, что он сначала делает проверку на префикс "м", получает score по трем указанным словам, потом "мо" и получает более высокий score по двум городам, и потом "мос" - и получает самую высокую оценку для "москва".

А как сделать, чтобы в принципе анализатор "выбрасывал" из выборки "молотов" и "мурманск"?

У меня первая мысль - поставить prefix\_length: 3 для моего примера, что отсечет два лишних города. Но.... не сработало.

Какие есть оганичения по применение prefix\_length? Как можно сделать, чтобы префиксный поиск мог искать "начиная с длины X"? Указывать при настройке edge ngramm минимальную длину префикса "3" - не подходит.

---

<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:** [November 5, 2015, 2:17pm UTC](https://discuss.elastic.co/t/prefix-length/33855/2 "2015-11-05T14:17:29Z")

</div>

А вы EdgeNGram и при поиске и при индексировании применяете? Вы не могли бы прислать полный пример того, что вы делаете?

---

<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:** [November 5, 2015, 6:00pm UTC](https://discuss.elastic.co/t/prefix-length/33855/3 "2015-11-05T18:00:21Z")

</div>

Да. использую тот же анализатор. Удалось воспроизвести эффект в отдельном тесте. Только не могу понять - как выкладывать, поэтому вот ссылка:

[https://dl.dropboxusercontent.com/u/173410/test1.sh](https://dl.dropboxusercontent.com/u/173410/test1.sh)

---

<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:** [November 5, 2015, 6:21pm UTC](https://discuss.elastic.co/t/prefix-length/33855/4 "2015-11-05T18:21:07Z")

</div>

При поиске edgeNGram не нужен - иначе вы ищете по каждому префиксу запроса. То есть, если исправить ваш тест, то будет как-то так: [https://gist.github.com/imotov/3ba124fdd4b0db5d0219](https://gist.github.com/imotov/3ba124fdd4b0db5d0219) (Я только не уверен по поводу целесообразности использования word\_delimeter, я бы использовал стандартный токенизатор и nGram поставил бы как фильтр)

---

<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:** [November 5, 2015, 7:10pm UTC](https://discuss.elastic.co/t/prefix-length/33855/5 "2015-11-05T19:10:15Z")

</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:50pm UTC](https://discuss.elastic.co/t/prefix-length/33855/6 "2017-07-06T13:50:44Z")

</div>

Closed on July 6, 2017, 1:50pm UTC


