검색 API의 프로그래밍 방식 사용


30

문제 : Search API를 사용하여 프로그래밍 방식으로 자체 검색을 실행해야합니다. 내가 찾은 모든 Google 결과는 개발자가 아닌 개발자에게 원하는대로 결과를 보지 않고 Views로 모듈을 사용하는 방법을 가르치는 데 중점을 둡니다.

정보:

  • Solr 또는 다른 시스템 대신 로컬 데이터베이스 서비스를 사용합니다.
  • 다른 결과와 함께 나타날 데이터를 데이터베이스에 저장하지 마십시오.
  • 내용은 "유형"탭으로 그룹화됩니다.
  • 여러 가지 이유로 뷰를 사용하지 않습니다.
  • Facets API를 사용하도록 설정했지만 사용 방법에 대한 실마리는 없습니다.

이유 : 검색 페이지가 / site-search에 있고 페이지 인수 뒤에 / node / keyword가 없어야하기 때문입니다. 또한 동일한 유형의 기능을 제공 할 수있는 다른 모듈의 범위를 넘어서이를 사용자 정의해야합니다. 그리고 나는 이것을하는 법을 배우고 싶지만 그것을 성취하는 방법에 대한 튜토리얼이나 다른 통찰력을 찾지 못했습니다.

나머지 : 검색 페이지를 만들었고 다음을 사용하여 검색을 실행합니다.

$term = $_SESSION['my-search']['term'];
$server = search_api_server_load('database');
$index = search_api_index_load('default_node_index');
$query = new SearchApiQuery($index);
$query->keys($term); 
$query->fields(array('title','body:value')); 
$srv= new SearchApiDbService($server);
$result = $srv->search($query);

세션 변수는 검색 양식이 제출 될 때 설정되고 사용자를 / site-search로 리디렉션하여 검색을 수행하고 결과를 표시합니다.

$ result를 출력하면 노드 ID와 점수로 구성된 결과 집합을 포함하여 다른 정보를 가진 배열임을 알 수 있습니다.

그것들을 통해 노드를 잡고 결과를 직접 표시 할 수는 있지만 검색 결과를 렌더링하는 다른 방법이 있어야한다고 생각합니다. 나는 그것을 찾지 못했고 그것이 문제입니다.

Search API 및 Facet API의 다른 클래스를 살펴본 결과 결과 출력을 작성하는 것처럼 보이는 클래스를 찾을 수 없습니다.

이에 대한 도움을 주시면 감사하겠습니다.

결과 예 :

Array
(
[result count] => 11
[results] => Array
    (
        [37] => Array
            (
                [id] => 37
                [score] => 15.7503318786621
            )

        [39] => Array
            (
                [id] => 39
                [score] => 7
            )

        [40] => Array
            (
                [id] => 40
                [score] => 5
            )

        [31] => Array
            (
                [id] => 31
                [score] => 4
            )

        [33] => Array
            (
                [id] => 33
                [score] => 1
            )

        [36] => Array
            (
                [id] => 36
                [score] => 1
            )

        [1] => Array
            (
                [id] => 1
                [score] => 1
            )

        [15] => Array
            (
                [id] => 15
                [score] => 1
            )

        [16] => Array
            (
                [id] => 16
                [score] => 1
            )

        [27] => Array
            (
                [id] => 27
                [score] => 1
            )

        [35] => Array
            (
                [id] => 35
                [score] => 0.980873763561249
            )

    )

[warnings] => Array
    (
    )

[ignored] => Array
    (
    )

[performance] => Array
    (
        [complete] => 0.0033111572265625
        [preprocessing] => 0.00053095817565918
        [execution] => 0.0027379989624023
        [postprocessing] => 4.2200088500977E-5
    )

)

컨텍스트에 대한 결과 배열 덤프를 제공 할 수 있습니까? theme_search_results
Clive

1
"노드를 잡고 결과를 직접 표시 할 수는 있지만 검색 결과를 렌더링 할 수있는 다른 방법이있을 것입니다. 아직 찾지 못했지만 이것이 문제입니다." - node_view_multiple () ?
개렛 올브라이트

Clive : 검색 결과 출력으로 질문을 업데이트했습니다. 개렛 : 그 기능을 지적 해 주셔서 감사합니다. 기능이 존재한다는 것을 몰랐습니다. 다른 프로젝트에는 유용하지만 여기서하고 싶은 것과는 관련이 없습니다. :) Search API 클래스에는 키워드 강조 표시 및 관련 검색 텍스트가 표시되지만 해당 메소드를 사용하여 결과를 렌더링하는 방법을 알 수 없었습니다. 지금까지 도움을 주셔서 감사합니다! :)
Jason Gray

