#php #apache #drupal #solr #autocomplete
#php #apache #drupal #solr #автозаполнение
Вопрос:
Я использую поисковую систему apache solr для реализации поиска по сайту. Я смог настроить модуль поиска Apache Solr, и теперь мой поиск работает так, как мне нужно. Теперь я пытаюсь реализовать автозаполнение поиска с помощью модуля автозаполнения Apache Solr, но дело в том, что я пытаюсь отображать заголовки узлов в виде списка предложений, а не ключевых слов. Наконец-то я нашел этот учебник и попробовал это, кажется, я работаю, но теперь я застрял с ошибкой HTTP AJAX (500). И я нашел 4 сообщения об ошибках в моем журнале ошибок drupal:-
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 (изображение ниже), в этом списке предложений перечислены ключевые слова для поиска из поискового индекса. То, что я пытаюсь сделать, это перечислить названия узлов в этом списке предложений.
Комментарии:
1. Какую версию модуля вы используете? Вы редактировали модуль? В последней версии строка 461 соответствует присвоению переменной ($context).
2. Я использую
Apache Solr Search 7.x-1.8, Apache Solr Autocomplete 7.x-1.6, solr-4.5.1
. Согласно руководствуfunction apachesolr_autocomplete_suggest()
, я заменяю его настроенным.3. Я только что заметил, что есть это уродливое переопределение, и я бы не рекомендовал этот учебник. Кроме того, поскольку поле label_autocomplete является
stored=true
фактическим значением поля, которое может быть получено запросами, поэтому автору следует придерживаться фильтра нижнего регистра вместо того, чтобы вставлять сохраненный и строчный заголовок в поле.4. Ваш правильный, обычно я не переопределяю исходный код модуля. Но в этом случае у меня нет другого выбора. Поскольку я использую Solr в первый раз, и я не смог найти способ реализовать эту функцию, даже нет платных лицензионных версий модулей. Не могли бы вы дать мне несколько советов по реализации этого модуля.
5. «Я думаю, этот учебник почти выполняет ту работу, которую мы ищем» — что вы хотите сделать, вы хотите, чтобы поисковые статьи выполнялись по названию узла, но отображались только один раз, не так ли?
Ответ №1:
Это просто трюк, а не неправильный способ, но вы можете попробовать.
Сначала вы должны записать запрос Solr, который выполняется при нажатии search.
Я использую модуль уровня 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(amp;$form, amp;$form_state, $form_id) {
$form['search_block_form'] = array(
'#type' => 'textfield',
'#autocomplete_path' => 'searchauto/autocomplete',
);
}
/**
* call back function for autocomplete
**/
function mymodule_search_autocomplete($string) {
unset($results);
$results = array();
$matches = array();
//replace the space with
$key = preg_replace('/[[:space:]] /', ' ', $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=0amp;rows=$num_resultamp;amp;spellcheck=trueamp;q=$keyamp;fl=id,entity_id,entity_type,bundle,bundle_name,label,ss_language,is_comment_count,ds_created,ds_changed,score,path,url,is_uid,tos_name,zm_parent_entity,ss_filemime,ss_file_entity_title,ss_file_entity_urlamp;mm=1amp;pf=content^2.0amp;ps=15amp;hl=trueamp;hl.fl=contentamp;hl.snippets=3amp;hl.mergeContigious=trueamp;f.content.hl.alternateField=teaseramp;f.content.hl.maxAlternateFieldLength=256amp;spellcheck.q=$keyamp;qf=content^40amp;qf=label^21.0amp;qf=tags_h1^3.0amp;qf=tags_h2_h3^3.0amp;qf=tags_inline^1.0amp;qf=taxonomy_names^2.0amp;qf=tos_name^3.0amp;facet=trueamp;facet.sort=countamp;facet.mincount=1amp;facet.field=im_field_taxonomy_app_catamp;f.im_field_taxonomy_app_cat.facet.limit=50amp;f.im_field_taxonomy_app_cat.facet.mincount=1amp;boost=eff_popularityamp;debugQuery=onamp;wt=jsonamp;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 amp;amp; $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);
}