# Релевантность по частоте фраз \[РЕШЕНО\]

**URL:** <https://discuss.elastic.co/t/topic/57578>\
**Category:** Вопросы на русском языке\
**Created:** [August 9, 2016, 10:07am UTC](https://discuss.elastic.co/t/topic/57578 "2016-08-09T10:07:26Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![viktorm](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/viktorm/32/11279_2.png) [@viktorm](https://discuss.elastic.co/u/viktorm)\
**Post date:** [August 9, 2016, 10:07am UTC](https://discuss.elastic.co/t/topic/57578/1 "2016-08-09T10:07:27Z")

</div>

Уважаемые коллеги,

Клиент хочет поиск документов по фразам и определять релевантность по частоте фраз. Стандартные средства match\_phrase, как я их понял, не решают задачу полностью.

Решение "в лоб" — делать custom score function, которая будет считать количество фраз в документе. Есть ли способы элегантнее?

Спасибо.

---

<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:** [August 9, 2016, 1:11pm UTC](https://discuss.elastic.co/t/topic/57578/2 "2016-08-09T13:11:20Z")

</div>

Сколько документов в индексе, какой у них размер и сколько слов в фразе (в среднем и максимальное)?

---

<div class="post-metadata">

**Author:** ![viktorm](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/viktorm/32/11279_2.png) [@viktorm](https://discuss.elastic.co/u/viktorm)\
**Post date:** [August 9, 2016, 1:18pm UTC](https://discuss.elastic.co/t/topic/57578/3 "2016-08-09T13:18:15Z")

</div>

Здравствуйте Игорь!

Документов ~700K(резюме). Размер поля в котором поиск от 100 до 5000 символов(секция опыт работы). Фразы от одного до четырех слов(должность).

---

<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:** [August 9, 2016, 2:02pm UTC](https://discuss.elastic.co/t/topic/57578/4 "2016-08-09T14:02:32Z")

</div>

Тогда можно попробовать индексировать фразы как отдельные токены с помощью фильтра [shingle](https://www.elastic.co/guide/en/elasticsearch/guide/2.x/shingles.html).

---

<div class="post-metadata">

**Author:** ![viktorm](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/viktorm/32/11279_2.png) [@viktorm](https://discuss.elastic.co/u/viktorm)\
**Post date:** [August 9, 2016, 5:24pm UTC](https://discuss.elastic.co/t/topic/57578/5 "2016-08-09T17:24:02Z")

</div>

Игорь, пробую с shingle фильтром. Получается не очень.

Вот мои эксперименты [http://lpaste.net/2853889383168212992](http://lpaste.net/2853889383168212992). Я пронумеровал документы в соответствии с количеством фраз "software engineer" для удобства.

"Наивный" скрипт дает лучший результат релевантности. Может так и оставить? Я читал что elastic загружает в память все документы. Я предполагаю что скрипт не должен давать большой нагрузки

---

<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:** [August 9, 2016, 6:14pm UTC](https://discuss.elastic.co/t/topic/57578/6 "2016-08-09T18:14:44Z")

</div>

Что-то вы очень быстро сдались 🙂 Получается плохо, потому что ваш запрос дискриминирует работников с длинными резюме. По умолчанию, elasticsearch предпочитает короткие документы длинным при одинаковом количестве совпадений слов, но [этот механизм](https://www.elastic.co/guide/en/elasticsearch/guide/2.x/scoring-theory.html#field-norm) очень легко отключить вот так:

```auto
          "entry" : {
            "type" : "string",
            "fields": {
                "shingles": {
                    "type": "string",
                    "omit_norms": { "enabled": false }, <------
                    "analyzer": "rz_shingle_analyzer"
                }
            }
          },

```

"Наивный" скрипт потребует проверки каждой записи в индексе. Такие решения не масштабируются.

---

<div class="post-metadata">

**Author:** ![viktorm](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/viktorm/32/11279_2.png) [@viktorm](https://discuss.elastic.co/u/viktorm)\
**Post date:** [August 9, 2016, 6:30pm UTC](https://discuss.elastic.co/t/topic/57578/7 "2016-08-09T18:30:38Z")

</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:46pm UTC](https://discuss.elastic.co/t/topic/57578/8 "2017-07-06T13:46:38Z")

</div>


