php調用solr封裝

yxwpx 10年前發布 | 2K 次閱讀 PHP Solr

solr自身提供了http的接口方法,這是用php實現的簡單封裝,其它語言也可以根據相應的http接口做方便實現。

<?php
class SolrUtil
{
    private $solrserver = '';
    private $core = '';

/**
 * 
 * @param unknown_type $core $multicore中的索引實例名稱
 * @param unknown_type $solrserver solr服務器地址
 * @return boolean
 */
public function __construct($solrserver, $core = null)
{
    $this->solrserver = $solrserver;
    if(isset($core) == true)
    {
        $this->core = $core;
    }
}

public function setCore($core){
    $this->core = $core;
}
public function getCore(){
    return $this->core;
}
/**
 * 
 * @param unknown_type $data
 * $data['q'] 查詢關鍵詞
 * $data['page'] 當前頁
 * $data['pageSize'] 每頁數據量
 * $data['fl'] 查詢結果返回的字段,
 * $data['sort'] 排序字段,
 * $data['wt'] 返回結果格式,可選值json或xml,默認返回json格式
 * $data['hl.fl'] 指定高亮字段,
 * $data['facet.field'] 分組統計
 * hl=true&hl.fl=name,features
 */
public function select($data)
{
    $result = array('success'=>0,'info'=>'操作失敗');
    if(empty($data['q']) == true)
    {
        $result = array('success'=>0,'info'=>'關鍵詞不能為空');
    }
    else
    {
        $parame = array();
        $parame['q'] = urlencode($data['q']);
        $rows = isset($data['pageSize']) == true ? intval($data['pageSize']) : 25;
        $page = isset($data['page']) == true ? intval($data['page']) : 1;
        $start = $page > 0 ? ($page - 1) * $rows : 0;
        $parame['start'] = $start;
        $parame['rows'] = $rows;
        if(empty($data['fl']) == false)
        {
            $parame['fl'] = urlencode($data['fl']);

        }
        if(empty($data['sort']) == false)
        {
            $parame['sort'] = urlencode($data['sort']);
        }
        if(empty($data['hl.fl']) == false)
        {
            $parame['hl.fl'] = urlencode($data['hl.fl']);
        }
        if(empty($data['facet.field']) == false)
        {
            $fields = $data['facet.field'];
            $fieldStr = '';
            foreach($fields as $field)
            {
                if($fieldStr == ''){
                    $fieldStr = $field;
                }
                else
                {
                    $fieldStr .= '&facet.field='.$field;
                }
            }
            $parame['facet'] = 'true';
            $parame['facet.field'] = $fieldStr;
        }

        $method = 'select';
        $solrData = $this->httpGet($method, $parame);

        if(empty($solrData) == false)
        {
            $data = json_decode($solrData, true);
            if(isset($data['responseHeader']['status']) == true && $data['responseHeader']['status'] == 0)
            {
                $result = array('success'=>1,'info'=>'操作成功', 'data'=>$data);
            }
            else
            {
                $result = array('success'=>0,'info'=>'查詢失敗', 'error'=>$solrData);
            }
        }
        else
        {
            $result = array('success'=>0,'info'=>'網絡錯誤,服務器繁忙');
        }
    }
    return $result;
}

/**
 * 分詞
 * $data['q'] 查詢關鍵詞
 */
public function analysis($data){
    $result = array('success'=>0,'info'=>'操作失敗');
    if(empty($data['q']) == true)
    {
        $result = array('success'=>0,'info'=>'關鍵詞不能為空');
    }
    else
    {
        $parame = array();
        $parame['q'] = urlencode($data['q']);
        $method = 'analysis/field';
        $solrData = $this->httpGet($method, $parame);

        if(empty($solrData) == false)
        {
            $data = json_decode($solrData, true);
            if(isset($data['responseHeader']['status']) == true && $data['responseHeader']['status'] == 0)
            {
                $result = array('success'=>1,'info'=>'操作成功', 'data'=>$data);
            }
            else
            {
                $result = array('success'=>0,'info'=>'分詞失敗', 'error'=>$solrData);
            }
        }
        else
        {
            $result = array('success'=>0,'info'=>'網絡錯誤,服務器繁忙');
        }

    }
    return $result;
}

/**
 * 搜索建議
 * @param array $data
 * $data['q'] 關鍵詞
 */
public function suggest($data)
{
    $result = array('success'=>0,'info'=>'操作失敗');
    if(empty($data['q']) == true)
    {
        $result = array('success'=>0,'info'=>'關鍵詞不能為空');
    }
    else
    {
        $parame = array();
        $parame['spellcheck.q'] = urlencode($data['q']);
        $parame['spellcheck'] = 'true';
        $method = 'suggest';
        $solrData = $this->httpGet($method, $parame);


        if(empty($solrData) == false)
        {
            $data = json_decode($solrData, true);
            if(isset($data['responseHeader']['status']) == true && $data['responseHeader']['status'] == 0)
            {
                $result = array('success'=>1,'info'=>'操作成功', 'data'=>$data);
            }
            else
            {
                $result = array('success'=>0,'info'=>'獲取搜索 建議失敗', 'error'=>$solrData);
            }
        }
        else
        {
            $result = array('success'=>0,'info'=>'網絡錯誤,服務器繁忙');
        }

    }
    return $result;
}

/**
 * 相似搜索
 * @param unknown_type $data
 * $data['q'] 查詢關鍵詞
 */
public function moreLike($data)
{
    $result = array('success'=>0,'info'=>'操作失敗');
    if(empty($data['q']) == true)
    {
        $result = array('success'=>0,'info'=>'關鍵詞不能為空');
    }
    else{
        if(isset($data) == false){
            $data = array();
        }
        $data['command'] = 'status';
        $method = 'dataimport';
        $solrData = $this->httpGet($method, $data);

        if(empty($solrData) == false)
        {
            $data = json_decode($solrData, true);
            if(isset($data['responseHeader']['status']) == true && $data['responseHeader']['status'] == 0)
            {
                $result = array('success'=>1,'info'=>'操作成功', 'data'=>$data);
            }
            else
            {
                $result = array('success'=>0,'info'=>'增量更新索引失敗', 'error'=>$solrData);
            }
        }
        else
        {
            $result = array('success'=>0,'info'=>'網絡錯誤,服務器繁忙');
        }
    }
    return $result;
}

/**
 * 全量導入索引
 * @param array $data
 * $data['clean']    可選參數,為true時刪除原有索引,false不刪除,默認值為true
 * $data['wt']       可選參數,返回的數據格式,值為json或xml
 * $data['entity']   可選參數,document下面的標簽(data-config.xml),使用這個參數可以有選擇的執行一個或多個entity。如果不選擇此參數那么所有的都會被運行
 * $data['commit']   可選參數,選擇是否在索引完成之后提交。默認為true
 * $data['optimize'] 可選參數,默認為true
 * $data['debug']    可選參數,是否以調試模式運行,如果以調試模式運行,那么默認不會自動提交,請加參數“commit=true”
 */
public function fullImport($data = null)
{
    if(isset($data) == false){
        $data = array();
    }
    $data['command'] = 'full-import';
    $method = 'dataimport';
    $solrData = $this->httpGet($method, $data);

    if(empty($solrData) == false)
    {
        $data = json_decode($solrData, true);
        if(isset($data['responseHeader']['status']) == true && $data['responseHeader']['status'] == 0)
        {
            $result = array('success'=>1,'info'=>'操作成功', 'data'=>$data);
        }
        else
        {
            $result = array('success'=>0,'info'=>'網絡錯誤,服務器繁忙', 'error'=>$solrData);
        }
    }
    else
    {
        $result = array('success'=>0,'info'=>'網絡錯誤,服務器繁忙');
    }
    return $result;
}

/**
 * 增量更新索引
 * @param array $data
 * $data['wt'] 返回的數據格式,值為json或xml,默認json
 */
public function deltaImport($data = null)
{
    if(isset($data) == false){
        $data = array();
    }
    $data['command'] = 'delta-import';
    $method = 'dataimport';
    $solrData = $this->httpGet($method, $data);
    if(empty($solrData) == false)
    {
        $result = array('success'=>1,'info'=>'操作成功', 'data'=>json_decode($solrData, true));
    }
    else
    {
        $result = array('success'=>0,'info'=>'增量更新索引失敗,服務器繁忙', );
    }
    return $result;
}

/**
 * 查看當前dataimport索引更新狀態
 * @param unknown_type $data
 */
public function statusImport($data = null)
{
    if(isset($data) == false){
        $data = array();
    }
    $data['command'] = 'status';
    $method = 'dataimport';
    $solrData = $this->httpGet($method, $data);
    if(empty($solrData) == false)
    {
        $result = array('success'=>1,'info'=>'操作成功', 'data'=>json_decode($solrData, true));
    }
    else
    {
        $result = array('success'=>0,'info'=>'增量更新索引失敗,服務器繁忙');
    }
    return $result;
}

/**
 * 終止當前執行的dataimport任務
 * @param array $data
 */
public function abortImport($data = null)
{
    if(isset($data) == false){
        $data = array();
    }
    $data['command'] = 'abort';
    $method = 'dataimport';
    $solrData = $this->httpGet($method, $data);
    if(empty($solrData) == false)
    {
        $result = array('success'=>1,'info'=>'操作成功', 'data'=>json_decode($solrData, true));
    }
    else
    {
        $result = array('success'=>0,'info'=>'增量更新索引失敗,服務器繁忙');
    }
    return $result;
}

/**
 * 
 * @param array $datas 格式
 * 批量更新$datas=array(array('id'=>xx, 'app_name'=>array('set'=>'測試')))),id為索引主鍵字段,必須包含主鍵值
 * 單個更新$datas=array('id'=>xx, 'app_search_text'=>array('add'=>'測試'), 'look_count'=>array('inc'=>10))
 * set 設置或替當前值,null清空當前值
 * add 如果字段屬性為multi-valued,添加一個值
 * inc 設置自增加值
 */
public function update($datas)
{
    $parame = '';
    $result = array('success'=>0,'info'=>'操作失敗');
    if(isset($datas[0]) == false || is_array($datas[0]) == false){
        $datas = array($datas);
    }
    // 確定只做更新操作,如果不帶set則會刪除舊索引,再重新創建
    foreach($datas as $data)
    {
        $hasSet = false;
        foreach($data as $key=>$value)
        {
            if(empty($value['set']) == false)
            {
                $hasSet = true;
                continue;
            }
        }
        if($hasSet == false)
        {
            $result = array('success'=>0,'info'=>'參數錯誤,缺少set參數,請修改');
            return $result;
        }
    }

    $method = '/update?commit=true';
    $solrData = $this->httpPost($method, $datas);

    if(empty($solrData) == false)
    {
        $data = json_decode($solrData, true);
        if(isset($data['responseHeader']['status']) == true && $data['responseHeader']['status'] == 0)
        {
            $result = array('success'=>1,'info'=>'操作成功', 'data'=>json_decode($solrData, true));
        }
        else
        {
            $result = array('success'=>0,'info'=>'更新失敗', 'error'=>$solrData);
        }
    }
    else
    {
        $result = array('success'=>0,'info'=>'網絡錯誤,服務器繁忙');
    }
    return $result;
}

/**
 * 刪除索引 
 * @param unknown_type $data $data=array('id'=>xx),id為索引主鍵字段
 * @return multitype:number string
 */
public function delete($data)
{
    $data = array('delete'=>$data);

    $method = '/update?commit=true';
    $solrData = $this->httpPost($method, $data);
    if(empty($solrData) == false)
    {
        $data = json_decode($solrData, true);
        if(isset($data['responseHeader']['status']) == true && $data['responseHeader']['status'] == 0)
        {
            $result = array('success'=>1,'info'=>'操作成功', 'data'=>json_decode($solrData, true));
        }
        else
        {
            $result = array('success'=>0,'info'=>'更新失敗', 'error'=>$solrData);
        }
    }
    else
    {
        $result = array('success'=>0,'info'=>'網絡錯誤,服務器繁忙');
    }
    return $result;
}

/**
 * 添加索引(不建議在程序中調用 ),注意:如果主鍵值相同,則會先刪除舊索引,再添加新數據
 * @param unknown_type $datas
 *  批量添加$datas=array(array('id'=>xx, 'app_name'=>'測試測試'),id為索引主鍵字段,必須包含主鍵值
 * @return multitype:number string
 */
public function add($datas)
{
    $parame = '';
    $result = array('success'=>0,'info'=>'操作失敗');
    if(isset($datas[0]) == false || is_array($datas[0]) == false){
        $datas = array($datas);
    }

    $method = '/update?commit=true';
    $solrData = $this->httpPost($method, $datas);
    if(empty($solrData) == false)
    {
        $data = json_decode($solrData, true);
        if(isset($data['responseHeader']['status']) == true && $data['responseHeader']['status'] == 0)
        {
            $result = array('success'=>1,'info'=>'操作成功', 'data'=>json_decode($solrData, true));
        }
        else
        {
            $result = array('success'=>0,'info'=>'更新失敗', 'error'=>$solrData);
        }
    }
    else
    {
        $result = array('success'=>0,'info'=>'網絡錯誤,服務器繁忙');
    }
    return $result;
}

private function httpPost($method, $data){
    $data_string = json_encode($data);

// $url = $this->solrserver . $this->core . '/update?commit=true'; $url = $this->solrserver . $this->core . $method; $ch = curl_init($url); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); // 更新需要post提交 curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Content-Length: ' . strlen($data_string)) ); $solrData = curl_exec($ch); return $solrData; }

private function httpGet($method, $parame)
{
    $url = $this->solrserver . $this->core."/".$method;
    $data = "";
    $wt = 'json';
    if(empty($parame['wt']) == false)
    {
        $wt = $parame['wt'];
        unset($parame['wt']);
    }
    $url .= "?wt=".$wt;
    foreach($parame as $key=>$value)
    {
        $data .= "&". $key."=".$value;
    }
    $url .= $data;
    echo $url."\n";
    $result = file_get_contents($url);
    return $result;
}

}

?></pre>


<?php
include_once 'SolrUtil.php';
$solrUtil = new SolrUtil('http://127.0.0.1:8983/solr/', 'core1');
// $data = $solrUtil->select(array('q'=>'text:商業  AND app_name:測試'));
// $data = $solrUtil->select(array('q'=>'測試'));
$data = $solrUtil->select(array('q'=>'id:"864"'));
// $data = $solrUtil->analysis(array('q'=>'測試數據'));
// $data = $solrUtil->suggest(array('q'=>'測試'));
// $data = $solrUtil->moreLike(array('q'=>'測試'));
// $data = $solrUtil->fullImport();
// $data = $solrUtil->deltaImport();
// $data = $solrUtil->abortImport();
// $data = $solrUtil->statusImport();
// $data = $solrUtil->update(array('id' => 864,'app_name'=>array('set'=>'測試2')));
// $data = $solrUtil->delete(array('id'=>864));
// $data = $solrUtil->add(array('id'=>864, 'app_name' => '測試成功'));
print_r($data);
?>



 本文由用戶 yxwpx 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!