solr自身提供了http的接口方法,这是用php实现的简单封装,其它语言也可以根据相应的http接口做方便实现。 ?phpclass SolrUtil{private $solrserver = '';private $core = '';/** * * @param unknown_type $core $
<?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; } } ?>
<?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); ?>