Programowe wykorzystanie Search API

30

Problem: Muszę programowo uruchamiać własne wyszukiwania za pomocą Search API. Każdy wynik w Google, który znalazłem, ma na celu nauczenie osób, które nie są programistami, jak korzystać z modułu w Widoku, bez żadnych rezultatów w robieniu tego, co chcę.

Informacja:

  • Korzystanie z lokalnej usługi bazy danych zamiast Solr lub innej.
  • Nie przechowuj danych w bazie danych, które pojawią się obok innych wyników.
  • Treść zostanie zgrupowana w zakładkach „typ”.
  • Nie używam widoków z różnych powodów.
  • Włącz interfejs Facets API, ale nie mam pojęcia, jak go używać.

Dlaczego: Ponieważ chcę, aby strona wyszukiwania znajdowała się w / site-search i bez / node / słowa kluczowego po argumencie strony. Zostanie również poproszony o dostosowanie tego poza zakresem innych modułów, które mogą zapewniać ten sam typ funkcjonalności. Chcę się nauczyć, jak to zrobić, ale nie znalazłem żadnych samouczków ani innych informacji na temat tego, jak to zrobić.

Reszta: utworzyłem swoją stronę wyszukiwania i na niej wykonuję wyszukiwanie za pomocą:

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

Zmienna sesji jest ustawiana po przesłaniu formularza wyszukiwania, a następnie przekierowuje użytkownika do / site-search, aby przeprowadzić wyszukiwanie i wyświetlić wyniki.

Jeśli wypiszę $ $ wynik, widzę, że jest to tablica z różnymi informacjami, w tym zestaw wyników, który jest tablicą identyfikatorów węzłów i ich wyników.

Mógłbym je przeglądać, chwytać węzeł i wyświetlać wyniki samodzielnie, ale sądzę, że musi być inna metoda renderowania wyników wyszukiwania. Nie znalazłem tego i to jest problem.

Przeglądałem różne klasy w Search API i Facet API i nie mogę znaleźć w nich niczego, co mogłoby wyglądać na wynikowe.

Każda pomoc w tym zakresie będzie mile widziana.

Przykład wyników:

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
źródło
Czy możesz podać zrzut tablicy wyników dla kontekstu? Być może będziesz w stanie przekazać go bezpośrednio do theme_search_results
Clive
1
„Mógłbym je przeglądać, chwytać węzeł i wyświetlać wyniki samodzielnie, ale sądzę, że musi być inna metoda renderowania wyników wyszukiwania. Jednak nie znalazłem go i to jest problem”. - node_view_multiple () ?
Garrett Albright
Clive: Zaktualizowałem moje pytanie o wyniki wyszukiwania. Garrett: Dzięki za wskazanie tej funkcji, nie wiedziałem, że ona istnieje. Przyda się w niektórych innych projektach, ale nie ma związku z tym, co chcę tutaj zrobić. :) Powinno być podświetlanie słów kluczowych i wyświetlanie odpowiedniego tekstu wyszukiwania w klasach Search API, ale nie byłem w stanie dowiedzieć się, jak uzyskać wyniki do renderowania za pomocą tych metod. Dzięki za pomoc do tej pory! :)
Jason Gray
Czy próbowałeś sprawdzić funkcje wyszukiwania w interfejsie API Drupal? api.drupal.org/api/drupal/modules!search!search.module/7
Agi Hammerthief
Czy wykorzystałeś je w sytuacji opisanej w moim pytaniu?
Jason Gray,

Odpowiedzi:

4

Czy przeglądałeś moduł stron interfejsu API wyszukiwania . Korzysta z modułu Search API i tworzy niestandardową stronę wyszukiwania. Prawdopodobnie możesz spojrzeć na ten moduł, aby uzyskać wskazówki, jak wdrożyć to, co próbujesz zrobić. Sam moduł może nawet zapewniać wiele funkcji, których szukasz.

n30r3b3l
źródło
1
Poproszono o rozwiązanie, które wyraźnie nie używa stron ani wyświetleń
Daniel Waters
Nie, powiedział „Nie używam widoków z różnych powodów”. Moduł API wyszukiwania nie. Przepraszam, jeśli moja sugestia nie pomogła
n30r3b3l
2
Zgadzam się, że moduł stron interfejsu API wyszukiwania to dobre miejsce początkowe! Wcześniej zaimplementowałem niestandardowe wyszukiwanie i użyłem tam kodu jako punktu wyjścia, co można zrobić bez użycia stron!
paaat
1

Oto moje rozwiązanie w około 100 liniach - trochę prostsze niż strony ...

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
źródło
1
Użyj przekierowań stanu formularza, a nie drupal_goto.
Kevin