Более сильное повышение по дате в Solr

Сопоставление по дате поля в solr определяется как:

{!boost b=recip(ms(NOW,datefield),3.16e-11,1,1)}

Я повсюду смотрел (примеры: Solr Dismax Config for Boost Scoring и Solr для многозначного поля даты и все они ссылаются на SolrRelevancyFAQ), то же определение, которое используется. Но я обнаружил, что это недостаточно повышает мои результаты. Как я могу повысить эту дату?

Пользователь выполняет поиск двух ключевых слов. Оба элемента содержат оба ключевых слова (в том же порядке) как в заголовке, так и в описании. Ни одно из ключевых слов не повторяется.

И результат отладки solr waaay слишком запутан для меня, чтобы понять проблему.

Теперь это не проблема. 99% запросов работают нормально и дают ожидаемые результаты, поэтому его не похоже на solr вообще не работает, я просто нашел эту ситуацию очень запутанной для меня и не знаю, как продолжить.

Ответы

Ответ 1

Пользователь выполняет поиск двух ключевых слов. Оба элемента содержат оба ключевых слова (в том же порядке) как в заголовке, так и в описании. Ни один из ключевых слов повторяется.

Хорошо, на ваш пример, ясно, что ваши результаты попали в ситуацию tie. Чтобы понять эту проблему запутать отладочный вывод и разработать политику tie-breaker, важно понять dismax.

При запросах dismax разные термины ввода пользователя выполняются в разных полях, если многие из них попадают (термин появляется в разных полях в одном и том же document), используется удар, который оценивается выше, но что происходит с другими подзапросами, которые попали в этот document для термина? Ну, вот что определяет параметр tie. dismax будет вычислять оценку для запроса термина как:

score= [score of the top scoring subquery] + tie * (sum of other hitting subqueries)

Вследствие этого параметр tie представляет собой значение от 0 до 1, которое будет определять, будет ли dismax считать максимальное нажатие score для термина (установка tie= 0), все образы для термина (установка tie= 1) или что-то среднее между этими двумя крайностями.

Параметр boost очень похож на параметр bf, но вместо добавления его результата в итоговый счет он будет умножать его. Это доступно только в расширенном анализаторе запросов Dismax или Lucid Query Parser.

Есть интересная статья Сравнение методов Boost SOLR, которые могут быть вам полезны.

Ссылки для этого ответа:

Шишир

Ответ 2

Функция rec (x, m, a, b) реализует f(x) = a/(xm+b) с помощью:

  • x: возраст документа в мс, определенный как ms(NOW,<datefield>).

  • m: константа, определяющая масштаб времени, который используется для повышения. Это должно быть относительно того, что вы считаете старым возрастом документа (reference_time) в миллисекундах. Например, выбор reference_time в 1 год (3,16e10ms) подразумевает использование его обратного: 3.16e-11 (1/3,16e10 округлено).

  • a и b являются константами (определены произвольно).

  • xm = 1 когда документу равен 1 reference_time old (множитель = a/(1+b)).
    xm ≈ 0 когда документ новый, в результате чего значение близко к a/b.

  • Использование одного и того же значения для a и b гарантирует, что множитель не превысит 1 в последних документах.

  • При a = b = 1 старый документ 1 reference_time имеет множитель около 1/2, старый документ 2 reference_time имеет множитель около 1/3 и т.д.

Как сделать повышение даты сильнее?

  • Увеличьте m: выберите меньшее значение reference_time, например, 6 месяцев, что дает нам m = 6.33e-11. По сравнению со ссылкой на 1 год множитель уменьшается в 2 раза быстрее с увеличением возраста документа.

  • Уменьшение a и b расширяет кривую отклика функции. Это может быть очень агрессивным, см. Этот пример (стр. 8).

  • Применить буст к самой функции буста с помощью параметра bf (Boost Functions) (это параметр dismax, поэтому он требует использования анализатора запросов DisMax или eDisMax), например. :

    bf=recip(ms(NOW,datefield),3.16e-11,1,1)^2.0
    

Важно отметить несколько вещей:

  • bf - аддитивное повышение и действует как бонус, добавляемый к количеству новых документов.

  • {!boost b} является мультипликативным усилением и действует больше как штраф, примененный к оценке более старого документа.

  • Балл bf ("бонус", добавленный к глобальному баллу) рассчитывается независимо от балла релевантности (глобального балла), что означает, что на набор результатов с более высокими баллами может повлиять не столько, сколько на набор результатов с более низкими баллами. Напротив, мультипликативные усиления влияют на оценки одинаково, независимо от релевантности набора результатов, поэтому обычно это предпочтительнее.

  • Не используйте recip() для дат более одного reference_time в будущем, иначе это приведет к отрицательным значениям.

Смотрите также этот очень проницательный пост Нолана Лоусона о сравнении методов повышения в Solr.

Ответ 3

В ReciprocalFloatFunction есть пример, который даст вам четкое представление о том, как работает рецепт повышения эффективности. Если вы обнаружите, что dismax не предлагает вам достаточного контроля над повышением, вам нужно будет немного поработать с BoostQParserPlugin.

Множитель 3.16e-11 изменяет единицы от миллисекунд до лет (так как около 3,16e10 миллисекунд в год). Таким образом, очень в последнее время будет дано значение, близкое к 1/(0 + 1) или 1, дате в год в прошлое получит множитель около 1/(1 + 1) или 1/2, а второй - летний возраст даст 1/(2 + 1) или 1/3.