Bagaimana saya bisa mengubah URL pencarian Apache Solr?

12

Bagaimana saya bisa mengubah jalur URL Apache Solr default dari "search / apachesolr_search / term" menjadi yang lain?

markdorison
sumber
3
Sayang sekali postingan q0rban mendapat voting berkali-kali, karena itu tidak akan berfungsi - jhedstrom memberikan deskripsi yang menyeluruh tentang mengapa hanya menimpa jalur dengan hook_menu_alter akan crash dan burn.
aaronbauman

Jawaban:

3

Cara saya biasanya melakukan ini adalah dengan mengimplementasikan hook_menu_alter (). Anda kemudian dapat menyesuaikan url dengan cara yang Anda pilih:

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

Bukan hal yang sepele untuk mengubah jalur pencarian jika Anda hanya menggunakan modul pencarian apachesolr. Karena itu tergantung pada modul pencarian inti, jalan hampir-kode keras. Itu tergantung pada search / {module} /% menu_tail. Jika Anda melihat search_view () , panggilan balik untuk modul pencarian, Anda akan menemukan bahwa itu memanggil search_get_keys () , yang mengharapkan kunci pencarian berada di bagian tertentu dari jalur. Modul pencarian apachesolr juga menggunakan fungsi ini untuk mendapatkan kunci, jadi mengimplementasikan hook_menu_alter () yang sederhana tidak akan berfungsi dengan sendirinya.

Seperti disebutkan dalam jawaban lain di sini, jika Anda dapat menjalankan Tampilan 3.x, maka taruhan terbaik Anda adalah menggunakan modul tampilan apachesolr . Dengan modul ini, Anda dapat dengan mudah menentukan sejumlah jalur khusus untuk hasil pencarian.

Jika Anda tidak dapat menjalankan 3.x, maka Anda harus menggunakan kombinasi perubahan bentuk (khususnya, search_form) dan panggilan balik menu khusus untuk berhasil mengubah jalur pencarian default.

jhedstrom
sumber
4

Ini akan berfungsi jika Anda meletakkannya di 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;
      }
    }
  }
}

Dan kemudian ketika Anda membuat entri menu, Anda meletakkan tautan ke apache solr: search / apachesolr_search /? Filter = tid: 13

Dan buat alias url untuk pencarian / apachesolr_search /? Filter = tid: 13 like products / tv.html

Ditemukan melalui: http://drupal.org/node/783836#comment-4136475

realityloop
sumber
Saya merasa ini untuk D6. Apakah mudah diadaptasi untuk D7, seperti pertanyaan yang diajukan?
pushka
3

Anda dapat menggunakan tampilan pertama untuk pencarian situs Anda.

  1. Buat tampilan solr.
  2. Tambahkan tampilan halaman dengan jalur yang Anda inginkan
  3. Tambahkan teks pencarian sebagai filter.
  4. Formulir terbuka di blok
  5. Letakkan blok di tempat yang Anda inginkan kotak pencarian Anda.
Jeremy French
sumber
Ini tidak berhasil
AnAnD
2

Lihat Menambahkan jalur pencarian khusus dengan hook_menu oleh orang-orang di Evolving Web. Itu berbicara tentang bagaimana mereka menulis modul khusus untuk membuat URL ramah untuk pencarian Solr mereka. Anda mungkin perlu mengubah sedikit, tetapi ini adalah titik awal yang baik.

Benedict Steele
sumber
1

Bagaimana dengan membuat panggilan balik menu baru seperti berikut untuk membuat hasil pengembalian apachesolr di jalur itu?

$menu['search']['page callback'] = 'apachesolr_search_view';
markdorison
sumber
1

Atau Anda bisa memodifikasi modul yang berkontribusi yang melakukan ini: Apache Solr Custom Path .

Ivan Alfaro
sumber
Ini hanya berfungsi untuk D6
AnAnD
0

Jika Anda hanya ingin mengubah pencarian / apachesolr_search / ke sesuatu yang lain, misalnya 'inventaris', Anda dapat mencoba modul pengalihan Global .

Caranya adalah dengan membuat 2 alias - satu untuk pencarian / apachesolr_search / (untuk item faceted) dan yang lainnya tanpa trailing slash (untuk halaman pencarian utama). Pengalihan global mungkin menolak untuk membuat 2 alias untuk tujuan yang sama, tetapi Anda dapat memasukkannya ke db secara langsung.

Gansbrest
sumber