Как настроить параметры поиска в Apache Solr?

Добрый день! Начал использовать текстовый поисковик Solr версии 8.3.0 и изучаю его возможности. Из коробки все работает достаточно сносно, но видно, что можно еще улучшить результаты выдачи, но ковыряясь в документации так и не нашел того, что нужно. Интересуют следующие вопросы:
1) учитывать только одно вхождение поискового слова в искомом тексте. Сейчас получается, что чем чаще в тексте встречается искомое слова, тем релевантность текста выше. Это надо отключить и отдавать предпочтение тому тексту, где встречается поисковое слово только один раз.
2) приоритет был бы у более коротких текстов
3) как заточить поиск конкретно по русскому языку? Знаю, что есть тип text_ru но как его применить не очень понимаю
4) при нечетком поиске давать предпочтение первой части слова. Грубо говоря меньше обращать внимание на окончание а больше на корень.

Если тут есть специалисты по Solr то подскажите, как вышеперечисленное можно затюнить или ткнуть носом в соответствующие доки.
  • Вопрос задан
  • 689 просмотров
Решения вопроса 1
Espritto
@Espritto Автор вопроса
Понимаю, что вопрос очень специфический и даже на стэковерфлоу никто не откликнулся, хотел уже дергать непосредственно разработчиков Solr-а но все же разобрался сам по этому отвечаю сам себе...

1) Надо модифицировать scorer - алгоритм оценки и ранжирования найденных совпадений. В этом алгоритме нас интересует параметр Term Frequency (сокр. TF, обычно он используется вместе со своим братом IDF — inverse document frequency, но в данном случае его трогать не надо). TF подсчитывает количество слов в документе и чем оно больше, тем выше оценка. Нам нужно игнорировать этот параметр, по этому надо найти место в коде движка и прописать, чтобы всегда возвращалось 1. Solr использует класс Similarity для оценки результатов, точнее множество расширений этого класса, реализующие разные алгоритмы. В конфигах ядра базы прописал, чтобы использовался класс ClassicSimilarityFactory а в реализации класса ClassicSimilarity захардкодил, чтобы функция tf() всегда возвращала 1.0f. Поскольку Solr это опенсорский проект написанный да Java то изменение исходников не составляет особого труда. Дальше по инструкции из README билдим проект, запускам - все работает! Убедиться, что расчеты весов правильные можно через дебаг режим в запросе (тогда вместе с результатом будет возвращена отладочная инфа)
2) на самом деле это и так уже и так работает из коробки, тут ничего делать не надо
3) как говорилось, есть уже готовый тип text_ru в котором уже настроен русский стеммер. Чтобы текста обрабатывался по "правилу русского языка" нужно либо назвать текстовое поле *_text_ru либо явно создать новое поле в админке в разделе schema и указать ему тип text_ru
4) это и так будет происходить если использовать тип данных с русским стеммером, то есть слова будут искаться по корню а окончания отбрасываться
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы