laz*_*tem 6 solr drupal drupal-6
使用Apachesolr进行搜索,我想在hook_apachesolr_prepare_query(&$ query)中添加几个过滤器.这很好,除了我希望过滤器扩大搜索范围('OR'),而不是缩小它('AND').
例如,如果我有4个类型的节点:A和3类型:B匹配搜索,则按类型过滤:A和类型:B应返回7个节点(类型:A AND节点类型:B),而不是0那些类型:A也是类型:B.
我看到了使用nodeaccess模型执行此操作的建议
foreach ($filters as $filter) {
$subquery = apachesolr_drupal_query();
if (!empty($subquery)) {
$subquery->add_filter('type', $filter);
$query->add_subquery($subquery);
}
}
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用.(它不会返回任何结果).
然后我尝试(因为我有有限数量的节点类型),不包括我不想要的类型:
$excludes = array('A', 'B', 'C');
$excludes = array_diff($excludes, $filters);
$exclude = implode('&', $excludes);
$query->add_filter('type', $exclude, TRUE);
Run Code Online (Sandbox Code Playgroud)
这种将它们拼接在一起的方法不起作用('&'被转义)但是也没有将它们作为子查询添加,类似于上面的方式.
有关如何做到这一点的任何建议?
小智 2
使用 Drupal7 和最后的 apacheSolr API,您可以通过执行以下操作来执行 OR 过滤器:
function my_module_apachesolr_query_alter($query) {
// first, create a subQuery filter to store others
// and specify there is a "OR" condition
$filter = new SolrFilterSubQuery('OR');
// next, add all filters on bundle you want, each as
// a new subQuery filter, always with "OR" condition
// and add it to the primary filter
$a = new SolrFilterSubQuery('OR');
$a->addFilter('bundle', 'A');
$filter->addFilterSubQuery( $a );
$b = new SolrFilterSubQuery('OR');
$b->addFilter('bundle', 'B');
$filter->addFilterSubQuery( $b );
$c = new SolrFilterSubQuery('OR');
$c->addFilter('bundle', 'C');
$filter->addFilterSubQuery( $c );
// finally, add the primary subQuery filter as
// subquery of the current query
$query->addFilterSubQuery( $filter );
Run Code Online (Sandbox Code Playgroud)
}
您的查询搜索有关 A 型或 B 型或 C 型(每种类型的所有结果)。您可以通过更改 SolrFilterSubQuery 实例化的参数来组合 OR / AND。
特别感谢此页面及其作者:http://fr.ench.info/blog/2012/04/03/Add-Filters-ApacheSOLR.html
| 归档时间: |
|
| 查看次数: |
2846 次 |
| 最近记录: |