sphinx api 搜索 Sphinx 2.2.10-release
来源:互联网 发布:同望预算软件 编辑:程序博客网 时间:2024/05/16 19:37
sphinx 下载:http://sphinxsearch.com/downloads/release/
sphinxapi在 Sphinx 2.2.10-release安装包 解压
<?php/** * sphinx组装搜索客户列表类 * @author 弗拉基米尔 */class Searchdata{ private $host; private $port; private $indexname; private $cl; public function __construct() { $this->cl = new SphinxClient(); } public function setHost($host){ if($host){ $this->host=$host; } else { $this->host=PublicFun::getConfigValue('sphinxsearch','host'); } } public function setPort($port){ if($port){ $this->port=$port; } else { $this->port=PublicFun::getConfigValue('sphinxsearch','port'); } } public function setIndexName($indexname){ if($indexname){ $this->indexname=$indexname; } } /** * 作者: * 时间:2016-06-28 * 功能:组合大数据的生成,进行搜索 * @param string $seller_id 商家id * @param array $data * $data=array( array('key'=>'seller_id','value'=>'w132'), array('key'=>'sex','value'=>3), array('key'=>'','value'=array('min'=>1,'max'=>5),'type'=>1) array('key'=>'end_order_time','value'=>1464359259) ); * @param array $sort * $sort=array( array('key'=>'end_order_time','value'=>2), array('key'=>'user_id','value'=>2), ); // 1 :降序 2:升序 * @param int $pageindex 当前页码 * @param int $dividenum 每页多少条 */ public function sphinxData($seller_id,$data,$sort,$pageindex,$dividenum){ if(!($this->host )){ $msg=array( 'errcode'=>1,'errmsg'=>'主机为空'); return $msg; exit(); } if(!($this->port )){ $msg=array( 'errcode'=>1,'errmsg'=>'端口号为空'); return $msg; exit(); } if(!($this->indexname )){ $msg=array( 'errcode'=>1,'errmsg'=>'数据源索引为空'); return $msg; exit(); } if(intval($pageindex)>0){ $pageindex=intval($pageindex); } else { $pageindex=1; } if (intval($dividenum)>0){ $dividenum=intval($dividenum); } else { $dividenum=20; } $startlimit=($pageindex-1)*$dividenum; $endlimit=$pageindex*$dividenum; $this->cl->SetServer ( $this->host, $this->port ); $this->cl->SetConnectTimeout ( 1 ); $this->cl->SetArrayResult ( true ); $this->cl->SetMatchMode (SPH_MATCH_EXTENDED2); $this->cl->SetIDRange(0,0); $this->cl->SetLimits($startlimit,$dividenum,$endlimit); $attrarr=array(); $filedarr=array(); for ($i=0;$i<count($data);$i++){ $value= $this->getFiledAttr(trim($data[$i]["key"])); $searchtype=$data[$i]["type"]; if($searchtype===NULL){ $searchtype=1; } else if(intval($searchtype)>=0) { $searchtype=intval($searchtype); } else{ $searchtype=1; } switch ($searchtype){ case 0:$searchstatus=true;break; case 1:$searchstatus=false;break; default:$searchstatus=false;break; } if($value){ switch ($value["AF"]){ case 'F':// filed switch ($value["type"]["type"]){ case 'string': if(is_array($data[$i]["value"])){ $temp=''; for($j=0;$j<count($data[$i]["value"]);$j++){ if($data[$i]["value"][$j]===''){ continue; } if ($j==count($data[$i]["value"])-1){ $temp=$temp.'"'.$data[$i]["value"][$j].'"'; } else{ $temp=$temp.'"'.$data[$i]["value"][$j].'"'.'|'; } } $keycon='@'.$data[$i]["key"].'='.$temp.''; } else{ $keycon='@'.$data[$i]["key"].'="'.$data[$i]["value"].'"'; } break; case 'int': if(is_array($data[$i]["value"])){ $temp=''; for($j=0;$j<count($data[$i]["value"]);$j++){ if($data[$i]["value"][$j]===''){ continue; } if ($j==count($data[$i]["value"])-1){ $temp=$temp.intval($data[$i]["value"][$j]); } else{ $temp=$temp.intval($data[$i]["value"][$j]).'|'; } } $keycon='@'.$data[$i]["key"].'='.$temp.''; } else{ $keycon='@'.$data[$i]["key"].'='.intval($data[$i]["value"]).''; } break; case 'float':if(is_array($data[$i]["value"])){ $temp=''; for($j=0;$j<count($data[$i]["value"]);$j++){ if($data[$i]["value"][$j]===''){ continue; } if ($j==count($data[$i]["value"])-1){ $temp=$temp.floatval($data[$i]["value"][$j]); } else{ $temp=$temp.floatval($data[$i]["value"][$j]).'|'; } } $keycon='@'.$data[$i]["key"].'='.$temp.''; } else{ $keycon='@'.$data[$i]["key"].'='.floatval($data[$i]["value"]).''; } break; default:break; } if($keycon){ array_push($filedarr,$keycon); } break; case 'A':// attr switch ($value["type"]["type"]) { case 'string': $this->cl->SetFilterString($data[$i]["key"], $data[$i]["value"],$searchstatus); break; case 'int': if(is_array($data[$i]["value"])){ switch ($value["type"]["style"]){ case 'single' :$this->cl->SetFilter($data[$i]["key"], intval($data[$i]["value"]),$searchstatus);break; case 'range' : $min=intval($data[$i]["value"]["min"]); $max=intval($data[$i]["value"]["max"]); $this->cl->SetFilterRange($data[$i]["key"], $min, $max,$searchstatus);break; case 'multi': for($j=0;$j<count($data[$i]["value"]);$j++) { $data[$i]["value"][$j] = intval($data[$i]["value"][$j]); } $this->cl->SetFilter($data[$i]["key"], $data[$i]["value"],$searchstatus);break; default:break; } } else{ $this->cl->SetFilter($data[$i]["key"], array(intval($data[$i]["value"])),$searchstatus); } break; case 'float': if(is_array($data[$i]["value"])){ switch ($value["type"]["style"]){ case 'single' : $this->cl->SetFilter($data[$i]["key"], floatval($data[$i]["value"]),$searchstatus);break; case 'range' : $min=floatval($data[$i]["value"]["min"]); $max=floatval($data[$i]["value"]["max"]); $this->cl->SetFilterRange($data[$i]["key"], $min, $max,$searchstatus);break; case 'multi': for($j=0;$j<count($data[$i]["value"]);$j++) { $data[$i]["value"][$j] = intval($data[$i]["value"][$j]); } $this->cl->SetFilter($data[$i]["key"], $data[$i]["value"],$searchstatus);break; default:break; } } else{ $this->cl->SetFilter($data[$i]["key"], array(floatval($data[$i]["value"])),$searchstatus); } break; default:break; } break; default:break; } } else{ continue; } } // key 条件的进行 记录。 $query=''; for ($m=0;$m<count($filedarr);$m++){ if($m==count($filedarr)-1){ $query=$query.$filedarr[$m]; } else{ $query=$query.$filedarr[$m].' & '; } } // $query='@area = "广东" '; // 关于 排序 的进行 组装 , $sortarr=$this->getSortFields(); $sortstr=''; foreach ($sort as $key => $sortsingle){ if(in_array($sortsingle["key"], $sortarr)){ switch (intval($sortsingle["value"])){ case 1:$str= $sortsingle["key"].' DESC '; break; case 2: $str= $sortsingle["key"].' ASC '; break; default: $str='';break; } $sortstr= $sortstr.$str; } else{ continue; } } if(trim($sortstr)!=''){ $this->cl->SetSortMode(SPH_SORT_EXTENDED,$sortstr); } $result=$this->cl->Query($query,$this->indexname); if($result===false){ $lastdata=array(); $totalnum=0; $msg=array('errcode'=>1,'data'=>$lastdata); } else { if($result["matches"]){ foreach ( $result["matches"] as $docinfo ) { $cid = $docinfo["id"]; $res_tmp = $docinfo["attrs"]; $lastdata[$cid] = $res_tmp; } $totalnum=$result["total_found"]; $msg=array('errcode'=>0,'data'=>$lastdata); } else { $lastdata=array(); $totalnum=0; $msg=array('errcode'=>1,'data'=>$lastdata); } } $page= new Page(); $pageinfo=$page->getPage($pageindex, $totalnum, $dividenum); $msg["page"]=$pageinfo; $msg["msg"]=$result["warning"]; return $msg; } private function getSortFields(){ $sortarr=array( 'sum_active_day', 'interaction_time', 'attention_time', 'order_fee', 'order_num', 'nopay_order_num', 'first_order_time', 'end_order_time', 'pay_time', 'continuous_active_day' ); return $sortarr; } private function getFiledAttr($str){ $fields=array( 'nickname'=>array('type'=>'string','style'=>'single'), 'area'=>array('type'=>'string','style'=>'multi'), 'service_remarks'=>array('type'=>'string','style'=>'single') ); $attrs=array( 'sum_active_day'=>array('type'=>'int','style'=>'multi'), 'plat_type'=>array('type'=>'int','style'=>'single'), 'user_id'=>array('type'=>'string','style'=>'single'), 'seller_id'=>array('type'=>'string','style'=>'single'), 'open_id'=>array('type'=>'string','style'=>'single'), 'payment'=>array('type'=>'float','style'=>'range'), 'order_num'=>array('type'=>'int','style'=>'range'), 'attention_status'=>array('type'=>'int','style'=>'single'), 'sex'=>array('type'=>'int','style'=>'single'), 'masscount'=>array('type'=>'int','style'=>'multi'),//备注 'interaction_time'=>array('type'=>'int','style'=>'range'), 'attention_time'=>array('type'=>'int','style'=>'range'), 'cancel_attention_time'=>array('type'=>'int','style'=>'range'), 'continuous_active_day'=>array('type'=>'int','style'=>'range'), 'nopay_order_num'=>array('type'=>'int','style'=>'range'), 'first_order_time'=>array('type'=>'int','style'=>'range'), 'end_order_time'=>array('type'=>'int','style'=>'range'), 'pay_time'=>array('type'=>'int','style'=>'range') ); if(array_key_exists($str, $attrs)){ $return=array('type'=>$attrs[$str],'AF'=>'A'); } else if(array_key_exists($str, $fields)){ $return=array('type'=>$fields[$str],'AF'=>'F'); } else { $return=array(); } return $return; } /** * 作者:弗拉基米尔 * 时间:2016-07-05 * 功能:更新属性 * @param string $index * @param array() $attrs * @param array() $values * @return 1 或者 -1 * demo: * $attrs=array('sex','masscount') * $values=array( 170698=>array(3,1) ); */ public function UpdateAttributes($index, $attrs, $values){ $result=$this->cl->UpdateAttributes($index, $attrs, $values); return $result; }}
关于分页的方法
<?php/** * 类名:Page * @author 弗拉基米尔 * 功能:分页展示 * @param string $pageclassname // js 交互使用类名 * @param int $pagedisplaycount1 // 分页条 展示多少条页码 5条 * @param int $totalnum //结果集总数 例如:385条 * @param int $pagenum //每页显示条数 例如:20条 * @param int $pageindex //当前页码 例如: 第2页 */class Page{ /** * 作者:弗拉基米尔 * 时间:2016-06-25 * 功能:根据 当前页,总页,分割条数,还回分页【首页】【上一页】【下一页】【末页】 【总页数】【总条数】 * * @param int $pageindex * @param int $totalnum * @param int $dividenum * @return array() multitype:number Ambigous <number, unknown> unknown */ public function getPage($pageindex,$totalnum,$dividenum){ if(is_string($pageindex)){ $pageindex=intval($pageindex); } if(is_string($totalnum)){ $totalnum=intval($totalnum); } if(is_string($dividenum)){ $dividenum=intval($dividenum); } if(!is_int($pageindex) || (int)($pageindex)<=0){ $pageindex=1; } if(!is_int($totalnum) || (int)($totalnum)<0){ $totalnum=0; } if(!is_int($dividenum) || (int)($dividenum)<=0){ $dividenum=10; } $page_num= ceil($totalnum/$dividenum); $page_num=$page_num?$page_num:1; $pagefirst=1; $pagelast=$page_num; // 处理当前页>总页 不符合逻辑 默认置为1 if($pageindex>$page_num){ $pageindex=1; } if($pageindex-1==0){ $pagepre=1; } else { $pagepre= $pageindex-1; } if ($pageindex+1<=$pagelast){ $pagenext=$pageindex+1; } else{ $pagenext=$pagelast; } $page = array( 'totalnum' => $totalnum, // 总条数 'pagefirst'=>$pagefirst , // 首页 'pagepre' => $pagepre, // 前一页 'pagenow' => $pageindex, // 当前页 'pagenext' => $pagenext, // 下一页 'pagelast'=>$pagelast, // 末页 'pagenum' => $page_num, // 页数 'dividenum'=>$dividenum ); return $page; }}
组合搜索 排序,范围搜索
调用 demo
public function sphinxnewAction(){ $search = new Searchdata(); $seller_id='w132'; // 排序字段 // 1 :降序 2:升序 可以 多字段排序 $sort=array( array('key'=>'end_order_time','value'=>2), array('key'=>'user_id','value'=>2), ); $data=array( array('key'=>'seller_id','value'=>'w132') ); $search->setHost('192.168.0.211'); $search->setPort('9510'); $search->setIndexName('dist0'); $result=$search->sphinxData( $seller_id,$data,$sort,1,15); var_dump($result); }
0 0
- sphinx api 搜索 Sphinx 2.2.10-release
- sphinx-release 2.1.4
- sphinx
- sphinx
- sphinx
- sphinx
- Sphinx
- Sphinx
- Sphinx
- sphinx
- sphinx
- sphinx
- sphinx
- Sphinx
- sphinx
- Sphinx
- sphinx
- sphinx
- ACM课程总结
- mysql日志详细解析
- 唐诗辑注 —— 辛夷坞、南园十三首、问六十九
- 初学者对于I/O流的小节-上
- 【Unity优化】关于优化方面的整理
- sphinx api 搜索 Sphinx 2.2.10-release
- 二叉树的中序遍历、递归实现、非递归实现、层次遍历、二叉树的应用,来来来,都有都有
- 顺丰BSP接口PHP开发注意事项
- 将一个媒体文件切割成多个碎片
- MySQL树形查询
- CPU简介
- [Database] 数据库事务隔离级别 2
- Vino& VNC server auto start after Ubuntu boot up
- 环形队列