php - Apache Solr búsqueda autocompletar
drupal autocomplete (1)
Estoy usando el motor de búsqueda apache solr para implementar mi búsqueda en el sitio. Pude configurar el módulo Apache Solr Search y ahora mi búsqueda está funcionando como lo necesito. Ahora trato de implementar un autocompletado de búsqueda con la ayuda del módulo Autocompletar de Apache Solr , pero la cuestión es que estoy tratando de mostrar los títulos del nodo como una lista de sugerencias en lugar de palabras clave. Finalmente encontré este tutorial y lo intenté, parece que estoy trabajando pero ahora estoy sorprendido con un error HTTP AJAX (500). Y encontré 4 mensajes de error en mi registro de error 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).
Supongo que este tutorial casi está haciendo el trabajo que buscamos, lamentablemente ya no brindan soporte ni ninguna respuesta a los comentarios. ¿Alguien puede encontrar la manera de implementar esta genial funcionalidad? Incluso si alguien presenta una versión de licencia, me complace comprar. Gracias chicos.
Este es el aspecto actual de autocompletado de Apache Solr (imagen inferior). En esta lista de sugerencias, enumeran las palabras clave de búsqueda del índice de búsqueda. Lo que intento hacer es enumerar los títulos de los nodos en esta lista de sugerencias.
Esto es solo un truco, no del modo incorrecto, pero puedes intentarlo.
Primero debes capturar la consulta de Solr, que se ejecuta cuando presionas la búsqueda.
Utilizo el módulo de nivel de solr para captar la consulta. Luego crea tu propio módulo con ganchos.
/**
* 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);
}