Wie kann ich die Apache Solr-Such-URL ändern?

12

Wie kann ich den standardmäßigen Apache Solr-URL-Pfad von "search / apachesolr_search / term" in einen anderen ändern?

Markdorison
quelle
3
Es ist schade, dass der Beitrag von q0rban so oft gewählt wurde, weil er nicht funktionieren wird. jhedstrom beschreibt ausführlich, warum ein einfaches Überschreiben des Pfads mit hook_menu_alter zum Absturz und zum Brennen führt.
Aaronbauman

Antworten:

3

Normalerweise habe ich dazu hook_menu_alter () implementiert. Sie können die URL dann genau so anpassen, wie Sie es möchten:

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

Es ist nicht trivial, den Suchpfad zu ändern, wenn Sie nur das Suchmodul apachesolr verwenden. Da dies vom Kern des Suchmoduls abhängt, ist der Pfad nahezu fest codiert. Dies hängt von search / {module} /% menu_tail ab. Wenn Sie search_view () , den Rückruf für das Suchmodul, betrachten, werden Sie feststellen, dass search_get_keys () aufgerufen wird , wodurch erwartet wird, dass sich die Suchschlüssel in einem bestimmten Teil des Pfads befinden. Das Suchmodul von apachesolr verwendet diese Funktion auch zum Abrufen von Schlüsseln, sodass die Implementierung eines einfachen hook_menu_alter () allein nicht funktioniert.

Wie in einer anderen Antwort hier erwähnt, ist die beste Wahl , wenn Sie Views 3.x ausführen können, das Modul apachesolr views zu verwenden . Mit diesem Modul können Sie einfach beliebig viele benutzerdefinierte Pfade für Suchergebnisse definieren.

Wenn Sie 3.x nicht ausführen können, müssen Sie eine Kombination aus Formularänderung (insbesondere search_form) und benutzerdefinierten Menürückrufen verwenden, um den Standardsuchpfad erfolgreich zu ändern.

jhedstrom
quelle
4

Dies sollte funktionieren, wenn Sie es in settings.php platzieren:

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;
      }
    }
  }
}

Und wenn Sie dann einen Menüeintrag erstellen, setzen Sie den Link zu apache solr: search / apachesolr_search /? Filters = tid: 13

Und erstelle einen URL-Alias ​​für search / apachesolr_search /? Filters = tid: 13 like products / tv.html

Gefunden über: http://drupal.org/node/783836#comment-4136475

Realityloop
quelle
Ich habe das Gefühl, das ist für D6. Ist es leicht für D7 anzupassen, wie die Frage gestellt hat?
Pushka
3

Sie können solr-Ansichten für Ihre Site-Suche verwenden.

  1. Erstellen Sie eine Solr-Ansicht.
  2. Fügen Sie eine Seitenanzeige mit dem gewünschten Pfad hinzu
  3. Suchtext als Filter hinzufügen.
  4. Belichtete Form in Block
  5. Platzieren Sie den Block an der Stelle, an der sich Ihr Suchfeld befinden soll.
Jeremy French
quelle
Dies funktioniert nicht
18.
2

Check out Hinzufügen von benutzerdefinierten Suchpfaden mit hook_menu von den Jungs von Evolving Web. Es geht darum, wie sie ein benutzerdefiniertes Modul geschrieben haben, um benutzerfreundliche URLs für ihre Solr-Suchen zu erstellen. Sie müssen es wahrscheinlich etwas anpassen, aber es ist ein guter Ausgangspunkt.

Benedict Steele
quelle
1

Wie wäre es, einen neuen Menü-Callback wie den folgenden zu erstellen, damit apachesolr auf diesem Pfad Ergebnisse zurückgibt?

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

Oder Sie können einfach ein dazu beigetragenes Modul ändern: Apache Solr Custom Path .

Ivan Alfaro
quelle
Dies funktioniert nur für D6
und
0

Wenn Sie search / apachesolr_search / nur in etwas anderes ändern möchten, z. B. "Inventar", können Sie das Global Redirect- Modul ausprobieren .

Der Trick besteht darin, zwei Aliase zu erstellen - eines für search / apachesolr_search / (für facettierte Elemente) und eines ohne abschließenden Schrägstrich (für die Hauptsuchseite). Die globale Umleitung kann es möglicherweise ablehnen, zwei Aliase für dasselbe Ziel zu erstellen, Sie können sie jedoch direkt in die Datenbank einfügen.

Gansbrest
quelle