Drupal:如何通过用户/文章构面限制apachesolr搜索结果

时间:2014-11-12 17:17:06

标签: drupal solr drupal-7 hook faceted-search

我有一个用drupal构建的wiki,以及分类类别Workgroup,分配给用户和文章。我正在使用带有facet api的apache solr搜索模块,我的最终目标是设置搜索,以便默认情况下 当用户搜索文章时,只显示其工作组中的文章。

也就是说,当他们从搜索框启动搜索时,他们应该获得与/search/site/hello?f[0]=im_field_kb_workgroups%3A4529(其中4529是一个工作组ID)相同的结果,而不仅仅是/search/site/hello(当前行为)用户应该仍然可以通过删除构面块中的复选框来在其他工作组构面中进行搜索。

我的工作几乎是通过黑客攻击apachesolr模块(不推荐我知道,但真的希望这个工作)。在函数apachesolr_search_custom_page_search_form_submit中,我有:

  // Get the workgroup id
  global $user;
  $account = user_load($user->uid);
  $user_kb_wg_fieldinfo = field_get_items('user', $account, 'field_kb_workgroups');
  $user_kb_wg_tid= '';
  if ($user_kb_wg_fieldinfo) {
    $user_kb_wg_tid = $user_kb_wg_fieldinfo[0]['tid'];
  }

  // Add the solr filter for this workgroup facet so that by default, search results are
  // fetched only from that workgroup.
  if ($user_kb_wg_tid === '4529') {
    $get['f[0]'] = 'im_field_kb_workgroups:4529';
  }

这可以完成工作,但问题是这依赖于apachesolr搜索表单。我有用户通过从维基外部的站点搜索来到维基,其中维基搜索表单只是一个指向KB域和路径/search的简单POST表单。因此,只有当人们从维基内部搜索时,这才会起作用,我在那里向他们展示了apachesolr搜索表单。

我调查过其他一些选择:

在我的自定义模块中,我实现了这个钩子(现在没有用户工作组检查,用于测试):

function kb_hacks_apachesolr_query_prepare($query) {
  $query->addFilter('im_field_kb_workgroups', '4529');
}

这会过滤掉所有搜索结果,但过滤器会一直应用,用户无法取消选择此过滤器或其他过滤器。 (实际上,只有当使用f [0]将过滤器作为GET参数传递时,才会出现其他过滤器)

我也玩过url_inbound_alter钩子,但无法弄清楚如何将solr查询参数作为GET传递。以下不起作用。

function kb_hacks_url_inbound_alter(&$path, $original_path, $path_language) {
  if ($path == 'search/site/hello') {
    $_GET['f[0]'] = "im_field_kb_workgroups:4529";
    //$_GET['f[0]'] = "im_field_kb_workgroups%3A4529";
    //$path = 'search/site/hello?f[0]=im_field_kb_workgroups%3A4529;
  }
}

有没有办法从这个钩子设置GET参数?但即使这有效,我仍然必须弄清楚如何默认(当提交搜索表单时),而不是取消选择过滤器本身。有没有办法检测构面块中的复选框更改?

也许有另一种方法可以做到这一点?过去两天我一直被困在这里,非常感谢我能得到的任何帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

您可以向分类术语“工作组”添加关系,并为当前用户使用上下文过滤器。在上下文过滤器部分中,您可以在过滤器不存在时更改行为。