Solr 中按日期更强的提升
Posted
技术标签:
【中文标题】Solr 中按日期更强的提升【英文标题】:Stronger boosting by date in Solr 【发布时间】:2014-03-27 21:04:09 【问题描述】: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 根本不工作,我只是发现这种情况让我很困惑,不知道如何进行。
【问题讨论】:
所以基本上你想知道你正在使用的提升是如何工作的,了解你需要更改哪些值,以使当前(更接近现在)文档更相关? 是的,哪些值以及如何(正/负,大或小)... 【参考方案1】:recip(x, m, a, b) 使用 f(x) = a/(xm+b)
实现:
x
:文档年龄,单位为毫秒,定义为ms(NOW,<datefield>)
。
m
:一个常数,它定义了一个用于应用提升的时间尺度。它应该与您认为的旧文档年龄(reference_time)相关,以毫秒为单位。例如,选择 1 年 (3.16e10ms) 的 reference_time 意味着使用其倒数:3.16e-11
(1/3.16e10 舍入)。
a
和 b
是常量(任意定义)。
xm = 1
当文档是 1 reference_time 旧时(乘数 = a/(1+b)
)。xm ≈ 0
当文档是新文档时,导致值接近 @ 987654334@.
对 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
会扩展函数的响应曲线。这可能非常激进,请参阅this example(第 8 页)。
使用bf
(Boost Functions) 参数(这是一个dismax 参数,因此需要使用DisMax 或eDisMax 查询解析器)对boost 函数本身应用一个boost,例如。 :
bf=recip(ms(NOW,datefield),3.16e-11,1,1)^2.0
注意几点很重要:
bf
是一种附加提升,并作为添加到较新文档的分数中的奖励。
!boost b
是一种乘法提升,更像是一种惩罚应用于旧文档的分数。
bf 分数(添加到全局分数的“奖励”)的计算独立于相关性分数(全局分数),这意味着具有较高分数的结果集可能不会像具有较低的分数。相比之下,无论结果集相关性如何,乘法提升都会以相同的方式影响分数,这就是为什么它通常是首选的原因。
不要将recip()
用于未来超过一个reference_time 的日期,否则会产生负值。
另请参阅 Nolan Lawson 在Comparing boost methods in Solr 上发表的这篇非常有见地的帖子。
【讨论】:
是的,这是一个非常彻底的解释。我希望这是公认的答案。 很好的解释,非常有用。 xm = 1附近的小错字:乘数需要括号,即a/(1+b) ...但是,我无法得到匹配的数学:您的 6 个月示例似乎不正确 - 它不会像 m = 1/(0.5*3.16e10) = 6.33 e-11? @corolla 你说得对,当使用 6 个月作为参考 m=6.3e-11 四舍五入时,我不知道我从哪里得到了 'e-8' ......谢谢你的指点出来了!【参考方案2】:用户正在搜索两个关键字。两个项目都包含两个关键字 (以相同的顺序)在标题和描述中。两个关键字都没有 重复。
嗯,通过你的例子,很明显你的结果已经落入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
参数非常相似,但不是将其结果与最终得分相加,而是将其相乘。这仅在 Extended Dismax Query Parser 或 Lucid Query Parser 中可用。
SOLR 有一篇有趣的文章Comparing Boost Methods 可能对你有用。
此答案的参考资料:
Advanced Apache Solr boosting: a case study Using Solr’s Dismax Tie Parameter希希尔
【讨论】:
这似乎是一个可能的问题,现在我只需要尝试找到一种在 php 中实现它的方法。谢谢。【参考方案3】:ReciprocalFloatFunction 中有一个很好的示例,可以让您清楚地了解增强配方的工作原理。如果您发现dismax
无法为您提供对增强的足够控制,您将不得不对BoostQParserPlugin
进行一些修改。
乘数 3.16e-11 将单位从毫秒更改为年 (因为每年大约有 3.16e10 毫秒)。因此,一个非常 最近的日期将产生接近 1/(0+1) 或 1 的值,即一年中的日期 过去将获得大约 1/(1+1) 或 1/2 的乘数,并且日期为 2 岁将产生 1/(2+1) 或 1/3。
【讨论】:
“必须做一些修补”是什么意思? 这个有点过时,但仍然相关nolanlawson.com/2012/06/02/comparing-boost-methods-in-solr。它将为您提供所有可用增强方法的比较。我所说的修修补补的意思是,您将实现/扩展 BoostQParserPlugin 以生成自己的 BoostedQuery 或构建自定义请求处理程序来实现相同目的。这可能是您的场景的过度拉伸,请查看 edismax 的乘法提升。 typo3-media.com/blog/solr-recip-boosting.html - 在这里你可以测试你的接收函数。以上是关于Solr 中按日期更强的提升的主要内容,如果未能解决你的问题,请参考以下文章
体积更大性能与散热更强的技嘉RTX3080 XTREME大雕开箱,附RTX2070s对比评测