在solr中按日期字段提升定义为:
{!boost b=recip(ms(NOW,datefield),3.16e-11,1,1)}
我到处寻找(示例:Solr Dismax Config for Boost Scoring和Solr boost for multivalued date field,它们都引用了SolrRelevancyFAQ),使用了相同的定义。但我发现这并没有充分提升我的结果。如何让这个日期更强大?
用户正在搜索两个关键字。这两个项目在标题和描述中都包含两个关键字(按相同顺序)。两个关键字都没有重复。
而solr调试输出对我来说太麻烦了,无法理解这个问题。
现在,这不是一个大问题。 99%的查询工作正常并产生预期的结果,所以它不像solr根本不起作用,我发现这种情况对我来说非常混乱,不知道如何继续。
答案 0 :(得分:36)
recip(x,m,a,b)通过以下方式实施f(x) = a/(xm+b)
x
:以ms为单位的文档年龄,定义为ms(NOW,<datefield>)
。
m
:一个常量,用于定义用于应用boost的时间刻度。它应该与您认为的旧文档时代( reference_time )相关,以毫秒为单位。例如,选择1年(3.16e10ms)的 reference_time 意味着使用其倒数:3.16e-11
(1 / 3.16e10舍入)。
a
和b
是常量(任意定义)。
xm = 1
)时, 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
会扩展函数的响应曲线。这可能非常激进。示例here(第8页)
使用dismax或edismax查询解析器,使用bf
参数对boost函数本身应用提升:bf=recip(ms(NOW,datefield),3.16e-11,1,1)^2.0
请注意,bf
的行为类似于添加剂:它可以作为奖励添加到较新的文档评分中,而{!boost b}则更多地作为惩罚应用于旧文档的分数。无论如何,使用加法增强可能是提升新文档的好方法。请记住,bf分数与全局分数(相关性)无关,这意味着相关结果集(分数较高)可能不会像无相关结果集(分数较低)那样受影响,因此根据您的需要,它可以很有趣。
答案 1 :(得分:5)
用户正在搜索两个关键字。这两个项都包含两个关键字 (标题和描述中的相同顺序)。这两个关键字都没有 重复。
嗯,通过您的示例,很明显您的结果已陷入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查询解析器或清除查询解析器。
SOLR中有一篇有趣的文章Comparing Boost Methods可能对您有用。
这个答案的参考文献:
Shishir
答案 2 :(得分:1)
ReciprocalFloatFunction中有一个很好的例子,可以让你清楚地了解提升配方的工作原理。如果您发现dismax
无法为您提供足够的控制权,那么您必须对BoostQParserPlugin
进行一些修改。
3.16e-11的乘数将单位从毫秒更改为年 (因为每年约有3.16e10毫秒)。因此,非常 最近的日期将产生接近1 /(0 + 1)或1的值,即一年中的日期 过去将获得约1 /(1 + 1)或1/2和日期2的乘数 年龄将产生1 /(2 + 1)或1/3。