将日期提升添加到复杂的SOLR查询

时间:2010-02-01 19:38:27

标签: solr

我目前有一个SOLR查询,它使用查询(q),查询字段(qf)和短语字段(pf)来检索我想要的结果。一个例子是:

/solr/select
?q=superbowl
&qf=title^3+headline^2+intro+fulltext
&pf=title^3+headline^2+intro+fulltext
&fl=id,title,ts_modified,score
&debugQuery=true

这个想法是“主要项目”的标题和标题给出了结果“约”的最佳指示,但是介绍和全文也提供了一些输入。即,想象一个链接集合,其中集合本身具有元数据(它是它的集合),但每个链接都有它自己的数据(链接的标题,概要等)。如果我们搜索“superbowl”,最相关的结果是在集合元数据中有“superbowl”的那些,最不相关的结果是那些在其中一个链接的概要中有“superbowl”的结果......但是它们是所有有效的结果。

我要做的是增加相关性分数,以便最新的结果浮动到顶部,但保留标题,标题,介绍,全文作为公式的一部分。集合元数据中搜索字符串的最新结果将仅与链接元数据中的搜索字符串相关...但是“仅链接”最近的结果可能比具有搜索字符串的非常旧的结果更具相关性。集合元数据。 (我希望有点清楚)。

问题在于我无法弄清楚如何将SOLR站点上记录的boost函数与qf / pf字段的使用结合起来。具体地说...

从SOLR网站开始,以下内容可以按日期推进结果:

/solr/select
?q={!boost%20b=$dateboost%20v=$qq}
&dateboost=ord(ts_modified)
&qq=superbowl
&fl=ts_modified,score
&debugQuery=true

但是,我无法弄清楚如何将该查询与qf和pf的使用相结合。任何建议都会受到欢迎。

感谢danben的回应,我能够提出以下建议:

/solr/select
?q={!boost%20b=$dateboost%20v=$qq%20defType=dismax}
&dateboost=ord(ts_modified)
&qq=superbowl
&qf=title^3+headline^2+intro^2+fulltext
&pf=title^3+headline^2+intro^2+fulltext
&fl=ts_modifieds,score
&debugQuery=true

看起来我遇到的实际问题是:

  • 我在q param中留下空格而不是在复制/粘贴时转义它们(%20)
  • 我没有在我的q param中包含defType = dismax,因此它会关注qf / pf参数

2 个答案:

答案 0 :(得分:4)

查看http://wiki.apache.org/solr/SolrRelevancyFAQ#How_can_I_boost_the_score_of_newer_documents

这是基于ms函数,它返回两个时间戳/日期之间的毫秒差异,ReciprocalFloatFunction随着传递的值减少而增加。

由于您使用的是DisMaxRequestHandler,因此可能需要使用bq / bf参数指定查询。来自http://lucene.apache.org/solr/api/org/apache/solr/handler/DisMaxRequestHandler.html

  

bq - (Boost Query)一个原始的lucene查询,将包含在   用户查询以影响分数。如果   这是一个默认的BooleanQuery   提升(1.0f),然后是个人   条款将直接添加到   主要查询。否则,查询将   按原样包括在内。这个参数可以   指定多次,和   提升是附加的。注意:   上面列出的行为仅在   如果一个bq参数是效果   指定。因此你可以通过它禁用它   指定一个额外的空白bq   参数。

     

bf - (升压功能)功能(带可选升压功能)即可   包含在用户查询中   影响得分。格式是:   “FuncA的行(ARG1,ARG2)^ 1.2   funcB(arg3,arg4)^ 2.2“。注意:   不允许有空格   函数参数。这个参数可以   指定多次,和   功能是附加的。

答案 1 :(得分:0)

这是一篇关于日期提升Solr搜索结果的好文章:

http://www.metaltoad.com/blog/date-boosting-solr-drupal-search-results


在Drupal中,可以通过以下代码简单地实现:

使用Apachesolr模块

/**
 * Implements hook_apachesolr_query_alter().
 */
function hook_search_apachesolr_query_alter(DrupalSolrQueryInterface $query) {
  $query->addParam('bf', array('freshness' =>
    'recip(abs(ms(NOW/HOUR,dm_field_date)),3.16e-11,1,.1)'
  ));
}