Penggunaan API Pencarian terprogram

30

Masalah: Perlu menjalankan pencarian saya sendiri secara terprogram dengan API Pencarian. Setiap hasil google yang saya temukan diarahkan untuk mengajar non-pengembang cara menggunakan modul dengan Tampilan tanpa hasil seperti yang saya inginkan.

Informasi:

  • Menggunakan layanan basis data lokal alih-alih Solr atau lainnya.
  • Apakah data tidak disimpan dalam database yang akan muncul di samping hasil lainnya.
  • Konten akan dikelompokkan dalam tab "ketik".
  • Tidak menggunakan Tampilan karena berbagai alasan.
  • Apakah Facet API diaktifkan tetapi tidak ada petunjuk bagaimana menggunakannya juga.

Mengapa: Karena saya ingin halaman pencarian berada di / pencarian situs dan tanpa / simpul / kata kunci setelah argumen halaman. Juga akan diminta untuk menyesuaikan ini di luar ruang lingkup modul lain yang mungkin menyediakan jenis fungsionalitas yang sama. Dan saya ingin belajar bagaimana melakukan ini tetapi belum menemukan tutorial atau wawasan lain tentang bagaimana mencapainya.

Sisanya: Saya telah membuat halaman pencarian saya dan di atasnya saya menjalankan pencarian dengan:

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

Variabel sesi diatur ketika formulir pencarian dikirimkan kemudian mengarahkan pengguna ke / pencarian situs untuk melakukan pencarian dan menunjukkan hasilnya.

Jika saya menghasilkan $ hasil, saya melihatnya array dengan informasi berbeda termasuk set hasil yang merupakan array id node dan skor mereka.

Saya bisa menjalankannya, meraih simpul dan menampilkan hasilnya sendiri tetapi saya pikir pasti ada beberapa metode lain untuk merender hasil pencarian. Saya belum menemukannya dan itulah masalahnya.

Saya telah mencari melalui berbagai kelas di Search API dan Facet API dan tidak dapat menemukan apa pun di dalamnya yang tampak seperti mereka akan membangun hasil keluaran.

Bantuan apa pun dengan ini akan dihargai.

Contoh hasil:

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
sumber
Bisakah Anda memberikan dump array hasil untuk konteks? Anda mungkin dapat meneruskannya langsung ke theme_search_results
Clive
1
"Aku bisa menjalankannya, meraih simpul dan menampilkan hasilnya sendiri, tetapi kupikir pasti ada metode lain untuk menampilkan hasil pencarian. Aku belum menemukannya dan itulah masalahnya." - node_view_multiple () ?
Garrett Albright
Clive: Saya telah memperbarui pertanyaan saya dengan output dari hasil pencarian. Garrett: Terima kasih telah menunjukkan fungsi itu, tidak tahu itu ada. Ini akan berguna untuk beberapa proyek lain tetapi tidak memiliki relevansi dengan apa yang ingin saya lakukan di sini. :) Seharusnya ada penyorotan kata kunci dan menampilkan teks pencarian yang relevan di kelas-kelas Pencarian API, tetapi saya tidak dapat menemukan cara untuk mendapatkan hasil render menggunakan metode-metode tersebut. Terima kasih atas bantuannya sejauh ini! :)
Jason Gray
Sudahkah Anda mencoba melihat fungsi pencarian di API Drupal? api.drupal.org/api/drupal/modules!search!search.module/7
Agi Hammerthief
Sudahkah Anda menggunakannya dalam situasi yang saya jelaskan dalam pertanyaan saya?
Jason Grey

Jawaban:

4

Sudahkah Anda melihat modul halaman Pencarian API . Ini menggunakan modul API Pencarian dan membuat halaman pencarian kustom. Anda mungkin dapat melihat modul itu untuk mendapatkan petunjuk tentang bagaimana menerapkan apa yang Anda coba lakukan. Modul itu sendiri bahkan mungkin menyediakan banyak fungsi yang Anda cari.

n30r3b3l
sumber
1
Diminta solusi yang secara eksplisit tidak menggunakan halaman atau tampilan
Daniel Waters
Tidak, dia berkata "Tidak menggunakan Tampilan karena berbagai alasan". Modul Pencarian API tidak. Maaf jika saran saya tidak membantu
n30r3b3l
2
Saya harus setuju bahwa modul halaman Pencarian API adalah tempat awal yang baik! Saya telah menerapkan pencarian khusus sebelumnya dan menggunakan kode di sana sebagai titik awal, yang dapat dilakukan tanpa menggunakan halaman!
paaat
1

Inilah solusi saya dalam sekitar 100 baris - sedikit lebih sederhana daripada halaman ...

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
sumber
1
Gunakan pengalihan status formulir dan bukan drupal_goto.
Kevin