Come posso modificare l'URL di ricerca di Apache Solr?


12

Come posso cambiare il percorso URL predefinito di Apache Solr da "search / apachesolr_search / term" a qualcos'altro?


3
è un peccato che il post di q0rban sia stato votato così tante volte, perché non funzionerà - jhedstrom fornisce una descrizione completa del perché semplicemente scavalcare il percorso con hook_menu_alter andrà in crash e brucerà.
aaronbauman,

Risposte:


3

Il modo in cui l'ho fatto di solito è implementare hook_menu_alter (). È quindi possibile personalizzare l'URL esattamente come si sceglie:

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

Modificare il percorso di ricerca non è banale se si utilizza solo il modulo di ricerca apachesolr. Poiché dipende dal modulo di ricerca principale, il percorso è quasi codificato. Dipende da search / {module} /% menu_tail. Se guardi search_view () , il callback per il modulo di ricerca, scoprirai che chiama search_get_keys () , che si aspetta che le chiavi di ricerca si trovino in una parte particolare del percorso. Anche il modulo di ricerca apachesolr usa questa funzione per ottenere le chiavi, quindi implementare un semplice hook_menu_alter () non funzionerà da solo.

Come menzionato in un'altra risposta qui, se sei in grado di eseguire Views 3.x, la soluzione migliore è utilizzare il modulo views di apachesolr . Con questo modulo, è possibile definire facilmente qualsiasi numero di percorsi personalizzati per i risultati della ricerca.

Se non riesci a eseguire 3.x, dovrai utilizzare una combinazione di form alter (in particolare, search_form) e callback di menu personalizzati per modificare correttamente il percorso di ricerca predefinito.


4

Questo dovrebbe funzionare se lo metti in 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 poi quando crei una voce di menu, inserisci il link in apache solr: search / apachesolr_search /? Filters = tid: 13

E crea un alias URL per search / apachesolr_search /? Filters = tid: 13 like products / tv.html

Trovato via: http://drupal.org/node/783836#comment-4136475


Ho la sensazione che questo sia per D6. È facilmente adattato per D7, come la domanda posta?
pushka,

3

È possibile utilizzare le visualizzazioni solr per la ricerca del sito.

  1. Crea una vista solr.
  2. Aggiungi una visualizzazione di pagina con il percorso desiderato
  3. Aggiungi il testo di ricerca come filtro.
  4. Forma esposta in blocco
  5. Posiziona il blocco nel punto in cui desideri posizionare la casella di ricerca.

Questo non funziona
AnAnD


1

Che ne dici di creare un nuovo callback di menu come il seguente per fare in modo che apachesolr restituisca risultati in quel percorso?

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


0

Se vuoi solo cambiare ricerca / apachesolr_search / in qualcos'altro, ad esempio "inventario", puoi provare il modulo di reindirizzamento globale .

Il trucco è creare 2 alias: uno per search / apachesolr_search / (per gli elementi sfaccettati) e un altro senza barra (per la pagina di ricerca principale). Il reindirizzamento globale potrebbe rifiutare di creare 2 alias per la stessa destinazione, ma è possibile inserirlo direttamente nel db.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.