1. 程式人生 > >PHP客戶端 solr查詢具體實現

PHP客戶端 solr查詢具體實現

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.分析查詢地址,拼湊查詢地址

這裡直接用的是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////////////////////////////////////////////////////////
        }