Uso programático de la API de búsqueda

30

Problema: Necesito ejecutar mis propias búsquedas mediante programación con Search API. Todos los resultados de Google que encuentro están orientados a enseñar a los no desarrolladores cómo usar el módulo con Vistas sin resultados en hacerlo como yo quiero.

Información:

  • Usar el servicio de base de datos local en lugar de Solr o cualquier otro.
  • Tenga datos no almacenados en la base de datos que aparecerán junto con otros resultados.
  • El contenido se agrupará en pestañas de "tipo".
  • No usar Vistas por varias razones.
  • Habilite la API de Facetas pero tampoco tiene idea de cómo usarla.

Por qué: porque quiero que la página de búsqueda esté en / site-search y sin / node / keyword después del argumento de la página. También se le pedirá que personalice esto más allá del alcance de otros módulos que pueden proporcionar el mismo tipo de funcionalidad. Y quiero aprender cómo hacer esto, pero no he encontrado ningún tutorial u otra información sobre cómo lograrlo.

El resto: he creado mi página de búsqueda y en ella estoy ejecutando la búsqueda con:

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

La variable de sesión se establece cuando se envía un formulario de búsqueda y luego redirige al usuario a / site-search para realizar la búsqueda y mostrar los resultados.

Si produzco $ result, veo que es una matriz con información diferente que incluye un conjunto de resultados que es una matriz de identificadores de nodo y sus puntajes.

Podría revisarlos, tomar el nodo y mostrar los resultados yo mismo, pero creo que debe haber algún otro método para representar los resultados de la búsqueda. Sin embargo, no lo he encontrado y ese es el problema.

He estado buscando en las diferentes clases en Search API y Facet API y no puedo encontrar nada en ellas que parezca que generarían resultados.

Cualquier ayuda con esto será apreciada.

Ejemplo 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
fuente
¿Podría proporcionar un volcado de la matriz de resultados para el contexto? Es posible que pueda pasarlo directamente a theme_search_results
Clive
1
"Podría revisarlos, tomar el nodo y mostrar los resultados yo mismo, pero creo que debe haber algún otro método para representar los resultados de la búsqueda. Sin embargo, no lo he encontrado y ese es el problema". - node_view_multiple () ?
Garrett Albright
Clive: He actualizado mi pregunta con el resultado de los resultados de búsqueda. Garrett: Gracias por señalar esa función, no sabía que existía. Será útil para algunos otros proyectos, pero no tiene relevancia para lo que quiero hacer aquí. :) Se supone que debe resaltar y mostrar palabras clave del texto de búsqueda relevante en las clases de API de búsqueda, pero no he podido encontrar la manera de obtener los resultados para representarlos con esos métodos. ¡Gracias por la ayuda hasta el momento! :)
Jason Gray
¿Has intentado mirar las funciones de búsqueda en la API de Drupal? api.drupal.org/api/drupal/modules!search!search.module/7
Agi Hammerthief
¿Los ha usado en la situación que describí en mi pregunta?
Jason Gray

Respuestas:

4

¿Has mirado en el API páginas módulo de búsqueda . Utiliza el módulo API de búsqueda y crea una página de búsqueda personalizada. Probablemente podría mirar ese módulo para obtener pistas sobre cómo implementar lo que está tratando de hacer. El módulo en sí mismo podría incluso proporcionar una gran cantidad de la funcionalidad que está buscando.

n30r3b3l
fuente
1
Se le pidió una solución que explícitamente no usara páginas o vistas
Daniel Waters
No, dijo "No usar vistas por varias razones". El módulo de API de búsqueda no lo hace. Lo siento si mi sugerencia no ayudó
n30r3b3l
2
¡Tendría que aceptar que el módulo de páginas de la API de búsqueda es un buen punto de partida! ¡He implementado una búsqueda personalizada antes y he usado el código allí como punto de partida, lo que se puede hacer sin usar páginas!
paaat
1

Aquí está mi solución en aproximadamente 100 líneas, un poco más simple que las 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
fuente
1
Use redirecciones de estado de formulario y no drupal_goto.
Kevin