2016-10-04 103 views
6

Site aramamı uygulamak için apache solr arama motorunu kullanıyorum. Apache Solr Search modülünü ayarlayabilirim ve şimdi aramam gerektiği gibi çalışıyor. Şimdi, Apache Solr Autocomplete modülünün yardımıyla bir arama otomatik tamamlama gerçekleştirmeye çalışıyorum, ancak şey, düğüm başlıklarını anahtar kelimeler yerine öneri listesi olarak göstermeye çalışıyorum. Sonunda bu tutorial'u buldum ve bunu denedim, çalışıyorum ama şimdi bir AJAX HTTP hatasıyla (500) sıkışmış durumdayım. Ve ben drupal hata günlüğünde 4 hata iletileri bulundu: -Apache Solr arama otomatik tamamlama

Notice: Undefined index: facet.prefix in apachesolr_autocomplete_suggest() (line 461 of /home/test/webroot/sites/all/modules/apachesolr_autocomplete/apachesolr_autocomplete.module). 

Warning: Invalid argument supplied for foreach() in apachesolr_autocomplete_suggest() (line 470 of /home/test/webroot/sites/all/modules/apachesolr_autocomplete/apachesolr_autocomplete.module). 

Notice: Trying to get property of non-object in apachesolr_autocomplete_suggest() (line 470 of /home/test/webroot/sites/all/modules/apachesolr_autocomplete/apachesolr_autocomplete.module). 

Notice: Undefined property: stdClass::$payslip in apachesolr_autocomplete_suggest() (line 469 of /home/test/webroot/sites/all/modules/apachesolr_autocomplete/apachesolr_autocomplete.module). 

Ben ne yazık ki artık destek veya yorumlara herhangi bir yanıt veren, bu öğretici neredeyse bizim aradığımız işi yapıyor sanırım. Bu harika işlevselliği uygulamaya koymanın bir yolu var mı? Bir lisans versiyonu ile çıksa bile, satın aldığım için mutluyum. Teşekkürler beyler.

Bu, geçerli Apache Solr Otomatik Tamamlama görünümüne benzemektedir (aşağıdaki resim), Bu öneri listesinde arama anahtar kelimelerini arama dizininden listeler. Yapmaya çalıştığım şey, bu öneri listesindeki düğüm başlıklarını listelemektir.

enter image description here

+0

? Modülü düzenledin mi? Son versiyonda, satır 461 değişken atamaya ($ bağlam) karşılık gelir. – EricLavault

+0

“Apache Solr Search 7.x-1.8, Apache Solr Autocomplete 7.x-1.6, solr-4.5.1' kullanıyorum. Öğreticiye göre, "apachesolr_autocomplete_suggest()" işlevini kendi özelleştirilmiş olanıyla değiştiriyorum. – nanbatman

+0

Sadece bu çirkin geçersiz kılma olduğunu fark ettim ve bu dersi tavsiye etmem. Buna ek olarak * label_autocomplete * alanı 'saklanır = true' olduğu için, alanın gerçek değeri sorgularla alınabilir, böylece yazar korunmuş ve küçük harfli bir başlığı alana yerleştirmek yerine küçük boyutlu bir filtreye yapışmalıdır. – EricLavault

cevap

5

Bu sadece bir hüner değil, değil doğru yoldur, ama deneyebilirsiniz.

İlk önce, arama yaptığınızda çalıştırılan Solr sorgusunu yakalamanız gerekir.

Sorguyu yakalamak için solr seviye modülünü kullanıyorum. Sonra kendi modülünüzü kancalarla oluşturun.

/** 
* Implements hook_menu(). 
*/ 

function mymodule_menu() { 
    $items = array(); 

    //create a call back for autocomplete search box 
    $items['searchauto/autocomplete'] = array(
    'page callback' => 'mymodule_search_autocomplete', 
    //'access arguments' => array('access search autocomplete'), 
    'type' => MENU_CALLBACK, 
    'access arguments' => array('access content'), 
); 

    return $items; 
} 
/** 

* hook_form_FORM_ID_alter 
* solr search form text box autocomplete 
**/ 
function mymodule_form_search_block_form_alter(&$form, &$form_state, $form_id) { 

    $form['search_block_form'] = array(
    '#type' => 'textfield', 
    '#autocomplete_path' => 'searchauto/autocomplete', 
); 
} 
/** 
a* call back function for autocomplete 
**/ 
function mymodule_search_autocomplete($string) { 

    unset($results); 
    $results = array(); 
    $matches = array(); 

    //replace the space with %20 
    $key = preg_replace('/[[:space:]]+/', '%20', $string); 
    //number of results you want to show 
    $num_result = 15; 
    //your Solr server path 
    $solr_server = "http://locathost/solr"; 

//this is the trick. first you should capture the Solr query, which executed when you hit search. I use the Solr level module to catch the query. you can change parameters if you want, I'm only changing the search keyword and number of results 
$request_url = $solr_server."/select?start=0&rows=$num_result&&spellcheck=true&q=$key&fl=id%2Centity_id%2Centity_type%2Cbundle%2Cbundle_name%2Clabel%2Css_language%2Cis_comment_count%2Cds_created%2Cds_changed%2Cscore%2Cpath%2Curl%2Cis_uid%2Ctos_name%2Czm_parent_entity%2Css_filemime%2Css_file_entity_title%2Css_file_entity_url&mm=1&pf=content%5E2.0&ps=15&hl=true&hl.fl=content&hl.snippets=3&hl.mergeContigious=true&f.content.hl.alternateField=teaser&f.content.hl.maxAlternateFieldLength=256&spellcheck.q=$key&qf=content%5E40&qf=label%5E21.0&qf=tags_h1%5E3.0&qf=tags_h2_h3%5E3.0&qf=tags_inline%5E1.0&qf=taxonomy_names%5E2.0&qf=tos_name%5E3.0&facet=true&facet.sort=count&facet.mincount=1&facet.field=im_field_taxonomy_app_cat&f.im_field_taxonomy_app_cat.facet.limit=50&f.im_field_taxonomy_app_cat.facet.mincount=1&boost=eff_popularity&debugQuery=on&wt=json&json.nl=map"; 
//exit; 
// Retrieve data from the external API 
$response = drupal_http_request($request_url); 

// Check the HTTP response code to see if a valid response was received 
if($response->code >= 200 && $response->code < 300) 
{ 

    //make sure response has values 
    if(isset($response)){ 
     $results = (array) json_decode($response->data); 
    } 
    if(isset($results)){ 
     //dsm($results); 
     //store the values into an array 
     if(isset($results['response']->docs)){ 
     $arrResults = $results['response']->docs; 
     } 
    } 

    //check array count 
    if(count($arrResults) > 0){ 
     //loop the results and add to array for json return data 
     foreach($arrResults as $row){ 
      //dsm($row); 
      //print $row->label; 
      //print "<br>"; 
      $matches[$row->url] = $row->label; 
     } 

    } 
    else{ 
     $matches[''] = "No Results Found!"; 
    } 
} 
else{ 
    $matches[''] = "Check server settings!"; 
} 

drupal_json_output($matches); 

} kullandığınız modülün hangi sürümü