2016-10-04 76 views
6

我正在使用apache solr搜索引擎来实现我的网站搜索。我能够设置Apache Solr Search模块,现在我的搜索正在按需要工作。现在我试图在Apache Solr Autocomplete模块的帮助下实现搜索自动完成,但事情是我试图将节点标题显示为建议列表而不是关键字。最后,我发现这tutorial,并试图说,我似乎正在工作,但现在我陷入了一个AJAX HTTP错误(500)。而且我发现4的错误讯息,我的Drupal的错误日志: -Apache Solr搜索自动完成

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). 

我猜这个教程几乎做我们找工作,不幸的是他们不再提供支持或评论任何回应。有人能够找出一种方法来实现这个很酷的功能吗?即使有人提出许可证版本,我也很乐意购买。多谢你们。

这是当前Apache Solr Autocomplete的样子(下图),在这个建议列表中他们列出了来自搜索索引的搜索关键字。我想要做的是在此建议列表中列出节点标题。

enter image description here

+0

您正在使用什么版本的模块?你编辑模块了吗?在最后一个版本中,第461行对应一个变量赋值($ context)。 – EricLavault

+0

我使用的是“Apache Solr Search 7.x-1.8,Apache Solr Autocomplete 7.x-1.6,solr-4.5.1”。根据教程,我用自己定制的函数替换'function apachesolr_autocomplete_suggest()'。 – nanbatman

+0

我刚刚注意到有这个丑陋的覆盖,我不会推荐这个教程。此外,由于* label_autocomplete *字段为'stored = true',因此字段的实际值可以通过查询检索,因此作者应该坚持使用小写过滤器,而不是将保留的小写标题链接到字段中。 – EricLavault

回答

5

这只是一招,没有不正确的方法,但你可以试试。

首先,您应该捕获Solr查询,该查询在您搜索时执行。

我使用solr级别模块来捕获查询。然后用钩子创建你自己的模块。

/** 
* 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); 

}