如何更改Apache Solr搜索URL?


12

如何将默认的Apache Solr URL路径从“ search / apachesolr_search / term”更改为其他内容?


3
太糟糕了,q0rban的帖子被投票了很多次,因为它行不通-jhedstrom详细说明了为什么简单地用hook_menu_alter覆盖路径会崩溃并烧毁。
aaronbauman 2011年

Answers:


3

我通常这样做的方法是实现hook_menu_alter()。然后,您可以按照选择的确切方式自定义网址:

/**
 * Implements hook_menu_alter().
 */
function example_menu_alter(&$menu) {
  // Ensure Apache Solr is the default and that the menu item exists.
  if (variable_get('apachesolr_search_make_default', 0) && isset($menu['search/apachesolr/%menu_tail'])) {
    $menu['search/%menu_tail'] = $menu['search/apachesolr/%menu_tail'];
    unset($menu['search/apachesolr/%menu_tail']);
  }
}

4

如果仅使用apachesolr搜索模块,则更改搜索路径并非易事。由于它取决于核心搜索模块,因此路径几乎是硬编码的。这取决于search / {module} /%menu_tail。如果查看search_view()(搜索模块的回调,您会发现它调用search_get_keys(),它期望搜索键位于路径的特定部分。apachesolr搜索模块也使用此函数来获取密钥,因此实现简单的hook_menu_alter()不能单独工作。

如此处另一个答案所述,如果您能够运行Views 3.x,那么最好的选择是使用apachesolr views模块。使用此模块,您可以轻松定义搜索结果的任意数量的自定义路径。

如果您无法运行3.x,则需要使用表单alter(特别是search_form)和自定义菜单回调的组合来成功更改默认搜索路径。


4

如果将其放置在settings.php中,则应该可以使用:

function custom_url_rewrite_outbound(&$path, &$options, $original_path) {
  // Filter to get only the apache solr links with filters so it doesn't launch it for every link of our website
  if ($path == 'search/apachesolr_search/' && strpos($options['query'], 'filters') !== FALSE) {
    $new_path = $path.'?'.urldecode($options['query']);
    // See if we have a url_alias for our new path
    $sql = 'SELECT dst FROM {url_alias} WHERE src="%s"';
    $row = db_result(db_query($sql, $new_path));
    // If there is a dst url_alia, we change the path to it and erase the query
    if ($row) {
      $path = $row;
      $options['query'] = '';
    }
  }
}

function custom_url_rewrite_inbound(&$result, $path, $path_language) {
  // See if we have a url_alias for our new path
  $sql = 'SELECT src FROM {url_alias} WHERE dst="%s"';
  $row = db_result(db_query($sql, $path));
  if ($row) {
    // We found a source path
    $parts = preg_split('/[\?\&]/', $row);
    if (count($parts) > 1) {
      $result = array_shift($parts);
      // That's important because on my website, it doesn't work with the / at the end of result
      if ($result[strlen($result) - 1] == '/') {
        $result = substr($result, 0, strlen($result) - 1);
      }
      // Create the $_GET with the filter
      foreach ($parts as $part) {
        list($key, $value) = explode('=', $part);
        $_GET[$key] = $value;
        // Add this because the pager use the $_REQUEST variable to be set
        $_REQUEST[$key] = $value;
      }
    }
  }
}

然后在创建菜单项时,将链接放置到apache solr:search / apachesolr_search /?filters = tid:13

并为search / apachesolr_search /?filters = tid:13创建一个URL别名,例如products / tv.html

通过以下网址找到:http//drupal.org/node/783836#comment-4136475


我觉得这是给D6的。如问题所问,它很容易适应D7吗?
pushka,2011年

3

您可以使用solr视图进行站点搜索。

  1. 创建一个Solr视图。
  2. 添加具有所需路径的页面显示
  3. 添加搜索文本作为过滤器。
  4. 块中的暴露形式
  5. 将块放在您希望搜索框移动的位置。

这不起作用
AnAnD 2013年


1

如何创建一个新的菜单回调(如下所示)以使apachesolr在该路径上返回结果呢?

$menu['search']['page callback'] = 'apachesolr_search_view';


0

如果您只想将search / apachesolr_search /更改为其他内容(例如“库存”),则可以尝试使用全局重定向模块。

诀窍是创建2个别名-一个用于search / apachesolr_search /(用于多面项目),另一个用于不带斜杠(对于主搜索页面)。全局重定向可能会拒绝为同一目标创建2个别名,但是您可以将其直接插入数据库中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.