Чтобы быть успешным, (e) dismax полагается на то, чтобы избежать сложной проблемы со своей стратегией подсчета очков. Как мы уже говорили , dismax оценивает документы, беря максимальную оценку всех полей, которые соответствуют запросу. Это проблематично, так как оценки одного поля не могут быть легко связаны с оценками другого. Хорошее «текстовое» совпадение может иметь 2 балла, в то время как плохое «титульное» значение может быть 10. Dismax не имеет понятия, что «10» плохо для заголовка, он знает только 10> 2, поэтому совпадения в названии доминировать в окончательных результатах поиска.
Пожалуйста, найдите мой кусок сена!
В лучшем случае для dismax есть только одно поле, соответствующее запросу, поэтому итоговая оценка отражает согласованность внутри этого поля. Короче говоря, dismax процветает с проблемами иголки в стоге сена и плохо с проблемами сена в стоге сена.
Нам нужна другая стратегия для документов, которые имеют поля с большим количеством совпадений. Мы пытаемся определить разницу между очень похожими кусочками сена. Задача похожа на необходимость найти хорошего кандидата на работу. Если мы хотим запросить поисковый индекс кандидатов на работу для «Solr Java Developer», мы четко сопоставим множество различных разделов резюме наших кандидатов. Из-за проблем с dismax у нас могут получиться результаты поиска, сильно отсортированные по «объективному» полю. Наш лучший результат может иметь что-то вроде:
Цель: работать с Solr когда-нибудь!
Понятно не то, что мы хотим! Нам нужны опытные хардкорные ребята!
Я переключился на использование другой стратегии для релевантности поиска в подобных случаях. Начните с зачаточного, но простого подсчета очков, избегая диких колебаний дисмакса. Как только это будет сделано, дайте Solr список аддитивных запросов (через bq / bf ), которые описывают идеальный документ. Настройте множитель для каждой квалификации с помощью тестирования и экспериментов.
Простая базовая оценка
Вместо того, чтобы полагаться на qf / pf для поиска и выбора наилучшего из нескольких полей, я создам поле для сбора пакетов. Я буду использовать директивы Solr copyField, чтобы скопировать весь текст, которому я хочу соответствовать, в это поле в схеме:
<copyFieldsource=”resume_goal”dest=”text_all”/><copyFieldsource=”resume_experience”dest=”text_all”/><copyFieldsource=”resume_skills”dest=”text_all”/>
Поле «text_all» становится тем, что изначально ищет Solr. Здесь предполагается, что уместно разбивать то, что входит в text_all, таким же образом. В этом виде настройки вы также можете рассмотреть omitTermFreqsAndPositions для text_all, в противном случае ваш выигрыш будет сильно смещен в сторону поля, которое вносит наибольшее количество токенов в text_all.
Теперь мы можем установить
qf=text_all
и начать поиск!
Опишите квалификацию работы, чтобы Solr
Как только будет получен базовый прогнозируемый скоринг, давайте опишем нашего идеального кандидата, пройдя несколько простых запросов, которые помогут определить лучшие документы для решения проблемы, которую мы пытаемся решить:
-
Кандидат обладает не менее 75% необходимых навыков
bq = {! edismax qf = резюме_услуги мм = 75% v = $ q bq =}
-
Кандидат хочет работать с технологией
bq = {! edismax qf = resume_goals v = $ q bq =}
-
Кандидат имеет высокую репутацию StackOverflow
БФ = лог (resume_stackoverflow_reputation)
Каждый из этих запросов позволяет Solr добавить дополнительный фактор в сортировку. Обратите внимание, как в bq мы устанавливаем v = $ q. Мы используем синтаксис локальных параметров Solr для повторной обработки исходного запроса в соответствии с новым набором критериев. В первом отчете мы также предполагаем, что resume_skills будет использовать цепочку анализа, которая отфильтровывает токены, которые не являются профессиональными навыками, посредством комбинации синонимов и фильтрации. Также важно отметить, что это не будет готовый продукт. Каждое повышение должно быть тщательно настроено с помощью тестирования, настраивая его влияние с помощью синтаксиса ^ (множитель).
Кто из вас является идеальным документом для этого запроса?
В этой стратегии есть одна приятная вещь: мы прямо говорим Solr, чего именно хотим от удивительного кандидата. Это немного похоже на использование Solr для нечеткого сортировщика, в явном виде вводя в него фрагменты критериев, которые мы считаем «хорошими», настраивая эти критерии, а затем используя его, чтобы найти ответы, которые соответствуют такому количеству критериев, как мы указываем. Позже также легко решить, что мы хотим разбить на дополнительные критерии (есть ли у кандидата код на github, который использует навыки в запросе? — сколько кода? — как давно это делается?). Мы могли бы даже применить дополнительные запросы на основе дополнительных критериев, таких как требования к зарплате. Это довольно захватывающая стратегия. Мы с Джоном Берриманом даже задавались вопросом, может ли это помочь в реализации его идей по множественной оценке . В любом случае, я надеюсь использовать это больше!
Дайте нам знать, что вы думаете об этой стратегии! Если у вас возникла серьезная проблема с релевантностью, сообщите нам, у нас есть это и множество других уловок, связанных с релевантностью, и мы с удовольствием поговорим с вами!
— Смотрите больше на: http://www.opensourceconnections.com/2013/07/21/improve-search-relevancy-by-telling-solr-exactly-what-you-want/#sthash.7138KIE7.dpuf