Search Solr中按日期计算的更强增压

Search Solr中按日期计算的更强增压,search,solr,solr4,Search,Solr,Solr4,solr中的“按日期推进”字段定义为: {!boost b=recip(ms(NOW,datefield),3.16e-11,1,1)} 我到处寻找(示例:它们都引用了相同的定义)。但我发现这并没有充分提高我的成绩。我怎样才能让这次约会更精彩 用户正在搜索两个关键字。两个项目在标题和说明中都包含两个关键字(顺序相同)。这两个关键字都不重复 solr调试输出对我来说太混乱了,无法理解这个问题 现在,这不是一个大问题。99%的查询工作正常并产生预期的结果,所以solr一点也不工作,我只是发现这种情

solr中的“按日期推进”字段定义为:

{!boost b=recip(ms(NOW,datefield),3.16e-11,1,1)}
我到处寻找(示例:它们都引用了相同的定义)。但我发现这并没有充分提高我的成绩。我怎样才能让这次约会更精彩

用户正在搜索两个关键字。两个项目在标题和说明中都包含两个关键字(顺序相同)。这两个关键字都不重复

solr调试输出对我来说太混乱了,无法理解这个问题


现在,这不是一个大问题。99%的查询工作正常并产生预期的结果,所以solr一点也不工作,我只是发现这种情况对我来说非常混乱,不知道如何进行。

中有一个非常好的例子,可以让您清楚地了解提升配方是如何工作的。如果您发现
dismax
没有为您提供足够的控制,您将不得不对
BoostQParserPlugin
进行一些修补

乘数3.16e-11将单位从毫秒更改为年 (因为每年大约有3.16e10毫秒)。因此,一个非常 最近日期将产生接近1/(0+1)或1的值,即一年中的日期 过去将得到大约1/(1+1)或1/2的乘数,日期为2 年产量为1/(2+1)或1/3

recip(x,m,a,b)实现
f(x)=a/(xm+b)

  • x
    :以ms为单位的文档年龄,定义为
    ms(现在是)

  • m
    :定义用于应用增压的时间刻度的常数。它应该与你认为一个旧文档时代(参考时间)毫秒有关。例如,选择1年(3.16e10ms)的参考时间意味着使用其倒数:
    3.16e-11
    (1/3.16e10四舍五入)

  • a
    b
    是常数(任意定义)

  • xm=1
    当文档的引用时间为1倍时(乘数=
    a/(1+b)
    )。
    xm≈ 0
    当文档是新文档时,导致值接近
    a/b

  • 对a和b使用相同的值可确保最近的文档乘数不超过1

  • 使用
    a=b=1
    ,1次引用旧文档的乘数约为1/2,2次引用旧文档的乘数约为1/3,依此类推

如何让约会更精彩?

  • 增加
    m
    :选择一个较低的参考时间,例如6个月,这给了我们
    m=6.33e-11
    。与1年参考期相比,随着文档年限的增加,乘数减少的速度快2倍

  • 减小
    a
    b
    会扩展函数的响应曲线。这可能非常具有攻击性,请参见(第8页)

  • 使用参数对boost函数本身应用boost(这是一个demax参数,因此需要使用demax或eDisMax查询解析器),例如:


注意以下几点很重要:

  • bf
    是一种附加功能增强功能,可作为新文档分数的额外奖励

  • {!boost b}
    是一种乘法增强,更像是对旧文档分数的惩罚

  • bf分数(添加到全局分数的“奖金”)是独立于相关性分数(全局分数)计算的,这意味着分数较高的结果集可能不会像分数较低的结果集那样受到影响。相比之下,无论结果集的相关性如何,乘法提升都会以相同的方式影响分数,这就是为什么它通常是首选的原因

  • 对于日期,请勿在将来使用多个参考时间,否则将产生负值

另请参阅Nolan Lawson的这篇非常有见地的文章

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

好的,通过你的例子,很明显你的结果已经陷入了一个平局。要理解混淆的问题调试输出并设计一个连接断路器策略,理解这一点很重要

使用
DisMax
查询时,用户输入的不同术语针对不同字段执行,如果其中许多术语命中(该术语出现在同一
文档的不同字段中),则使用得分较高的命中,但是在该
文档中命中该术语的其他子查询会发生什么情况?这就是
tie
参数所定义的
DisMax
将计算术语查询的分数,如下所示:

score= [score of the top scoring subquery] + tie * (sum of other hitting subqueries)
<> P>><代码> TIG/<代码>参数是一个0到1之间的值,它将定义“<代码> DISMAX < /C> >只考虑最大命中<代码>分数>代码>一个术语(设置<代码> TIG/<代码>=0),一个词的所有命中(设置<代码> TIG/<代码>=1)或这两个极端之间的某个东西。
boost
参数与
bf
参数非常相似,但它不会将其结果添加到最终分数中,而是将其相乘。这仅在扩展的Demax查询解析器Lucid查询解析器中可用

SOLR有一篇有趣的文章,可能对你有用

本答案的参考文献:


Shishir

因此,基本上你想知道你正在使用的助推是如何工作的,为了使当前(更接近现在)的文档更具相关性,你需要了解哪些值需要更改?是的,哪些值以及如何更改(正/负、大或小)……你说的“必须做一些修补”是什么意思
score= [score of the top scoring subquery] + tie * (sum of other hitting subqueries)