Como posso alterar o URL de pesquisa do Apache Solr?

12

Como posso alterar o caminho padrão da URL do Apache Solr de "search / apachesolr_search / term" para outra coisa?

markdorison
fonte
3
é uma pena que o post de q0rban tenha sido votado tantas vezes, porque não vai funcionar - jhedstrom fornece uma descrição completa de por que simplesmente substituir o caminho com hook_menu_alter irá falhar e queimar.
aaronbauman

Respostas:

3

A maneira como normalmente faço isso é implementar hook_menu_alter (). Você pode personalizar o URL da maneira exata que escolher:

/**
 * 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']);
  }
}
q0rban
fonte
4

Não é trivial alterar o caminho de pesquisa se você estiver usando apenas o módulo de pesquisa apachesolr. Como depende do módulo de pesquisa principal, o caminho é quase codificado. Depende da pesquisa / {module} /% menu_tail. Se você olhar em search_view () , o retorno de chamada para o módulo de pesquisa, verá que ele chama search_get_keys () , que espera que as chaves de pesquisa estejam em uma parte específica do caminho. O módulo de pesquisa apachesolr também usa essa função para obter chaves, portanto, implementar um simples hook_menu_alter () não funcionará por si só.

Como mencionado em outra resposta aqui, se você é capaz de executar o Views 3.x, sua melhor aposta é usar o módulo apachesolr views . Com este módulo, você pode definir facilmente qualquer número de caminhos personalizados para os resultados da pesquisa.

Se você não pode executar o 3.x, precisará usar uma combinação de retorno de chamada de alteração de formulário (especificamente, search_form) e menu personalizado para alterar com êxito o caminho de pesquisa padrão.

jhedstrom
fonte
4

Isso deve funcionar se você o colocar em 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;
      }
    }
  }
}

E então, quando você cria uma entrada de menu, coloca o link para apache solr: search / apachesolr_search /? Filters = tid: 13

E crie um alias de URL para search / apachesolr_search /? Filters = tid: 13 como products / tv.html

Encontrado em: http://drupal.org/node/783836#comment-4136475

realityloop
fonte
Eu sinto que isso é para D6. É facilmente adaptável ao D7, conforme a pergunta?
pushka
3

Você pode usar visualizações simples para a pesquisa no site.

  1. Crie uma vista de solr.
  2. Adicione uma exibição de página com o caminho que você deseja
  3. Adicione texto de pesquisa como um filtro.
  4. Forma exposta no bloco
  5. Coloque o bloco onde deseja que sua caixa de pesquisa vá.
Jeremy French
fonte
Isso não funciona
Anand
2

Confira Adicionando caminhos de pesquisa personalizados com hook_menu pelos caras da Evolving Web. Ele fala sobre como eles escreveram um módulo personalizado para criar URLs amigáveis ​​para suas pesquisas no Solr. Você provavelmente precisará ajustá-lo um pouco, mas é um bom ponto de partida.

Benedict Steele
fonte
1

Que tal criar um novo retorno de chamada de menu como o seguinte para fazer com que o apachesolr retorne resultados nesse caminho?

$menu['search']['page callback'] = 'apachesolr_search_view';
markdorison
fonte
0

Se você quiser apenas alterar search / apachesolr_search / para outra coisa, por exemplo 'inventário', tente o módulo de redirecionamento global .

O truque é criar dois aliases - um para search / apachesolr_search / (para itens facetados) e outro sem barra (à página principal de pesquisa). O redirecionamento global pode se recusar a criar 2 aliases para o mesmo destino, mas você pode inseri-lo no db diretamente.

gansbrest
fonte