खोज एपीआई के प्रोग्रामेटिक उपयोग


30

समस्या: खोज एपीआई के साथ प्रोग्रामेटिक रूप से मेरी अपनी खोजों को चलाने की आवश्यकता है। प्रत्येक Google परिणाम मुझे लगता है कि गैर-डेवलपर्स को पढ़ाने की दिशा में ध्यान दिया जाता है कि कैसे मैं चाहता हूँ कि ऐसा करने पर कोई परिणाम नहीं के साथ मॉड्यूल का उपयोग करें।

जानकारी:

  • सोलर या किसी अन्य के बजाय स्थानीय डेटाबेस सेवा का उपयोग करना।
  • डेटाबेस में डेटा संग्रहीत नहीं है जो अन्य परिणामों के साथ दिखाई देगा।
  • सामग्री "प्रकार" टैब में समूहीकृत की जाएगी।
  • विभिन्न कारणों से दृश्य का उपयोग नहीं करना।
  • Facets API को सक्षम किया गया है, लेकिन इसका उपयोग कैसे करें, इसका कोई सुराग नहीं है।

क्यों: क्योंकि मैं चाहता हूं कि खोज पृष्ठ पृष्ठ तर्क के बाद / साइट-खोज और बिना / नोड / कीवर्ड के हो। साथ ही इसे अन्य मॉड्यूलों के दायरे से परे अनुकूलित करने के लिए कहा जाएगा जो एक ही प्रकार की कार्यक्षमता प्रदान कर सकते हैं। और मैं सीखना चाहता हूं कि यह कैसे करना है लेकिन इसे पूरा करने के तरीके पर कोई ट्यूटोरियल या अन्य जानकारी नहीं मिली है।

बाकी: मैंने अपना खोज पृष्ठ बनाया है और उस पर मैं इस खोज को अंजाम दे रहा हूँ:

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

सत्र चर सेट किया जाता है जब एक खोज फ़ॉर्म सबमिट किया जाता है, तो उपयोगकर्ता को खोज करने और परिणाम दिखाने के लिए / साइट-खोज पर रीडायरेक्ट करता है।

यदि मैं $ परिणाम का उत्पादन करता हूं, तो मुझे लगता है कि यह एक परिणाम सरणी सहित विभिन्न सूचनाओं के साथ एक सरणी है जो नोड आईडी और उनके स्कोर की एक सरणी है।

मैं उन लोगों के माध्यम से भाग सकता था, नोड को पकड़ सकता था और खुद परिणाम प्रदर्शित कर सकता था, लेकिन मुझे लगता है कि खोज के परिणामों को प्रस्तुत करने के लिए कुछ अन्य तरीका होना चाहिए। हालांकि मुझे यह नहीं मिला है और यही समस्या है।

मैं खोज 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 () ?
गैरेट अलब्राइट

क्लाइव: मैंने खोज परिणामों के आउटपुट के साथ अपना प्रश्न अपडेट किया है। गैरेट: उस फ़ंक्शन को इंगित करने के लिए धन्यवाद, पता नहीं था कि यह अस्तित्व में है। यह कुछ अन्य परियोजनाओं के लिए उपयोगी होगा, लेकिन मैं यहां क्या करना चाहता हूं, इसकी कोई प्रासंगिकता नहीं है। :) खोज एपीआई वर्गों में प्रासंगिक खोज पाठ के कीवर्ड हाइलाइटिंग और प्रदर्शित करना माना जाता है, लेकिन मैं यह पता लगाने में असमर्थ रहा हूं कि उन तरीकों का उपयोग करके रेंडर करने के लिए परिणाम कैसे प्राप्त करें। अब तक की गई सहायता के लिए धन्यवाद! :)
जेसन ग्रे

क्या आपने Drupal API पर खोज कार्यों को देखने की कोशिश की है? api.drupal.org/api/drupal/modules
Agi Hammerthief

क्या आपने मेरे प्रश्न में वर्णित स्थिति में उनका उपयोग किया है?
जेसन ग्रे

जवाबों:


4

क्या आपने खोज एपीआई पृष्ठों मॉड्यूल को देखा है । यह खोज एपीआई मॉड्यूल का उपयोग करता है और एक कस्टम खोज पेज बनाता है। आप संभवतः उस मॉड्यूल को देख सकते हैं कि आप क्या करने की कोशिश कर रहे हैं, इसे कैसे लागू किया जाए। मॉड्यूल स्वयं भी बहुत सी कार्यक्षमता प्रदान कर सकता है जिसे आप खोज रहे हैं।


1
एक समाधान के लिए कहा गया था जो स्पष्ट रूप से पृष्ठों या विचारों का उपयोग नहीं करता था
डैनियल वाटर्स

नहीं, उन्होंने कहा "विभिन्न कारणों के लिए दृश्य का उपयोग नहीं"। खोज एपीआई मॉड्यूल नहीं करता है। क्षमा करें यदि मेरे सुझाव से मदद नहीं मिली
n30r3b3l

2
मुझे इस बात से सहमत होना होगा कि Search 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));
}

1
फ़ॉर्म राज्य पुनर्निर्देश का उपयोग करें और ड्रुपल_गेटो नहीं।
केविन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.