Apache Solr 搜索自动完成 [英] Apache Solr search autocomplete

查看:21
本文介绍了Apache Solr 搜索自动完成的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 apache solr 搜索引擎来实现我的站点搜索.我能够设置

解决方案

这只是一个技巧,不是不正确的方法,但你可以试试.

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

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

/*** 实现 hook_menu().*/函数 mymodule_menu() {$items = array();//为自动完成搜索框创建回调$items['searchauto/autocomplete'] = array('页面回调' =>'mymodule_search_autocomplete',//'访问参数' =>数组('访问搜索自动完成'),'类型' =>菜单_回调,'访问参数' =>数组('访问内容'),);返回 $items;}/*** hook_form_FORM_ID_alter* solr 搜索表单文本框自动完成**/函数 mymodule_form_search_block_form_alter(&$form, &$form_state, $form_id) {$form['search_block_form'] = 数组('#type' =>'文本域','#autocomplete_path' =>'搜索自动/自动完成',);}/*** 自动完成回调函数**/功能 mymodule_search_autocomplete($string) {未设置($结果);$results = array();$matches = array();//用%20替换空格$key = preg_replace('/[[:space:]]+/', '%20', $string);//要显示的结果数$num_result = 15;//你的Solr服务器路径$solr_server = "http://locathost/solr";//这是诀窍.首先,您应该捕获 Solr 查询,该查询在您点击搜索时执行.我使用 Solr 级别模块来捕获查询.如果需要,您可以更改参数,我只更改搜索关键字和结果数量$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_comd2Cds_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.1.03&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=.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&json=json&json//出口;//从外部 API 检索数据$response = drupal_http_request($request_url);//检查 HTTP 响应代码以查看是否收到有效响应if($response->code>=200&&$response->code<300){//确保响应有值如果(isset($响应)){$results = (array) json_decode($response->data);}if(isset($results)){//dsm($results);//将值存入数组if(isset($results['response']->docs)){$arrResults = $results['response']->docs;}}//检查数组个数如果(计数($ arrResults)> 0){//循环结果并添加到数组以获取json返回数据foreach($arrResults as $row){//dsm($row);//打印 $row->label;//打印<br>";$matches[$row->url] = $row->label;}}别的{$matches[''] = "没有找到结果!";}}别的{$matches[''] = "检查服务器设置!";}drupal_json_output($matches);}

I'm using apache solr search engine to implement my site search. I able to setup the Apache Solr Search module and now my search is working as I need. Now I trying to implement an search autocomplete with the help of Apache Solr Autocomplete module, but the thing is I'm trying to show the node titles as suggestion list rather than keywords. Finally I found this tutorial and tried that, I seems to be working but now I'm stucked with an AJAX HTTP error (500). And I found 4 error messages in my drupal error log:-

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

I guess this tutorial almost doing the job we looking for, unfortunately they no longer providing support or any response to the comments. Is anyone able to figure out a way to implement this cool functionality? Even if anyone come up with a licence version, I'm happy to buy. Thanks guys.

This is the current Apache Solr Autocomplete look like (below image), In this suggestion list they listing the search keywords from the search index. What I'm trying to do is listing the node titles in this suggestion list.

解决方案

This is just a trick, not the not the correct way, but you can try.

First you should capture the Solr query, which executed when you hit search.

I use the solr level module to catch the query. Then create your own module with hooks.

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

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

这篇关于Apache Solr 搜索自动完成的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