Arama API'sinin programlı kullanımı


30

Sorun: Kendi aramalarımı Arama API'sı ile programlı olarak çalıştırmam gerekiyor. Bulduğum her google sonucu, geliştiricilere, modülün Görünümler ile nasıl kullanılacağı konusunda hiçbir sonuç olmadan nasıl kullanılacağını öğretmeye yöneliktir.

Bilgi:

  • Solr veya başka herhangi bir yerel veritabanı servisini kullanarak.
  • Diğer sonuçların yanında görünecek verileri veritabanında saklamayın.
  • İçerik "tip" sekmelerinde gruplandırılacaktır.
  • Görünümleri çeşitli nedenlerle kullanmamak.
  • Facets API'yi etkinleştirin, ancak nasıl kullanılacağına dair hiçbir ipucu yok.

Neden: Çünkü sayfa aramadan sonra arama sayfasının / site-aramada ve / node / anahtar kelime olmadan olmasını istiyorum. Ayrıca, aynı işlevsellik sağlayabilecek diğer modüllerin kapsamı dışında da özelleştirilmesi istenecektir. Ve bunun nasıl yapılacağını öğrenmek istiyorum ancak nasıl yapılacağı hakkında herhangi bir ders ya da başka bir görüş bulamadım.

Gerisi: Arama sayfamı oluşturdum ve üzerinde aramayla çalışıyorum:

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

Oturum değişkeni, bir arama formu gönderildiğinde ayarlanır, ardından kullanıcıyı arama yapmak ve sonuçları göstermek için / site aramasına yönlendirir.

Eğer $ sonuç çıktıysam, düğüm kimlikleri dizisi olan sonuç kümesini ve puanlarını içeren farklı bilgileri içeren bir dizi olduğunu görüyorum.

Bunları çalıştırabilir, düğümü kapıp sonuçları kendim gösterebilirim ancak aramanın sonuçlarını oluşturmak için başka bir yöntem olması gerektiğini düşünüyorum. Yine de bulamadım ve sorun bu.

Search API ve Facet API'deki farklı sınıfları inceledim ve sonuç çıktısı oluşturacak gibi görünen hiçbir şey bulamıyorum.

Bununla ilgili herhangi bir yardım takdir edilecektir.

Sonuçlar örneği:

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
    )

)

Bağlam için sonuç dizisinden bir döküm sağlayabilir misiniz? Doğruca theme_search_results
Clive

1
“Bunları gözden geçirebilir, düğümü kapıp sonuçları kendim gösterebilirim ancak aramanın sonuçlarını oluşturmak için başka bir yöntem olması gerektiğini düşündüm. Yine de bulamadım ve sorun bu.” - node_view_multiple () ?
Garrett Albright

Clive: Sorumu arama sonuçlarının çıktısıyla güncelleştirdim. Garrett: Bu fonksiyonu gösterdiğin için teşekkürler, var olduğunu bilmiyordum. Diğer bazı projeler için kullanışlı olacak ancak burada ne yapmak istediğimle hiçbir ilgisi yok. :) Search API sınıflarında alakalı arama metnini vurgulayan ve görüntüleyen bir anahtar kelime olması gerekiyordu, ancak sonuçların bu yöntemleri kullanarak nasıl işlenebileceğini bulamadım. Şimdiye kadar yardım için teşekkürler! :)
Jason Gray

Drupal API'sındaki arama işlevlerine bakmayı denediniz mi? api.drupal.org/api/drupal/modules!search!search.module/7
Agi Hammerthief

Sorumu tarif ettiğim durumda kullandınız mı?
Jason Gray

Yanıtlar:


4

Baktığınız mı Arama API sayfalar modülü . Arama API modülünü kullanır ve özel bir arama sayfası oluşturur. Yapmaya çalıştığınız şeyi nasıl uygulayacağınızla ilgili ipuçları için muhtemelen bu modüle bakabilirsiniz. Modülün kendisi, aradığınız birçok işlevi bile sağlayabilir.


1
Açıkça sayfa veya görünüm kullanmayan bir çözüm istendi
Daniel Waters

Hayır, “Görüşleri çeşitli nedenlerle kullanmamak” dedi. Arama API modülü yok. Üzgünüm önerim yardımcı
olmadıysa

2
Arama API sayfaları modülünün iyi bir başlangıç ​​yeri olduğunu kabul etmek zorunda kalacağım! Daha önce özel bir arama yaptım ve buradaki kodu sayfaları kullanmadan yapılabilecek bir başlangıç ​​noktası olarak kullandım!
paaat

1

İşte yaklaşık 100 satırdaki çözümüm - sayfalardan biraz daha basit ...

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
Form durumu yönlendirmelerini kullanın ve drupal_goto'yu kullanın.
Kevin,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.