Utilisation par programme de l'API de recherche

30

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 page. Il vous 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 noeud 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 des résultats.

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
    )

)
Jason Gray
la source
Pourriez-vous fournir un vidage du tableau de résultats pour le contexte? Vous pourrez peut-être le transmettre directement à theme_search_results
Clive
1
"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." - node_view_multiple () ?
Garrett Albright
Clive: J'ai mis à jour ma question avec la sortie des résultats de recherche. Garrett: Merci d'avoir souligné cette fonction, je ne savais pas qu'elle existait. Ce sera pratique pour d'autres projets mais n'a aucun rapport avec ce que je veux faire ici. :) Il est censé y avoir surlignage et affichage des mots clés du texte de recherche pertinent dans les classes de l'API de recherche, mais je n'ai pas pu trouver comment obtenir les résultats à l'aide de ces méthodes. Merci du coup de main jusqu'à présent! :)
Jason Gray
Avez-vous essayé de regarder les fonctions de recherche sur l'API Drupal? api.drupal.org/api/drupal/modules!search!search.module/7
Agi Hammerthief
Les avez-vous utilisés dans la situation que j'ai décrite dans ma question?
Jason Gray

Réponses:

4

Avez-vous regardé le module de pages API de recherche . 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.

n30r3b3l
la source
1
On a demandé une solution qui n'utilisait explicitement pas de pages ou de vues
Daniel Waters
Non, il a dit "Ne pas utiliser Views pour diverses raisons". Le module API de recherche ne fonctionne pas. Désolé si ma suggestion n'a pas aidé
n30r3b3l
2
Je dois admettre que le module de pages API de recherche est un bon point de départ! J'ai déjà implémenté une recherche personnalisée et utilisé le code comme point de départ, ce qui peut être fait sans utiliser de pages!
paaat
1

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));
}
Aronanda
la source
1
Utilisez des redirections d'état de formulaire et non drupal_goto.
Kevin