以编程方式使用Search API


30

问题:需要使用Search API以编程方式运行我自己的搜索。我发现的每个google结果都适合教给非开发人员如何将模块与Views一起使用,而没有按照我的意愿进行操作的结果。

信息:

  • 使用本地数据库服务代替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,我会看到它是一个包含不同信息的数组,其中包括一个结果集,该结果集是节点ID及其分数的数组。

我可以遍历这些内容,抓取节点并自己显示结果,但我认为必须有其他方法来呈现搜索结果。我还没有找到,那就是问题所在。

我一直在搜索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
克莱夫(Clive)

1
“我可以遍历这些内容,自己抓取节点并显示结果,但我认为必须有其他方法来呈现搜索结果。尽管如此,我仍然没有找到它,这就是问题所在。” - node_view_multiple()
Garrett Albright 2014年

克莱夫:我已经用搜索结果的输出更新了我的问题。Garrett:感谢您指出该功能,但不知道它的存在。对于其他一些项目,它会很方便,但与我想在这里进行的工作无关。:)应该在Search API类中突出显示关键字并显示相关的搜索文本,但是我一直无法弄清楚如何使用这些方法来呈现结果。感谢你目前的帮助!:)
杰森·格雷

您是否尝试过查看Drupal API上的搜索功能?api.drupal.org/api/drupal/modules!search!search.module/7
Agi Hammerthief 2014年

您是否在我在问题中描述的情况下使用过它们?
2014年

Answers:


4

您是否看过Search API页面模块。它使用Search API模块并创建一个自定义搜索页面。您可能会在该模块上找到有关如何实现您要尝试执行的操作的线索。模块本身甚至可以提供您正在寻找的许多功能。


1
被要求提供一种明确不使用页面或视图的解决方案
Daniel Waters 2015年

不,他说“出于各种原因不使用视图”。Search API模块没有。抱歉,如果我的建议没有帮助
n30r3b3l 2015年

2
我必须同意Search API页面模块是一个很好的起点!我之前已经实现了自定义搜索,并在那里使用了代码作为起点,而无需使用页面就可以完成!
paaat 2015年

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

1
使用表单状态重定向,而不是drupal_goto。
凯文
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.