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

标签 drupal drupal-6 solr

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

例如,如果我有 4 个类型为:A 的节点和 3 个类型为:B 的节点与搜索匹配,则按类型:A 和类型:B 进行过滤应返回 7 个节点(类型为:A 且节点类型为: B),而不是 0 那些类型为:A 且类型为:B 的值。

我看到有人建议使用节点访问模型来做到这一点

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

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

关于如何做到这一点有什么建议吗?

最佳答案

使用 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

关于drupal - 如何使用多个过滤器来扩大 Apachesolr 查询中的搜索范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3558094/

相关文章:

apache - 需要忽略 apache solr 查询搜索中的破折号 ("- ")

php - 移动drupal站点后Mysql异常PDOException : SQLSTATE[HY000] [2013]

Drupal:显示警告

drupal-6 - 如何将自定义表单插入 Drupal 节点 View 并在提交时处理节点数据?

mysql - drupal 中选择查询的正确语法是什么

solr - 突出显示 Solr 字段

php - Drupal View - 如何使用 "Rewrite the output of this field"删除字符串模式?

php - drupal 中每个请求调用的许多查询

php - drupal 在我的 Windows XP 本地主机上运行速度非常慢

java - 无法在 DSE SOLR 中重新索引