如何使用多个过滤器来扩大Apachesolr查询中的搜索范围

时间:2010-08-24 15:25:46

标签: drupal drupal-6 solr

使用Apachesolr进行搜索,我想在hook_apachesolr_prepare_query(& $ query)中添加几个过滤器。这很好,除了我希望过滤器扩大搜索范围('OR'),而不是缩小它('AND')。

例如,如果我有4个类型的节点:A和3类型:B匹配搜索,则按类型过滤:A和类型:B应返回7个节点(类型:A AND类型的节点: B),而不是类型为A的那些:A,它们也是类型:B。

我看到了使用nodeaccess模型

执行此操作的建议
foreach ($filters as $filter) {
  $subquery = apachesolr_drupal_query();
  if (!empty($subquery)) {
    $subquery->add_filter('type', $filter);
    $query->add_subquery($subquery);
  }
}

但这似乎不起作用。 (它不会返回任何结果)。

然后我尝试了(因为我的节点类型数量有限),不包括我不想要的类型:

$excludes = array('A', 'B', 'C');
$excludes = array_diff($excludes, $filters);
$exclude = implode('&', $excludes);
$query->add_filter('type', $exclude, TRUE);

这种将它们拼接在一起的方法不起作用('&'被转义),但也没有将它们作为子查询添加,类似于上面的方式。

有关如何执行此操作的任何建议吗?

2 个答案:

答案 0 :(得分: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 );

}

您的查询搜索类型A或类型B或类型C(所有结果都在每种类型中)。您可以通过更改SolrFilterSubQuery实例的参数来组合OR / AND。

特别感谢此页面及其作者:http://fr.ench.info/blog/2012/04/03/Add-Filters-ApacheSOLR.html

答案 1 :(得分:0)

我没有玩过SOLR,但我很熟悉Drupal和Zend Lucene(或Drupal Lucene API)。

我建议您尝试根据内容类型过滤结果(因为每个节点的内容类型都存储在对象中)。

第二个想法是改变基本运算符。我不确定它是如何在SOLR中完成的,但我是Zend Lucene

  

Zend_Search_Lucene_Search_QueryParser :: setDefaultOperator($ operator)和Zend_Search_Lucene_Search_QueryParser :: getDefaultOperator()方法。

可以在Zend Lucene Docs中找到文档。或者对于SOLR Solr Docs

我希望你的问题正确。

希望它有所帮助: - )