Программное использование Search API

30

Проблема: Нужно запускать мой собственный поиск программно с помощью API поиска. Каждый результат Google, который я нахожу, направлен на то, чтобы научить тех, кто не занимается разработкой, использовать модуль с представлениями, но без результатов, как я хочу.

Информация:

  • Использование сервиса локальной базы данных вместо Solr или любого другого.
  • Не храните данные в базе данных, которые будут отображаться вместе с другими результатами.
  • Содержимое будет сгруппировано во вкладках типа.
  • Не использует представления по разным причинам.
  • Включите Facets API, но не знаете, как его использовать.

Почему: потому что я хочу, чтобы страница поиска находилась в / site-search и без / node / keyword после аргумента страницы. Также будет предложено настроить это за рамками других модулей, которые могут предоставлять такой же тип функциональности. И я хочу узнать, как это сделать, но не нашел никаких руководств или другого понимания того, как это сделать.

Остальное: я создал свою страницу поиска и на ней я выполняю поиск с помощью:

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

Переменная сеанса устанавливается при отправке формы поиска, а затем перенаправляет пользователя в / site-search для выполнения поиска и отображения результатов.

Если я выведу $ result, я вижу, что это массив с другой информацией, включая набор результатов, который представляет собой массив идентификаторов узлов и их оценок.

Я мог бы пробежаться по ним, захватить узел и отобразить результаты самостоятельно, но я думаю, что должен быть какой-то другой метод для рендеринга результатов поиска. Я не нашел это, хотя и в этом проблема.

Я просматривал различные классы в Search API и Facet API и не могу найти в них ничего, что могло бы вывести результаты.

Любая помощь с этим будет оценена.

Пример результатов:

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
    )

)
Джейсон Грей
источник
Не могли бы вы предоставить дамп результирующего массива для контекста? Возможно, вы сможете передать его прямо theme_search_results
Клайв
1
«Я мог бы пробежаться по ним, захватить узел и отобразить результаты сам, но я думаю, что должен быть какой-то другой метод для отображения результатов поиска. Хотя я не нашел его, и в этом проблема». - node_view_multiple () ?
Гаррет Олбрайт
Клайв: Я обновил свой вопрос с выводом результатов поиска. Гарретт: Спасибо за указание на эту функцию, не знал, что она существует. Это будет удобно для некоторых других проектов, но не имеет отношения к тому, что я хочу сделать здесь. :) Должно быть выделение ключевых слов и отображение релевантного текста поиска в классах API поиска, но я не смог выяснить, как получить результаты для отображения с использованием этих методов. Спасибо за помощь до сих пор! :)
Джейсон Грей,
Вы пробовали смотреть на функции поиска в Drupal API? api.drupal.org/api/drupal/modules!search!search.module/7
Аги Хаммертиф
Вы использовали их в ситуации, которую я описал в моем вопросе?
Джейсон Грей

Ответы:

4

Вы смотрели на модуль поиска страниц API . Он использует модуль API поиска и создает пользовательскую страницу поиска. Вы могли бы, вероятно, взглянуть на этот модуль, чтобы понять, как реализовать то, что вы пытаетесь сделать. Сам модуль может даже предоставить множество функций, которые вы ищете.

n30r3b3l
источник
1
Был задан вопрос о решении, в котором явно не использовались страницы или просмотры
Дэниел Уотерс,
Нет, он сказал: «Не использую Views по разным причинам». Модуль API поиска не имеет. Извините, если мое предложение не помогло
n30r3b3l
2
Я должен согласиться с тем, что модуль поиска страниц API является хорошей отправной точкой! Я уже реализовал пользовательский поиск и использовал код в качестве отправной точки, что можно сделать без использования страниц!
Пааат
1

Вот мое решение в 100 строк - немного проще, чем страницы ...

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
источник
1
Используйте перенаправления состояния формы, а не drupal_goto.
Кевин