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); }