Uso programático da API de pesquisa

30

Problema: preciso executar minhas próprias pesquisas programaticamente com a API de Pesquisa. Todos os resultados do google encontrados são voltados para o ensino de não desenvolvedores como usar o módulo com Views, sem resultados ao fazê-lo como eu quero.

Em formação:

  • Usando o serviço de banco de dados local em vez do Solr ou qualquer outro.
  • Tenha os dados não armazenados no banco de dados que aparecerão ao lado de outros resultados.
  • O conteúdo será agrupado em guias "tipo".
  • Não uso do Views por vários motivos.
  • A API do Facets está ativada, mas também não sabemos como usá-la.

Motivo: porque eu quero que a página de pesquisa esteja em / site-search e sem / node / keyword após o argumento da página. Também será solicitado que você personalize isso além do escopo de outros módulos que possam fornecer o mesmo tipo de funcionalidade. E quero aprender como fazer isso, mas não encontrei nenhum tutorial ou outro insight sobre como fazer isso.

O resto: criei minha página de pesquisa e nela estou executando a pesquisa com:

$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);

A variável de sessão é definida quando um formulário de pesquisa é enviado e, em seguida, redireciona o usuário para / site-search para executar a pesquisa e mostrar os resultados.

Se eu gerar $ result, vejo que é uma matriz com informações diferentes, incluindo um conjunto de resultados que é uma matriz de IDs de nó e suas pontuações.

Eu poderia percorrê-las, agarrando o nó e exibindo os resultados pessoalmente, mas acho que deve haver outro método para renderizar os resultados da pesquisa. Eu não o encontrei e esse é o problema.

Eu estive pesquisando as diferentes classes na API de pesquisa e na API de facetas e não consigo encontrar nada nelas que pareça que elas gerariam resultados.

Qualquer ajuda com isso será apreciada.

Exemplo de resultados:

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
    )

)
Jason Gray
fonte
Você poderia fornecer um despejo da matriz de resultados para o contexto? Você pode passá-lo diretamente para theme_search_results
Clive
1
"Eu poderia passar por eles, agarrando o nó e exibindo os resultados eu mesmo, mas acho que deve haver outro método para renderizar os resultados da pesquisa. Ainda não o encontrei e esse é o problema". - node_view_multiple () ?
Garrett Albright
Clive: atualizei minha pergunta com a saída dos resultados da pesquisa. Garrett: Obrigado por apontar essa função, não sabia que ela existia. Será útil para outros projetos, mas não tem relevância para o que estou querendo fazer aqui. :) Deveria haver destaque de palavras-chave e exibição de texto de pesquisa relevante nas classes da API de pesquisa, mas não consegui descobrir como obter os resultados para renderizar usando esses métodos. Obrigado pela ajuda até agora! :)
Jason Gray
Você já tentou examinar as funções de pesquisa na API do Drupal? api.drupal.org/api/drupal/modules!search!search.module/7
Agi Hammerthief
Você os usou na situação que descrevi na minha pergunta?
Jason Gray

Respostas:

4

Você já viu o módulo de páginas da API de pesquisa . Ele usa o módulo Search API e cria uma página de pesquisa personalizada. Você provavelmente poderia procurar nesse módulo pistas sobre como implementar o que está tentando fazer. O próprio módulo pode até fornecer muitas das funcionalidades que você está procurando.

n30r3b3l
fonte
1
Foi perguntado por uma solução que explicitamente não usar páginas ou exibições
Daniel Waters
Não, ele disse "Não usando Views por vários motivos". O módulo da API de pesquisa não. Desculpe se a minha sugestão não ajudou
n30r3b3l 5/05
2
Eu teria que concordar que o módulo de páginas da API de pesquisa é um bom ponto de partida! Eu implementei uma pesquisa personalizada antes e usei o código lá como ponto de partida, o que pode ser feito sem o uso de páginas!
paaat 26/09/15
1

Aqui está a minha solução em cerca de 100 linhas - um pouco mais simples que as páginas ...

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));
}
Aronanda
fonte
1
Use o estado do formulário redireciona e não drupal_goto.
Kevin