【问题标题】:Adding date boosting to complex SOLR queries向复杂的 SOLR 查询添加日期提升
【发布时间】:2010-02-01 19:38:27
【问题描述】:

我目前有一个 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 参数中留下了空格,而不是在复制/粘贴时转义它们 (%20)
  • 我没有在我的 q 参数中包含 defType=dismax,所以它会注意 qf/pf 参数

【问题讨论】:

    标签: solr


    【解决方案1】:

    查看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) 将包含在 用户查询以影响分数。如果 这是一个带有默认值的 BooleanQuery boost (1.0f),然后是个人 条款将直接添加到 主要查询。否则,查询将 按原样包含在内。这个参数可以是 指定多次,并且 提升是累加的。注意: 上面列出的行为仅在 如果单个 bq 参数为 指定的。因此,您可以通过以下方式禁用它 指定一个额外的空白 bq 参数。

    bf - (增强功能)功能(带有可选增强功能) 包含在用户查询中 影响分数。格式为: "funcA(arg1,arg2)^1.2 funcB(arg3,arg4)^2.2"。注意: 中不允许有空格 函数参数。这个参数可以是 指定多次,并且 函数是相加的。

    【讨论】:

    • 所以,可悲的是,我多次阅读该页面以试图弄清楚。我回去重读了它,因为您似乎认为答案就在那里......我最终通过用 %20 替换查询 (1) 中的空格并将“defType=dismax”信息添加到它。非常感谢。
    • 还有一点需要注意的是,如果您没有使用 TrieFields(在 Solr 1.4 中引入)作为日期,则不能使用 ms 函数。
    【解决方案2】:

    这是一篇关于 Date-boosting 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)'
      ));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-05
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      • 2011-11-28
      • 2014-04-18
      • 1970-01-01
      • 2018-01-20
      相关资源
      最近更新 更多