web-dev-qa-db-fra.com

Utilisation par programme de l'API de recherche

Problème: besoin d'exécuter mes propres recherches par programme avec l'API de recherche. Chaque résultat google que je trouve est destiné à enseigner aux non-développeurs comment utiliser le module avec Views sans aucun résultat sur le faire comme je le souhaite.

Information:

  • Utilisation du service de base de données local au lieu de Solr ou de tout autre.
  • Avoir des données non stockées dans la base de données qui apparaîtront aux côtés d'autres résultats.
  • Le contenu sera regroupé dans des onglets "type".
  • Ne pas utiliser les vues pour diverses raisons.
  • Avoir l'API Facets activée mais aucune idée de comment l'utiliser non plus.

Pourquoi: parce que je veux que la page de recherche soit dans/site-search et sans/node/keyword après l'argument de la page. Il sera également demandé de personnaliser cela au-delà de la portée d'autres modules qui peuvent fournir le même type de fonctionnalité. Et je veux apprendre à le faire, mais je n'ai pas trouvé de tutoriels ou d'autres informations sur la façon de l'accomplir.

Le reste: j'ai créé ma page de recherche et sur celle-ci j'exécute la recherche avec:

$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 session est définie lorsqu'un formulaire de recherche est soumis, puis redirige l'utilisateur vers/site-search pour effectuer la recherche et afficher les résultats.

Si je génère $ result, je vois que c'est un tableau avec des informations différentes, y compris un jeu de résultats qui est un tableau d'ID de nœud et leurs scores.

Je pourrais les parcourir, saisir le nœud et afficher les résultats moi-même, mais je pense qu'il doit y avoir une autre méthode pour rendre les résultats de la recherche. Je ne l'ai pas trouvé cependant et c'est le problème.

J'ai parcouru les différentes classes de l'API de recherche et de l'API de facette et je ne trouve rien en elles qui semble générer une sortie de résultat.

Toute aide à cet égard sera appréciée.

Exemple de résultats:

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
    )

)
29
Jason Gray

Avez-vous regardé le module de pages de recherche API . Il utilise le module API de recherche et crée une page de recherche personnalisée. Vous pouvez probablement consulter ce module pour obtenir des indices sur la façon de mettre en œuvre ce que vous essayez de faire. Le module lui-même peut même fournir une grande partie des fonctionnalités que vous recherchez.

4
n30r3b3l

Voici ma solution en environ 100 lignes - un peu plus simple que les pages ...

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
Aronanda