การใช้ Search API แบบเป็นทางการ


30

ปัญหา: จำเป็นต้องเรียกใช้การค้นหาของฉันเองโดยทางโปรแกรมด้วย Search API ผลการค้นหา google ทุกอันนั้นมุ่งเน้นไปที่การสอนผู้ที่ไม่ใช่นักพัฒนาวิธีการใช้โมดูลด้วย Views โดยไม่มีผลลัพธ์ในการทำอย่างที่ฉันต้องการ

ข้อมูล:

  • การใช้บริการฐานข้อมูลท้องถิ่นแทน Solr หรืออื่น ๆ
  • มีข้อมูลที่ไม่ได้เก็บไว้ในฐานข้อมูลที่จะปรากฏพร้อมกับผลลัพธ์อื่น ๆ
  • เนื้อหาจะถูกจัดกลุ่มในแท็บ "ประเภท"
  • ไม่ได้ใช้ Views ด้วยเหตุผลต่างๆ
  • เปิดใช้งาน 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 เพื่อทำการค้นหาและแสดงผลลัพธ์

ถ้าฉันส่งผลลัพธ์ $ ผลลัพธ์ฉันเห็นว่ามันเป็นอาร์เรย์ที่มีข้อมูลที่แตกต่างกันรวมถึงชุดผลลัพธ์ที่เป็นอาร์เรย์ของรหัสโหนดและคะแนนของพวกเขา

ฉันสามารถวิ่งผ่านสิ่งเหล่านั้นคว้าโหนดและแสดงผลลัพธ์เอง แต่ฉันคิดว่าต้องมีวิธีอื่นในการแสดงผลลัพธ์ของการค้นหา ฉันไม่พบมันและนั่นเป็นปัญหา

ฉันได้ดูคลาสที่แตกต่างกันใน 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

ไคลฟ์: ฉันได้อัพเดทคำถามของฉันด้วยผลลัพธ์ของผลลัพธ์การค้นหา Garrett: ขอบคุณที่ชี้ให้ฟังก์ชั่นนั้นไม่รู้ว่ามันมีอยู่จริง มันจะมีประโยชน์สำหรับโครงการอื่น ๆ แต่ไม่มีความเกี่ยวข้องกับสิ่งที่ฉันต้องการทำที่นี่ :) ควรจะมีการเน้นคำหลักและแสดงข้อความค้นหาที่เกี่ยวข้องในคลาส Search API แต่ฉันไม่สามารถหาวิธีที่จะทำให้ผลลัพธ์การแสดงผลโดยใช้วิธีการเหล่านั้น ขอบคุณสำหรับความช่วยเหลือจนถึงตอนนี้! :)
Jason Gray

คุณลองดูฟังก์ชันการค้นหาใน Drupal API แล้วหรือยัง api.drupal.org/api/drupal/modules!search!search.module/7
Agi Hammerthief

คุณเคยใช้มันในสถานการณ์ที่ฉันอธิบายไว้ในคำถามของฉันหรือไม่?
Jason Gray

คำตอบ:


4

มีคุณดูที่โมดูลหน้า API การค้นหา มันใช้โมดูลค้นหา API และสร้างหน้าการค้นหาที่กำหนดเอง คุณอาจดูโมดูลนั้นเพื่อหาเบาะแสเกี่ยวกับวิธีการนำสิ่งที่คุณพยายามทำไปใช้ ตัวโมดูลเองอาจมีฟังก์ชั่นมากมายที่คุณกำลังมองหา


1
ถูกขอให้แก้ปัญหาที่ไม่ได้ใช้หน้าเว็บหรือมุมมองอย่างชัดเจน
Daniel Waters

ไม่เขาพูดว่า "ไม่ได้ใช้ Views ด้วยเหตุผลต่าง ๆ " โมดูล Search API ไม่ ขออภัยถ้าคำแนะนำของฉันไม่ช่วย
n30r3b3l

2
ฉันต้องยอมรับว่าโมดูลหน้าค้นหา API เป็นจุดเริ่มต้นที่ดี! ฉันใช้การค้นหาที่กำหนดเองมาก่อนและใช้รหัสในจุดเริ่มต้นซึ่งสามารถทำได้โดยไม่ต้องใช้หน้า!
paaat

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
เควิน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.