天天看點

PHP用戶端 solr查詢具體實作Sorl簡介

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=) {
        $this->_url		  = $url;
        $this->_core_name = $core_name;
        if(===$wt) {
            $wt = 'php';
        } elseif(===$wt) {
            $wt = 'json';
        } else {
            $wt = 'xml';
        }
        $this->_wt = $wt;
    }

    public function curl_get($url, $time_out=) {
        if( === 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[] = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            $res[] = $data;
            curl_close($ch);
            return $res;
        } else {
            echo 'ERROR URL';
            exit();
        }
    }

    public function curl_post($url, $vars) {
        if( === 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[] = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            $res[] = $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=) {
        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=, $rows=, $wt="json"){
        try {
            $query .= "&wt=".$wt . "&start=".$start . "&rows=".$rows;
            $rejsondata = self::q($query);
            if($rejsondata[]==){
                return json_decode($rejsondata[], 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'], );

        //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 = ;
        $rows = ;

        //傳回查詢的資料
        $searchdataarr = $solrobj->solrQuery($query, $start, $rows);
        //solr search END
        }