¿Cómo puedo cambiar la URL de búsqueda de Apache Solr?

12

¿Cómo puedo cambiar la ruta de URL predeterminada de Apache Solr de "search / apachesolr_search / term" a otra?

Markdorison
fuente
3
es una lástima que la publicación de q0rban haya sido votada tantas veces, porque no va a funcionar: jhedstrom da una descripción detallada de por qué simplemente anular el camino con hook_menu_alter se bloqueará y se quemará.
aaronbauman

Respuestas:

3

La forma en que normalmente lo he hecho es implementar hook_menu_alter (). Luego puede personalizar la URL de la manera exacta que elija:

/**
 * 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
fuente
4

No es trivial cambiar la ruta de búsqueda si solo está utilizando el módulo de búsqueda apachesolr. Como depende del módulo de búsqueda principal, la ruta está casi codificada. Depende de la búsqueda / {module} /% menu_tail. Si observa search_view () , la devolución de llamada para el módulo de búsqueda, encontrará que llama a search_get_keys () , que espera que las claves de búsqueda estén en una parte particular de la ruta. El módulo de búsqueda apachesolr también usa esta función para obtener claves, por lo que implementar un simple hook_menu_alter () no funcionará por sí solo.

Como se menciona en otra respuesta aquí, si puede ejecutar Views 3.x, entonces su mejor opción es utilizar el módulo de vistas apachesolr . Con este módulo, puede definir fácilmente cualquier número de rutas personalizadas para los resultados de búsqueda.

Si no puede ejecutar 3.x, deberá usar una combinación de formulario alter (específicamente, search_form) y devoluciones de llamada de menú personalizadas para cambiar con éxito la ruta de búsqueda predeterminada.

jhedstrom
fuente
4

Esto debería funcionar si lo coloca en 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;
      }
    }
  }
}

Y luego, cuando crea una entrada de menú, coloca el enlace a apache solr: search / apachesolr_search /? Filters = tid: 13

Y cree un alias de url para search / apachesolr_search /? Filters = tid: 13 like products / tv.html

Encontrado a través de: http://drupal.org/node/783836#comment-4136475

realityloop
fuente
Tengo la sensación de que esto es para D6. ¿Se adapta fácilmente para D7, como se hizo la pregunta?
pushka
3

Podrías usar vistas solr para la búsqueda de tu sitio.

  1. Crea una vista solr.
  2. Agregue una visualización de página con la ruta que desee
  3. Agregar texto de búsqueda como filtro.
  4. Forma expuesta en bloque
  5. Coloque el bloque donde desea que vaya su cuadro de búsqueda.
Jeremy French
fuente
Esto no funciona
AnAnD
2

Consulte Agregar rutas de búsqueda personalizadas con hook_menu por los chicos de Evolving Web. Habla sobre cómo escribieron un módulo personalizado para crear URL amigables para sus búsquedas de Solr. Probablemente necesites modificarlo un poco, pero es un buen punto de partida.

Benedict Steele
fuente
1

¿Qué pasa con la creación de una nueva devolución de llamada de menú como la siguiente para hacer que apachesolr devuelva resultados en esa ruta?

$menu['search']['page callback'] = 'apachesolr_search_view';
Markdorison
fuente
1

O simplemente puede modificar un módulo contribuido que hace esto: Apache Solr Custom Path .

Ivan Alfaro
fuente
Esto funciona solo para D6
AnAnD
0

Si solo desea cambiar search / apachesolr_search / a otra cosa, por ejemplo 'inventario', puede probar el módulo de redireccionamiento global .

El truco consiste en crear 2 alias: uno para búsqueda / apachesolr_search / (para elementos facetados) y otro sin barra diagonal (para la página de búsqueda principal). La redirección global puede negarse a crear 2 alias para el mismo destino, pero puede insertarlo directamente en la base de datos.

Gansbrest
fuente