Sử dụng lập trình API tìm kiếm


30

Vấn đề: Cần chạy các tìm kiếm của riêng tôi theo chương trình với API tìm kiếm. Mỗi kết quả google tôi tìm thấy đều hướng đến việc dạy cho những người không phải là nhà phát triển cách sử dụng mô-đun với Chế độ xem mà không có kết quả nào để thực hiện như tôi muốn.

Thông tin:

  • Sử dụng dịch vụ cơ sở dữ liệu cục bộ thay vì Solr hoặc bất kỳ dịch vụ nào khác.
  • Có dữ liệu không được lưu trữ trong cơ sở dữ liệu sẽ xuất hiện cùng với các kết quả khác.
  • Nội dung sẽ được nhóm trong các tab "loại".
  • Không sử dụng Lượt xem vì nhiều lý do.
  • Đã bật API Facets nhưng không biết cách sử dụng.

Lý do: Bởi vì tôi muốn có trang tìm kiếm ở / trang tìm kiếm và không có / nút / từ khóa sau đối số trang. Cũng sẽ được yêu cầu tùy chỉnh điều này ngoài phạm vi của các mô-đun khác có thể cung cấp cùng loại chức năng. Và tôi muốn tìm hiểu làm thế nào để làm điều này nhưng chưa tìm thấy bất kỳ hướng dẫn hoặc hiểu biết nào khác về cách thực hiện nó.

Phần còn lại: Tôi đã tạo trang tìm kiếm của mình và trên đó tôi đang thực hiện tìm kiếm với:

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

Biến phiên được đặt khi biểu mẫu tìm kiếm được gửi sau đó chuyển hướng người dùng đến / tìm kiếm trang web để thực hiện tìm kiếm và hiển thị kết quả.

Nếu tôi xuất kết quả $, tôi thấy đó là một mảng có thông tin khác nhau bao gồm tập kết quả là một mảng các id nút và điểm số của chúng.

Tôi có thể chạy qua những cái đó, chộp lấy nút và tự hiển thị kết quả nhưng tôi nghĩ rằng phải có một phương pháp khác để hiển thị kết quả tìm kiếm. Tôi đã không tìm thấy nó mặc dù và đó là vấn đề.

Tôi đã xem qua các lớp khác nhau trong API tìm kiếm và API Facet và không thể tìm thấy bất cứ thứ gì trong đó có vẻ như chúng sẽ tạo ra kết quả đầu ra.

Bất kỳ trợ giúp với điều này sẽ được đánh giá cao.

Ví dụ kết quả:

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
    )

)

Bạn có thể cung cấp một kết xuất của mảng kết quả cho bối cảnh? Bạn có thể chuyển thẳng đến theme_search_results
Clive

1
"Tôi có thể chạy qua những cái đó, chộp lấy nút và tự hiển thị kết quả nhưng tôi nghĩ rằng phải có một phương pháp khác để hiển thị kết quả tìm kiếm. Tôi chưa tìm thấy nó và đó là vấn đề." - node_view_mult Môn () ?
Garrett Albright

Clive: Tôi đã cập nhật câu hỏi của mình với đầu ra của kết quả tìm kiếm. Garrett: Cảm ơn bạn đã chỉ ra chức năng đó, không biết nó tồn tại. Nó sẽ hữu ích cho một số dự án khác nhưng không liên quan đến những gì tôi muốn làm ở đây. :) Có nghĩa là phải làm nổi bật từ khóa và hiển thị văn bản tìm kiếm có liên quan trong các lớp API tìm kiếm nhưng tôi không thể tìm ra cách lấy kết quả để hiển thị bằng các phương thức đó. Cảm ơn sự giúp đỡ cho đến nay! :)
Jason Gray

Bạn đã thử xem các chức năng tìm kiếm trên API Drupal chưa? api.drupal.org/api/drupal/modules!search!search.module/7
Agi

Bạn đã sử dụng chúng trong tình huống tôi mô tả trong câu hỏi của tôi?
Jason Gray

Câu trả lời:


4

Bạn đã xem mô-đun trang Tìm kiếm API . Nó sử dụng mô-đun API tìm kiếm và tạo một trang tìm kiếm tùy chỉnh. Bạn có thể có thể nhìn vào mô-đun đó để tìm manh mối về cách thực hiện những gì bạn đang cố gắng làm. Bản thân mô-đun thậm chí có thể cung cấp rất nhiều chức năng mà bạn đang tìm kiếm.


1
Đã được yêu cầu một giải pháp rõ ràng không sử dụng các trang hoặc lượt xem
Daniel Waters

Không, ông nói "Không sử dụng Lượt xem vì nhiều lý do". Mô-đun API tìm kiếm thì không. Xin lỗi nếu đề xuất của tôi không giúp được
n30r3b3l

2
Tôi phải đồng ý rằng mô-đun trang Tìm kiếm API là nơi khởi đầu tốt! Tôi đã triển khai một tìm kiếm tùy chỉnh trước đó và sử dụng mã ở đó làm điểm bắt đầu, có thể được thực hiện mà không cần sử dụng các trang!
paaat

1

Đây là giải pháp của tôi trong khoảng 100 dòng - đơn giản hơn một chút so với các trang ...

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
Sử dụng chuyển hướng trạng thái mẫu và không drupal_goto.
Kevin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.