Более сильное повышение по дате в Solr
Поле увеличения по дате в solr определяется как:
{!boost b=recip(ms(NOW,datefield),3.16e-11,1,1)}
Я посмотрел везде (примеры: Solr Dismax Config для ускоренной оценки и Solr boost для многозначного поля даты, и все они ссылаются на SolrRelevancyFAQ), то же определение используется. Но я обнаружил, что это недостаточно повышает мои результаты. Как я могу сделать эту дату бустинг сильнее?
Пользователь ищет два ключевых слова. Оба элемента содержат оба ключевых слова (в том же порядке) как в заголовке, так и в описании. Ни одно из ключевых слов не повторяется.
И вывод отладочной информации solr слишком сложен для понимания проблемы.
Теперь это не огромная проблема. 99% запросов работают нормально и дают ожидаемые результаты, так что это не так, как solr вообще не работает, я просто нашел эту ситуацию, которая меня очень смущает, и я не знаю, как действовать дальше.
3 ответа
Пользователь ищет два ключевых слова. Оба элемента содержат оба ключевых слова (в том же порядке) как в заголовке, так и в описании. Ни одно из ключевых слов не повторяется.
Ну, по вашему примеру, ясно, что ваши результаты оказались в tie
ситуация. Чтобы понять эту проблему путаницы вывода отладки и разработать политику тай-брейка, важно понять, 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.
Есть интересная статья Сравнение методов повышения SOLR, которая может быть полезна для вас.
Ссылки на этот ответ:
Шишир
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, старый документ 1 reference_time имеет множитель около 1/3 и так далее.
Как сделать дату бустинга сильнее?
Увеличение
m
: выберите более низкое reference_time, например, 6 месяцев, что дает намm = 6.33e-11
, По сравнению со ссылкой на 1 год множитель уменьшается в 2 раза быстрее с увеличением возраста документа.убывающий
a
а такжеb
расширяет кривую отклика функции. Это может быть очень агрессивным. Пример здесь (стр. 8)Применить усиление к самой функции усиления с помощью
bf
параметр, использующий анализатор запросов dismax или edismax:bf=recip(ms(NOW,datefield),3.16e-11,1,1)^2.0
Обратите внимание, что bf
ведет себя как аддитивное повышение: оно действует как бонус, добавляемый к более новой оценке документа, тогда как {!boost b} действует больше как штраф, применяемый к оценке более старого документа. В любом случае, использование аддитивного ускорения может быть хорошим способом повысить эффективность новых документов. Просто помните, что показатель bf не зависит от общего показателя (релевантности), а это означает, что на релевантный набор результатов (с более высокими показателями) может повлиять не столько, сколько на релевантный набор результатов (с более низкими показателями), поэтому в зависимости от ваших потребностей он может быть интересным
В функции ReciprocalFloatFunction очень хорошо представлен пример, который даст вам четкое представление о том, как работает рецепт повышения. Если вы найдете это dismax
не дает вам достаточного контроля над бустингом, вам придется немного повозиться с BoostQParserPlugin
,
Множитель 3,16e-11 меняет единицы измерения с миллисекунд на годы (так как в год это около 3,16e10 миллисекунд). Таким образом, очень недавняя дата даст значение, близкое к 1/(0+1) или 1, дата в прошлом году получит множитель около 1/(1+1) или 1/2, а дата два лет даст 1/(2+1) или 1/3.