zoukankan      html  css  js  c++  java
  • php sphinx 使用初探

      之前一直听说sphinx,感觉高深又神奇,可能是自己太小白了吧。。。。

      前段时间组长在开发服务器上搭sphinx环境,一个同事研究写接口,我就搭着顺风车开心了一下~~~~

      下面是写的一个简单的sphinx操作类库,此类库基于sphinxapi进行实现(小菜鸟一枚,请各大神指教)

    class TestApi{
        protected static $sp;           // sphinx 客户端
        private static $conf;           // 配置
    
        /**
         * @param $serverIp  sphinx 服务器ip
         * @param $port sphinx 端口号
         */
        public function __construct($conf=null)
        {
            if (!is_object(self::$sp))
                self::$sp           = new vendorsphinxSphinxClient();
    
            if (!$conf){
                return json_encode(['code'=>1,'msg'=>'请配置sphinx']);
            }
            self::$conf = $conf;
    
            self::setSp();      // 获取 sphinx 连接
        }
    
        /**
         * @return sphinxSphinxClient
         */
        private static function setSp()
        {
            $conf = self::$conf;    // 获取配置
    
            // 建立连接
            self::$sp->SetServer($conf['serverIp'],$conf['port']);
    
            // 超时时间
            self::$sp->SetConnectTimeout($conf['timeOut']);
    
            // 最大请求时间
            self::$sp->SetMaxQueryTime($conf['maxQueryTime']);
    
            // 返回数据为数组?
            self::$sp->SetArrayResult($conf['arrayResult']);
    
            // 匹配模式
            self::$sp->SetMatchMode($conf['matchMode']);
    
            return self::$sp;
    
        }
    
        /**
         * 分组查询
         * @param string $attribute 属性
         * @param int $func 默认 SPH_GROUPBY_DAY,SPH_GROUPBY_WEEK,SPH_GROUPBY_MONTH,SPH_GROUPBY_YEAR,SPH_GROUPBY_ATTR,SPH_GROUPBY_ATTRPAIR
         * DAY,WEEK,MONTH,YEAR这个一般可以用于搜索最近一天,一周,一月或一年的记录。ATTR表示按照指定的属性值分组
         */
        public function groupBy($attribute, $func, $groupsort='@group desc ')
        {
            self::$sp->SetGroupBy($attribute, $func, $groupsort);
            return $this;
        }
    
        /**
         *  设置字段权重
         * @param array $weights 权重数组,可以按字段名称来设定权重
         */
        public function fieldWeights($weights)
        {
            self::$sp->SetFieldweights($weights);
            return $this;
        }
    
        /**
         *  设置过滤条件
         * @param string $attribute 属性名(相当于字段名)
         * @param array  $values 值
         * @param boolean $exclude 为true时,相当于$attribute!=$value
        */
        public function setFilter($attribute, $values, $exclude=false)
        {
            self::$sp->SetFilter($attribute, $values, $exclude);
            return $this;
        }
    
        /**
         * @description 排序模式
         * sortMode 排序方法名 SPH_SORT_RELEVANCE,SPH_SORT_ATTR_DESC,SPH_SORT_ATTR_ASC,SPH_SORT_TIME_SEGMENTS,SPH_SORT_EXTENDED
         * @param string $sortBy 排序字段
         *
         */
        public function sortBy( $sortBy='')
        {
            self::$sp->SetSortMode(self::$conf['sortMode'],$sortBy);
            return $this;
        }
    
        /**
         * 设置区分属性
         * @param string $distinct
         */
        public function distinct($distinct)
        {
            self::$sp->SetGroupDistinct ( $distinct );
            return $this;
        }
    
        /**
         * 设置结果集偏移量(分页)
         * @param int $offset   类似于mysql 中 offset
         * @param int $limit    类似于mysql 中 limit
         * @param int $max 搜索请求中返回的最大数据量(搜索全部,返回指定数量)
         * @param int $cutoff 控制查询的数量限制(设置为多少,则搜索数据量达到了,停止搜索)
         */
        public function limit($offset=0, $limit=10, $max=0, $cutoff=0)
        {
            self::$sp->SetLimits($offset, $limit, $max, $cutoff);
            return $this;
        }
    
        /**
         * 获取查询出的ID
         * @param string $query 查询关键字||查询表达式
         * @param string $index 索引
         * @param string $comment 注释
         * @return string
         */
        public function getID($query, $index='*', $comment='')
        {
            $res=self::$sp->Query($query, $index, $comment);
    
            $new_array = array();
            if(isset($res['matches'])&&count($res['matches'])>0){
                foreach ($res['matches'] as $key => $value) {
                    $new_array[] = $value['id'];
                }
            }
            return $this->getReturn(0,$new_array,"请求成功");
        }
    
        /**
         *  返回数据封装
         */
        public function getReturn($code, $data, $msg)
        {
            return json_encode(['code'=>$code,"msg"=>$msg,'data'=>$data]);
        }
    }

      使用方式:

                $api = new TestApi($conf);
    
                /**
                 * 使用类库并获取主键id
                 * 根据自己需要,进行链式调用操作
                 */
                $result = $api->limit(0,100, 5)->getID($key,'mysql');
                if($result == "没有记录"){
                    echo $result;
                    exit(0);
                }
    
                $result_de = json_decode($result,true);
                $ids = implode(',',$result_de['data']);
    
                // 根据sphinx查出的主键id,查库检索出所有数据
                $sql = "select * from table where id in(" . $ids . ");";
                $mysql = new Mysql($conf_sql);
                $data = $mysql->findAll($sql);
    
                foreach($mysql->findAll($sql) as $v){
                    unset($v['0'],$v['1'],$v['2']);
                    $new_array[] = $v;
                }
           // 返回数据
    return json_encode($new_array);
  • 相关阅读:
    用户与组
    初识linux
    权限管理
    认识vim 编辑器
    文件归档
    路由相关术语
    Access、Hybrid和Trunk
    #error作用
    交换芯片收发包的 DMA 实现原理
    linux网络学习
  • 原文地址:https://www.cnblogs.com/wangfengzhu/p/9154690.html
Copyright © 2011-2022 走看看