Drupal 7过滤SOLR结果

时间:2020-03-05 15:25:32  来源:igfitidea点击:

搜索在内容驱动的中扮演着至关重要的角色。
Drupal与开源企业搜索平台Solr形成了有效的结合。

Drupal7具有apachesolr模块,该模块将Drupal与apachesolr搜索平台集成。

我将详细介绍如何修改solr查询以获得更好、更精确的结果。

用例:

  • 我们可以将结果集限制为特定的内容类型
  • 仅搜索特定字段
  • 修改字段权重
  • 基于条件限制结果

等等。

使用的挂钩:

我们需要使用hook_apachesolr_query_prepare($query)钩子来添加自定义参数。

限制结果集:

让我们编写一个简单的查询,将结果限制为两种内容类型,

function MODULE_search_apachesolr_query_prepare($query) {

  $compiled_filter = new SolrFilterSubQuery('OR');

  $compiled_filter->addFilter('bundle', 'student');

  $compiled_filter->addFilter('bundle', 'teacher');

  $query->addFilterSubQuery($compiled_filter);

}

搜索特定字段:

只搜索特定字段,

$query->addParam('qf','label')

上面的参数使solr只能在label字段中搜索。

$query->addParam('qf','label content')

上面的参数使solr只能在label和content字段中搜索。

字段权重

$query->addParam('qf','content^3 label^5')

上面的代码指定了字段权重。
含义标签的优先级高于内容。
Label是此处的节点标题。

嵌套筛选器:

假设我们有validity字段,基于它,我们只希望接收保留旧日期记录的有效记录。

 
  $filter2 = new SolrFilterSubQuery('AND');

  $filter2->addFilter('bundle', 'student');

  $filter2->addFilter('dm_field_student_validity','[NOW TO *]');

接收有效期不小于当前日期的学生。
你可以嵌套多个过滤器,

function MODULE_apachesolr_query_prepare($query) {

  $filter = new SolrFilterSubQuery('AND');

  $filter->addFilter('bundle', 'student');

  $filter->addFilter('dm_field_student_validity','[NOW TO *]');

 

 

  $compiled_filter = new SolrFilterSubQuery('OR');

  $compiled_filter->addFilter('bundle', 'teacher');

  $compiled_filter->addFilterSubQuery($filter);

 

  //finally add the compiled filter to main query object
  $query->addFilterSubQuery($compiled_filter);

}