PHP客户端 solr查询具体实现

来源:互联网 发布:网络教学的缺点 编辑:程序博客网 时间:2024/05/16 17:03

Sorl简介

Solr是一个基于Lucene的Java搜索引擎服务器。Solr 提供了层面搜索、命中醒目显示并且支持多种输出格式(包括 XML/XSLT 和 JSON 格式)。它易于安装和配置,而且附带了一个基于 HTTP 的管理界面。Solr已经在众多大型的网站中使用,较为成熟和稳定。Solr 包装并扩展了 Lucene,所以Solr的基本上沿用了Lucene的相关术语。更重要的是,Solr 创建的索引与 Lucene 搜索引擎库完全兼容。通过对Solr 进行适当的配置,某些情况下可能需要进行编码,Solr 可以阅读和使用构建到其他 Lucene 应用程序中的索引。此外,很多 Lucene 工具(如Nutch、 Luke)也可以使用Solr 创建的索引。

sorl在php中的具体实现步骤

  1. 写一个solr搜索操作基础类
  2. 实现具体调用操作类
  3. 分析查询地址,拼凑查询地址

1.写一个solr搜索操作基础类

将对solr的操作进行封装:

/****************************************************** 文件名:  solr.class.php* 功能:       solr搜索操作基础类* 版本:       1.0* 日期:       2016-06-15* 作者:       JoeXiong* 版权:       Copyright © 2016 https://github.com/JoeXiong All Rights Reserved*/class solr {    private $_url;    private $_core_name;    private $_wt;    /**     * 构造函数     * @param string $url     * @param string $core_name     * @param string $wt 0:php 1:json 2:xml     */    public function __construct($url, $core_name, $wt=0) {        $this->_url  = $url;        $this->_core_name = $core_name;        if(0===$wt) {            $wt = 'php';        } elseif(1===$wt) {            $wt = 'json';        } else {            $wt = 'xml';        }        $this->_wt = $wt;    }    public function curl_get($url, $time_out=1) {        if(0 === stripos($url, 'http:')){            $ch = curl_init();            curl_setopt($ch, CURLOPT_URL, $url);            curl_setopt($ch, CURLOPT_HEADER, false);            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);            curl_setopt($ch, CURLOPT_TIMEOUT, $time_out);            $data = curl_exec($ch);            $res[0] = curl_getinfo($ch, CURLINFO_HTTP_CODE);            $res[1] = $data;            curl_close($ch);            return $res;        } else {            echo 'ERROR URL';            exit();        }    }    public function curl_post($url, $vars) {        if(0 === stripos($url, 'http:')){            $ch = curl_init();            curl_setopt($ch, CURLOPT_URL, $url);            curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-                                         type:application/json'));            curl_setopt($ch, CURLOPT_HEADER, false);            curl_setopt($ch, CURLOPT_POST, true);            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);            curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);            $data = curl_exec($ch);            $res[0] = curl_getinfo($ch, CURLINFO_HTTP_CODE);            $res[1] = $data;            curl_close($ch);            return $res;        } else {            echo 'ERROR URL';            exit();        }    }    /**     * 搜索引擎状态     */    public function ping() {        return $this->curl_get($this->_url.$this->_core_name.                                '/admin/ping?wt='.$this->_wt);    }    /**     * 获得分词结果     * @param string $field_value     * @param string $field_type     * @return mixed     */    public function analysis($field_value, $field_type) {        return $this->curl_get($this->_url.                                $this->_core_name.                                $this->_wt.                                '&analysis.fieldvalue='.                                urlencode($field_value).                                '&analysis.fieldtype='.$field_type);    }    /**     * get function     * @return Ambigous <unknown, string>     */    public function getUrl() {        return $this->_url;    }    public function getCoreName() {        return $this->_core_name;    }    public function getWt() {        return $this->_wt;    }    /**     * set function     */    public function setUrl($url) {        $this->_url = $url;    }    public function setCoreName($core_name) {        $this->_core_name = $core_name;    }    public function setWt($wt) {        $this->_wt = $wt;    }}?>

2. 实现具体调用操作类

class solrsearcher extends solr {    public function __construct($url, $core_name, $wt) {        parent::__construct($url, $core_name, $wt);    }    public function q($query, $time_out=1) {        return self::curl_get(self::getUrl().self::getCoreName().'/select?'.$query,                                                         $time_out);    }    /**     * solr查询,返回查询结果数组     * @param : string $query 查询字符串     * @param : int $start 起始处     * @param : int $rows 返回条数     * @param : string $wt =>默认返回数据格式为json     * @return : array | boolean     * */    public function solrQuery($query="q=*:*", $start=0, $rows=64, $wt="json"){        try {            $query .= "&wt=".$wt . "&start=".$start . "&rows=".$rows;            $rejsondata = self::q($query);            if($rejsondata[0]==200){                return json_decode($rejsondata[1], true);            }else{                return FALSE;            }        } catch (Exception $e) {            throw $e;        }    }}

3.分析查询地址,拼凑查询地址

去服务器搭建好的solr先模拟请求,会有请求地址,比如我模拟出来我请求的地址是:
http://192.0.0.8:8083/solr/keyword/select?q=keyword%3At*&wt=json&indent=true

这里直接用的是q查询,看q=keyword%3At*&wt=json&indent=true,需要拼凑的字段就行

 public function solrKeywordAjax()    {        require_once (_SITE_ROOT_.'/config/solr.config.php');        $searchk =  isset($_POST['searchk'])?addslashes(trim($_POST['searchk'])):NULL;        $solrobj = new solrsearcher($solrserver['s1']['url'], $s1corename['10003']['corename'], 1);        //solr search BEGIN////////////////////////////////////////////////////        //$query = q=urlencode(pinyin:*$searchk*).&sort=urlencode($sort)        //判断值含有汉字 -- Y:keyword  N:pinyin        $flag = true; //搜索方式标记  true:keyword false:pinyin        if($searchk != null){            if (preg_match("/([\x81-\xfe][\x40-\xfe])/", $searchk, $match)) {                $q = 'keyword:'.$searchk.'*';            } else {                $q = 'pinyin:'.strtolower($searchk).'*';                $flag = false;            }        }else{            echo json_encode(array());            exit();        }        $sort = 'weight desc';        $query = '&q='.urlencode($q).'&sort='.urlencode($sort);        //显示条数        $start = 0;        $rows = 10;        //返回查询的数据        $searchdataarr = $solrobj->solrQuery($query, $start, $rows);        //solr search END////////////////////////////////////////////////////////        }
0 0
原创粉丝点击