如何编写Solr FunctionQuery来提升未来日期的文档?

时间:2014-01-23 17:21:00

标签: search solr relevance

我试图在未来最接近现在的特定日期推动记录到结果的顶部,并使那些过去日期不太相关的记录。我已经看过一些关于如何提高结果的帖子,这些结果已经接近现在,但这并不是我真正需要的。

2 个答案:

答案 0 :(得分:3)

您想要做的是:

  1. 知道日期是将来还是过去
  2. 为每种情况使用不同的增强功能
  3. 假设字段名称为 due_date ,我们将开始构建您的查询。

    首先,你想得到时差。

    &timediff=ms(due_date,NOW)
    

    您现在/现在可以使用NOW / HOUR,以获得更好的性能

    其次,我们需要知道持续时间是正还是负:在正数上加一个数字将在正数时返回1 / true,在负数时返回0 / false。

    &future=sum($timediff,abs($timediff)
    

    现在,根据数字是正数还是负数,您需要应用不同的增强功能。您可以在此处使用任何您想要的功能。

    &futureboost=recip($timediff,1,36000000,36000000)
    &pastboost=recip($timediff,1,3600000,3600000)
    $finalboost=if($future,$futureboost,$pastboost)
    &boost=$finalboost
    

    请注意,futureboost参数比pastboost多10倍,这将比未来的文档提供更高的未来文档。 recip函数记录在Solr Function Query page上,您可以将futureboost和pastboost函数的参数调整到您的案例中。

    要返回功能值,您可以使用:

    &fl=_DATE_BOOST_:$finalboost
    

    完整查询将是以上所有内容的组合:

    &timediff=ms(due_date,NOW/HOUR)
    &future=sum($timediff,abs($timediff)
    &futureboost=recip($timediff,1,36000000,36000000)
    &pastboost=recip($timediff,1,3600000,3600000)
    $finalboost=if($future,$futureboost,$pastboost)
    &boost=$finalboost
    &fl=_DATE_BOOST_:$finalboost
    

答案 1 :(得分:0)

通过应用以下提升查询来解决它:

bq=movie_release_date:[NOW/DAY-1MONTH TO NOW/DAY+2MONTHS]^10

不像之前的答案那么准确,但如果你缺少Solr 4,它的结果几乎相同。