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