9

是否可以在 Solr 中提升布尔字段以使其获得更高的分数?

我们有一个看起来有点像这样的索引:

  • 文档 ID
  • 标题
  • 描述
  • 关键词
  • is_reviewed

搜索时,已审核的文档(即 is_reviewed = true)的权重应高于未审核的文档,而不是完全排除它们。

使用is_review:true^100似乎不起作用,并排除未审查的项目,而不是仅仅给它们较低的权重。如果有不同的方法可以实现?谢谢!

4

2 回答 2

10

一些查询解析器具有专门用于这种用途的功能。例如,dismax 查询解析器有一个boost 查询bq,它允许您通过将其子句添加到原始查询来提升与查询匹配的文档。还有一个boost 函数bf,它允许您将分数乘以函数的结果。例如,is_review作为这个bf参数使用,

  • 每个未定义字段的文档的分数is_review将乘以 0。
  • 每个文档的分数,因此is_review=false将乘以 1。
  • 每个文档的分数is_review=true将乘以 2。

is_review:true^100AND除非您用作默认查询运算符,否则不应排除未审查的项目。在这种情况下,您可以尝试替换is_review:true^100(is_review:true^100 OR is_review:false^0).

如果您对 dismax 查询解析器的 boost 功能感兴趣,但想坚持使用默认查询解析器,您可以使用boost 查询解析器,它允许您将任何查询的分数与任何函数相乘。

于 2012-04-11T21:30:02.130 回答
4

德鲁巴

这是使用 Drupal CMS 的人的解决方案。

首先,在模式浏览器中的 /solr/admin/schema.jsp 中找到您的字段名称

然后,根据您使用的模块,尝试以下示例:

Apachesolr 模块

代码示例:

/**
 * Implements hook_apachesolr_query_alter().
 */
function hook_apachesolr_query_alter(DrupalSolrQueryInterface $query) {
  $query->addParam('bq', array('is_review' =>
    '(is_review:true^100 OR is_review:false^0)'
  ));
}

搜索 Solr API 模块

代码示例:

/**
 * Implements hook_search_api_solr_query_alter().
 */
function hook_search_api_solr_query_alter(&$call_args, SearchApiQueryInterface $query) {
  $call_args['params']['bq'][] = '(is_review:true^100 OR is_review:false^0)';
}
于 2013-01-14T17:16:59.207 回答