Programmatische Verwendung der Such-API

30

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 die Verwendung des Moduls mit Views beizubringen.

Information:

  • Verwendung eines lokalen Datenbankdienstes anstelle von Solr oder eines anderen.
  • Haben Sie Daten nicht in der Datenbank gespeichert, die neben anderen Ergebnissen angezeigt werden.
  • Der Inhalt wird in "Typ" -Registern gruppiert.
  • Ansichten werden aus verschiedenen Gründen nicht verwendet.
  • Haben Sie die Facetten-API aktiviert, aber keine Ahnung, wie Sie sie verwenden sollen.

Warum: Weil ich die Suchseite unter / site-search und ohne / node / keyword nach dem Seitenargument haben möchte. Außerdem werden Sie gebeten, dies außerhalb des Bereichs anderer Module anzupassen, die möglicherweise dieselbe Art von Funktionalität bereitstellen. Und ich möchte lernen, wie man das macht, habe aber noch keine Tutorials oder andere Einsichten gefunden, wie man das macht.

Der Rest: Ich habe meine Suchseite erstellt und führe daraufhin die Suche durch 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. Anschließend wird der Benutzer zu / site-search umgeleitet, 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 Punktzahlen ist.

Ich könnte diese durchgehen, den Knoten greifen und die Ergebnisse selbst anzeigen, aber ich glaube, es muss eine andere Methode geben, um die Ergebnisse der Suche wiederzugeben. 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
    )

)
Jason Gray
quelle
Können Sie einen Speicherauszug des Ergebnisarrays für den Kontext bereitstellen? Möglicherweise können Sie es direkt an theme_search_results
Clive weitergeben.
1
"Ich könnte diese durchgehen, den Knoten greifen und die Ergebnisse selbst anzeigen, aber ich glaube, es muss eine andere Methode geben, um die Ergebnisse der Suche wiederzugeben. Ich habe sie jedoch nicht gefunden, und das ist das Problem." - node_view_multiple () ?
Garrett Albright
Clive: Ich habe meine Frage mit der Ausgabe der Suchergebnisse aktualisiert. Garrett: Danke, dass du auf diese Funktion hingewiesen hast, ich wusste nicht, dass es sie gibt. Es wird für einige andere Projekte nützlich sein, hat aber keine Relevanz für das, was ich hier machen möchte. :) In den Such-API-Klassen soll relevanter Suchtext durch Schlüsselwörter hervorgehoben und angezeigt werden, aber ich konnte nicht herausfinden, wie die Ergebnisse mit diesen Methoden gerendert werden können. Vielen Dank für die bisherige Hilfe! :)
Jason Gray
Haben Sie versucht, sich die Suchfunktionen der Drupal-API anzusehen? api.drupal.org/api/drupal/modules!search!search.module/7
Agi Hammerthief
Haben Sie sie in der Situation verwendet, die ich in meiner Frage beschrieben habe?
Jason Gray

Antworten:

4

Haben Sie die gesuchte Search API - Seiten - Modul . Es verwendet das Such-API-Modul und erstellt eine benutzerdefinierte Suchseite. In diesem Modul könnten Sie wahrscheinlich nach Hinweisen suchen, wie Sie das implementieren, was Sie tun möchten. Das Modul selbst bietet möglicherweise sogar viele Funktionen, nach denen Sie suchen.

n30r3b3l
quelle
1
Wurde nach einer Lösung gefragt, die ausdrücklich keine Seiten oder Ansichten verwendete
Daniel Waters
Nein, er sagte "Ansichten aus verschiedenen Gründen nicht verwenden". Das Such-API-Modul funktioniert nicht. Entschuldigung, wenn mein Vorschlag nicht geholfen hat
n30r3b3l
2
Ich muss zustimmen, dass das Such-API-Seitenmodul ein guter Ausgangspunkt ist! Ich habe zuvor eine benutzerdefinierte Suche implementiert und den darin enthaltenen Code als Ausgangspunkt verwendet, was auch ohne Verwendung von Seiten möglich ist!
Paaat
1

Hier ist meine Lösung in ungefähr 100 Zeilen - ein bisschen 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));
}
Aronanda
quelle
1
Verwenden Sie Form State Redirects und nicht drupal_goto.
Kevin