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
原创粉丝点击