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);
}