it-swarm.com.de

Programmatische Verwendung der Such-API

Problem: Ich muss meine eigenen Suchvorgänge programmgesteuert mit der Such-API ausführen. Jedes Google-Ergebnis, das ich finde, ist darauf ausgerichtet, Nicht-Entwicklern beizubringen, wie das Modul mit Ansichten verwendet wird, ohne dass Ergebnisse erzielt werden, wie ich es möchte.

Information:

  • Verwenden des lokalen Datenbankdienstes anstelle von Solr oder einem anderen.
  • Lassen Sie keine Daten in der Datenbank speichern, die neben anderen Ergebnissen angezeigt werden.
  • Der Inhalt wird in Registerkarten "Typ" gruppiert.
  • Ansichten aus verschiedenen Gründen nicht verwenden.
  • Haben Sie die Facetten-API aktiviert, aber auch keine Ahnung, wie Sie sie verwenden sollen.

Warum: Weil ich möchte, dass sich die Suchseite nach dem Seitenargument bei/site-search und ohne/node/keyword befindet. Außerdem werden Sie gebeten, dies über den Umfang anderer Module hinaus anzupassen, die möglicherweise dieselbe Art von Funktionalität bieten. Und ich möchte lernen, wie man das macht, habe aber keine Tutorials oder andere Erkenntnisse darüber gefunden, wie man das macht.

Der Rest: Ich habe meine Suchseite erstellt und führe darauf die Suche aus mit:

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

Die Sitzungsvariable wird festgelegt, wenn ein Suchformular gesendet wird, und leitet den Benutzer dann zu/site-search weiter, um die Suche durchzuführen und die Ergebnisse anzuzeigen.

Wenn ich $ result ausgebe, sehe ich, dass es sich um ein Array mit unterschiedlichen Informationen handelt, einschließlich einer Ergebnismenge, die ein Array von Knoten-IDs und deren Bewertungen ist.

Ich könnte diese durchgehen, den Knoten greifen und die Ergebnisse selbst anzeigen, aber ich denke, es muss eine andere Methode geben, um die Ergebnisse der Suche zu rendern. Ich habe es aber nicht gefunden und das ist das Problem.

Ich habe die verschiedenen Klassen in der Such-API und der Facetten-API durchgesehen und kann in ihnen nichts finden, was den Anschein hat, als würden sie eine Ergebnisausgabe erstellen.

Jede Hilfe dabei wird geschätzt.

Ergebnisbeispiel:

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

Haben Sie sich das Modul API-Seiten durchsuchen angesehen? Es verwendet das Such-API-Modul und erstellt eine benutzerdefinierte Suchseite. Sie könnten sich dieses Modul wahrscheinlich ansehen, um Hinweise zu erhalten, wie Sie das implementieren können, was Sie versuchen. Das Modul selbst bietet möglicherweise sogar viele der Funktionen, die Sie suchen.

4
n30r3b3l

Hier ist meine Lösung in ungefähr 100 Zeilen - etwas einfacher als Seiten ...

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