Более сильное повышение по дате в 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.