Apache Solr 검색 URL을 어떻게 변경합니까?


12

기본 Apache Solr URL 경로를 "search / apachesolr_search / term"에서 다른 것으로 변경하려면 어떻게해야합니까?


3
q0rban의 게시물이 작동하지 않기 때문에 너무 많이 투표 한 것은 너무 나쁩니다. jhedstrom은 hook_menu_alter로 경로를 재정의하면 충돌하고 타는 이유에 대한 철저한 설명을 제공합니다.
aaronbauman

답변:


3

내가 일반적으로 한 방법은 hook_menu_alter ()를 구현하는 것입니다. 그런 다음 원하는 방식으로 URL을 사용자 정의 할 수 있습니다.

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

apachesolr 검색 모듈 만 사용하는 경우 검색 경로를 변경하는 것은 쉽지 않습니다. 핵심 검색 모듈에 따라 다르므로 경로는 거의 하드 코딩되어 있습니다. search / {module} / % menu_tail에 따라 다릅니다. 검색 모듈의 콜백 인 search_view () 를 보면 검색 키가 경로의 특정 부분에있을 것으로 예상되는 search_get_keys ()를 호출한다는 것을 알 수 있습니다. apachesolr 검색 모듈도이 함수를 사용하여 키를 가져 오므로 간단한 hook_menu_alter () 구현은 자체적으로 작동하지 않습니다.

다른 답변에서 언급했듯이 Views 3.x를 실행할 수 있다면 가장 좋은 방법은 apachesolr views 모듈 을 사용하는 입니다. 이 모듈을 사용하면 검색 결과에 대한 여러 사용자 정의 경로를 쉽게 정의 할 수 있습니다.

3.x를 실행할 수없는 경우 기본 검색 경로를 성공적으로 변경하려면 form alter (특히 search_form)와 사용자 정의 메뉴 콜백의 조합을 사용해야합니다.


4

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

그런 다음 메뉴 항목을 만들 때 apache solr : search / apachesolr_search /? filters = tid : 13에 대한 링크를 넣습니다.

그리고 products / tv.html과 같은 search / apachesolr_search /? filters = tid : 13에 대한 URL 별칭을 만드십시오.

http://drupal.org/node/783836#comment-4136475 를 통해 발견


이것이 D6에 대한 느낌입니다. 질문에 따라 D7에 쉽게 적용됩니까?
pushka

3

사이트 검색에 solr보기 를 사용할 수 있습니다 .

  1. solr보기를 작성하십시오.
  2. 원하는 경로로 페이지 디스플레이 추가
  3. 검색 텍스트를 필터로 추가하십시오.
  4. 블록에 노출 된 형태
  5. 검색 창을 놓을 위치에 블록을 놓습니다.

이것은 작동하지 않습니다
AnAnD


1

다음과 같이 새 메뉴 콜백을 만들어 해당 경로에서 아파치 솔러가 결과를 반환하는 것은 어떻습니까?

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


0

search / apachesolr_search /를 다른 것으로 바꾸려면 (예 : 'inventory') 전역 리디렉션 모듈을 사용해보십시오 .

트릭은 2 개의 별명을 작성하는 것입니다. 하나는 search / apachesolr_search / (면도 항목의 경우) 및 다른 하나는 후행 슬래시 (주 검색 페이지의 경우)입니다. 글로벌 경로 재 지정은 동일한 대상에 대해 2 개의 별명 ​​작성을 거부 할 수 있지만이를 DB에 직접 삽입 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.