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

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

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

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

Спасибо.

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

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

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

Тогда можно попробовать индексировать фразы как отдельные токены с помощью фильтра shingle.

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

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

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

Что-то вы очень быстро сдались :slight_smile: Получается плохо, потому что ваш запрос дискриминирует работников с длинными резюме. По умолчанию, elasticsearch предпочитает короткие документы длинным при одинаковом количестве совпадений слов, но этот механизм очень легко отключить вот так:

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

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

1 Like

Игорь, браво! Прекрасно работает.

Спасибо за помощь.