Solr的日期提升

时间:2014-02-25 14:47:08

标签: search solr solr4

在solr中按日期字段提升定义为:

{!boost b=recip(ms(NOW,datefield),3.16e-11,1,1)}

我到处寻找(示例:Solr Dismax Config for Boost ScoringSolr boost for multivalued date field,它们都引用了SolrRelevancyFAQ),使用了相同的定义。但我发现这并没有充分提升我的结果。如何让这个日期更强大?

用户正在搜索两个关键字。这两个项目在标题和描述中都包含两个关键字(按相同顺序)。两个关键字都没有重复。

而solr调试输出对我来说太麻烦了,无法理解这个问题。

现在,这不是一个大问题。 99%的查询工作正常并产生预期的结果,所以它不像solr根本不起作用,我发现这种情况对我来说非常混乱,不知道如何继续。

3 个答案:

答案 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舍入)。

  • ab是常量(任意定义)。

  • 当文档为1 reference_time old(乘数= 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倍。

  • 减少ab会扩展函数的响应曲线。这可能非常激进。示例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。