Drupal API에서 검색 기능을 보셨습니까? api.drupal.org/api/drupal/modules!search!search.module/7
Agi Hammerthief

내 질문에 설명 된 상황에서 사용 했습니까?
Jason Gray

답변:


4

당신이 봤어 검색 API 페이지 모듈 . 검색 API 모듈을 사용하고 사용자 정의 검색 페이지를 작성합니다. 아마도 당신이하려는 일을 구현하는 방법에 대한 단서가 있는지 그 모듈을 볼 수 있습니다. 모듈 자체는 원하는 많은 기능을 제공 할 수도 있습니다.


1
페이지 나 뷰를 명시 적으로 사용하지 않는 솔루션을 요청했습니다
Daniel Waters

그는 "여러 가지 이유로 뷰를 사용하지 않는다"고 말했다. 검색 API 모듈은 그렇지 않습니다. 내 제안이 도움이되지 않으면 죄송합니다
n30r3b3l

2
Search API pages 모듈이 좋은 출발점이라는 데 동의해야합니다! 이전에 사용자 정의 검색을 구현하고 페이지를 사용하지 않고 수행 할 수있는 시작점으로 코드를 사용했습니다!
paaat

1

다음은 약 100 줄의 해결책입니다. 페이지보다 조금 간단합니다 ...

define('SEARCH_QUERY_TERM', 'query');
define('SEARCH_PAGE_TERM', 'page');
define('SEARCH_LIMIT_TERM', 'limit');
define('SEARCH_DEFAULT_LIMIT', 10);

/**
 * Implements hook_menu().
 */
function my_module_menu() {
    $items['search'] = array(
        'title' => 'Search',
        'page callback' => 'my_module_page',
        'access callback' => TRUE,
        'type' => MENU_CALLBACK,
    );

    return $items;
}

/**
 * My Module Search Functions
 */

function my_module_page() {
    $build = array(
        'form' => drupal_get_form('my_module_form'),
        'results' => array('#theme_wrappers' => array('container')),
    );

    foreach (my_module_result() as $eid => $entity) {
        $build['results'][$eid] = entity_view('node', array($entity), 'teaser');
    }

    return $build;
}

function my_module_form($form, &$form_state) {
    list($query, $page, $limit) = my_module_params();

    $form['query'] = array(
        '#type' => 'textfield',
        '#title' => t('Search'),
        '#default_value' => $query,
    );
    $form['actions'] = array('#type' => 'actions');
    $form['actions']['submit'] = array(
        '#type' => 'submit',
        '#value' => t('Search'),
    );

    return $form;
}

function my_module_form_submit($form, &$form_state) {
    $values = $form_state['values'];
    $query = isset($values['query']) ? $values['query'] : '';
    $form_state['redirect'] = array('search', array('query' => array('query' => $query)));
}

function my_module_params() {
    $query = '';
    $page_number = 0;
    $limit = SEARCH_DEFAULT_LIMIT;
    $params = drupal_get_query_parameters();

    if (isset($params[SEARCH_QUERY_TERM])) {
        $query = $params[SEARCH_QUERY_TERM];
    }
    if (isset($params[SEARCH_PAGE_TERM]) && is_numeric($params[SEARCH_PAGE_TERM])) {
        $page_number = $params[SEARCH_PAGE_TERM];
    }
    if (isset($params[SEARCH_LIMIT_TERM]) && is_numeric($params[SEARCH_LIMIT_TERM])) {
        $limit = $params[SEARCH_LIMIT_TERM];
    }

    return array($query, $page_number, $limit);
}

function my_module_result() {
    $index_id = 'default_node_index';

    list($keys, $page_number, $limit) = my_module_params();
    $offset = $limit * $page_number;

    $options = array(
        'search id' => 'node:default',
    );

    $query = search_api_query($index_id, $options)->keys($keys);

    if ($limit > 0) {
        $query->range($offset, $limit);
    }

    $results = $query->execute();
    $results = isset($results['results']) ? $results['results'] : array();

    return entity_load('node', array_keys($results));
}

1
drupal_goto가 아닌 양식 상태 리디렉션을 사용하십시오.
케빈
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.