Shi*_*han 15 search solr solr4
在solr中按日期字段提升定义为:
{!boost b=recip(ms(NOW,datefield),3.16e-11,1,1)}
Run Code Online (Sandbox Code Playgroud)
我到处寻找(例如:Solr Dismax Config for Boost Scoring和Solr boost for more multipleued date field,它们都引用了SolrRelevancyFAQ),使用了相同的定义.但我发现这并没有充分提升我的结果.如何让这个日期更强大?
用户正在搜索两个关键字.这两个项目在标题和描述中都包含两个关键字(按相同顺序).两个关键字都没有重复.
并且solr调试输出对我来说太容易让我理解这个问题了.
现在,这不是一个大问题.99%的查询工作正常并产生预期的结果,所以它不像solr根本不起作用,我发现这种情况对我来说非常混乱,不知道如何继续.
Eri*_*ult 36
recip(x,m,a,b)实现f(x) = a/(xm+b):
x:以ms为单位的文档年龄,定义为ms(NOW,<datefield>).
m:一个常量,用于定义用于应用boost的时间刻度.它应该与您认为的旧文档年龄(reference_time)相关,以毫秒为单位.例如,选择1年的reference_time(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使用dismax或edismax查询解析器使用参数对boost函数本身应用boost :bf
请注意,{!boost b}其行为类似于添加剂:它可以作为奖励添加到较新的文档评分中,而{!boost b}则更多地作为应用于旧文档分数的惩罚.无论如何,使用加法增强可能是提升新文档的好方法.请记住,bf分数与全局分数(相关性)无关,这意味着相关结果集(分数较高)可能不会像无相关结果集(分数较低)那样受影响,因此根据您的需要,它可以很有趣
用户正在搜索两个关键字.这两个项目在标题和描述中都包含两个关键字(按相同顺序).两个关键字都没有重复.
那么,根据你的例子,很明显你的结果已陷入tie困境.要理解混淆调试输出和设计打破平局策略的问题,重要的是要理解dismax.
对于DisMax查询,用户输入的不同术语针对不同的字段执行,如果其中许多字段命中(该术语出现在相同的不同字段中document),则使用得分较高的命中,但是其他子查询会发生什么情况.在这个document期间打?嗯,这就是tie参数定义的内容.DisMax将计算术语查询的分数为:
score= [score of the top scoring subquery] + tie * (sum of other hitting subqueries)
Run Code Online (Sandbox Code Playgroud)
因此,tie参数是介于0和1之间的值,它将定义是否Dismax仅考虑score术语的最大命中(设置tie= 0),术语的所有命中(设置tie= 1)或这两个极端之间的某些内容.
该boost参数与参数非常相似bf,但不是将其结果添加到最终得分,而是将其相乘.这仅适用于Extended Dismax Query Parser或Lucid Query Parser.
有一篇有趣的文章比较 SOLR的Boost方法,这可能对您有用.
这个答案的参考:
Shishir