阿里云 OpenSearch 全文搜索

https://docs.aliyun.com/#/pub/opensearch 官方

class open_searchControl {

    protected $access_key = "xxxxxxxx";
    protected $secret = "xxxxxxxxxx";
    //杭州公网API地址:http://opensearch-cn-hangzhou.aliyuncs.com
    //北京公网API地址:http://opensearch-cn-beijing.aliyuncs.com (2015年4月初开放)
    protected $host = "http://opensearch-cn-hangzhou.aliyuncs.com";
    protected $key_type = "aliyun";  //固定值,不必修改
    protected $class_array = array(
                            '1'=>'美食',
                            '17'=>'休闲娱乐',
                            '33'=>'酒店',
                            '43'=>'丽人'
                            );
public function __construct() {
        require_once(BASE_DATA_PATH.DS.'api/opensearch/CloudsearchClient.php');
        require_once(BASE_DATA_PATH.DS.'api/opensearch/CloudsearchIndex.php');
        require_once(BASE_DATA_PATH.DS.'api/opensearch/CloudsearchSearch.php');
        require_once(BASE_DATA_PATH.DS.'api/opensearch/CloudsearchSuggest.php');
        parent::__construct();
    }


    /**
     * 阿里OpenSearch全文搜索
     * @param  [string] $keywords       [关键字]
     * @param  [string] $city_name      [城市名称]
     * @param  [float] $lnt             [纬度 必填]
     * @param  [float] $lat             [经度 必填]
     * @param  [int] $store_state       [1:默认 0,1 非必填]
     * @param  [int] $is_agree          [1:默认 0,1 非必填]
     * @param  [int] $order             [ 0:默认 0,1,2,3,4,5非必填]
     * @param  [string] $district_name  [区域名称 非必填]
     * @param  [int] $distance          [距离多少米 非必填]
     * @param  [int] $class_id          [顶级分类ID 非必填]
     * @param  [int] $class_sec_id      [二级分类ID 非必填]
     * @param  [int] $curpage           [当前页码 默认:1 非必填]
     * @param  [int] $page              [每页显示数量 默认:20 非必填]
     * @return [JSON]                   [JSON]
     * 
     */
public function indexOp() {
        $opts = array('host'=>$this->host);
        // 实例化一个client 使用自己的accesskey和Secret替换相关变量
        $client = new CloudsearchClient($this->access_key,$this->secret,$opts,$this->key_type);
        $app_name = "agg";
        // 实例化一个应用类index_obj
        $index_obj = new CloudsearchIndex($app_name,$client);
        $result = $index_obj->createByTemplateName("builtin_novel");


        // 实例化一个搜索类 search_obj
        $search_obj = new CloudsearchSearch($client);
        // 指定一个应用用于搜索
        $search_obj->addIndex($app_name);
        
        //设置返回字段
        $search_obj->addFetchFields("store_name");
        $search_obj->addFetchFields("store_id");
        $search_obj->addFetchFields("store_avatar");
        $search_obj->addFetchFields("district_name");
        $search_obj->addFetchFields("city_name");
        $search_obj->addFetchFields("gc_parent_id");
        $search_obj->addFetchFields("per_consumption");
        $search_obj->addFetchFields("bid");

        //获取过滤参数 与 搜索关键字
        $city_name = isset($_REQUEST['city_name'])?htmlspecialchars($_REQUEST['city_name']):'合肥市';//$city_id = isset($_REQUEST['city_id'])?intval($_REQUEST['city_id']):310;
        $store_state = isset($_REQUEST['store_state'])?intval($_REQUEST['store_state']):1;
        $is_agree = isset($_REQUEST['is_agree'])?intval($_REQUEST['is_agree']):1;
        $lng = isset($_REQUEST['lng'])?$_REQUEST['lng']:'117.31992';
        $lat = isset($_REQUEST['lat'])?$_REQUEST['lat']:'31.85168';
        $order = isset($_REQUEST['order'])?intval($_REQUEST['order']):0;//$area_id = isset($_REQUEST['area_id'])?intval($_REQUEST['area_id']):0;
        $district_name = isset($_REQUEST['district_name'])?htmlspecialchars($_REQUEST['district_name']):'';
        $distance = isset($_REQUEST['distance'])?$_REQUEST['distance']:0;
        $class_id = isset($_REQUEST['class_id'])?intval($_REQUEST['class_id']):0;
        $sec_class_id = isset($_REQUEST['sec_class_id'])?intval($_REQUEST['sec_class_id']):0;
        $keywords = isset($_REQUEST['keywords'])?$_REQUEST['keywords']:'';
                
        $keywords = $keywords.' '.$city_name.' '.$district_name; 
        $search_obj->setQueryString("default:'".$keywords."'");


        //设置搜索过滤
        $search_obj->addFilter('store_state='.$store_state);
        $search_obj->addFilter('is_agree='.$is_agree);
        $class_id && $search_obj->addFilter('gc_parent_id='.$class_id);
        $sec_class_id &&  $search_obj->addFilter('class_2='.$sec_class_id);

        //过滤距离
        $distance && $search_obj->addFilter('distance(lng,lat,"'.$lng.'", "'.$lat.'")>'.($distance/1000));
        //$search_obj->setPair("longtitude_in_query:".$lng.", latitude_in_query:".$lat."");
        //对搜索结果进行去重
        //dist_key:store_id,dist_count:1,dist_times:1,reserved:false&&kvpairs=duniqfield:store_id
        $search_obj->addDistinct('store_id','1','1','false');
        $search_obj->setPair('duniqfield:store_id');
        //$search_obj->addAggregate('store_id','count(store_id)',0,0,'count(store_id)');
        switch ($order) {
          case '1':
            //按创建时间倒序获取搜索结果
            $search_obj->addSort('distance(lng,lat,"'.$lng.'","'.$lat.'")','+'); //按照距离排序,没有这个不返回距离
            break;
          case '2':
            $search_obj->addSort('store_time','-');
            $search_obj->addSort('distance(lng,lat,"'.$lng.'","'.$lat.'")','+');
            break;
          case '3':
            $search_obj->addSort('distance(lng,lat,"'.$lng.'","'.$lat.'")','+');
            break;
          case '4':
            $search_obj->addSort('per_consumption','-');
            $search_obj->addSort('distance(lng,lat,"'.$lng.'","'.$lat.'")','+');
            break;
          case '5':
            $search_obj->addSort('per_consumption','+');
            $search_obj->addSort('distance(lng,lat,"'.$lng.'","'.$lat.'")','+');
            break;
          default:
            $search_obj->addSort('distance(lng,lat,"'.$lng.'","'.$lat.'")','+');
            break;
        }
          
        $curpage = (!empty($_REQUEST['curpage'])?$_REQUEST['curpage']:1); //当前第几页
        $hit = (!empty($_REQUEST['page'])?$_REQUEST['page']:20); //第页显示条数
        //设置结果偏移量
        $search_obj->setStartHit(($curpage-1)*$hit);


        //每页获取20条记录
        $search_obj->setHits($hit);
        // 指定返回的搜索结果的格式为json,fulljson,xml
        $search_obj->setFormat("fulljson");


        // 执行搜索,获取搜索结果
        $json = $search_obj->search();
        // 将json类型字符串解码
        $result = json_decode($json,true);
        $rt = array();
        $rt['status'] = $result['status'];
        $rt['request_id'] = $result['request_id'];
        $rt['result']['num'] = $result['result']['viewtotal'];
        $rt['result']['pagetotal'] = ceil($result['result']['viewtotal']/$hit);
        //$rt['result']['items'] = $result['result']['items'];
        foreach ($result['result']['items'] as $key => $value) {
            $rt['result']['items'][$key]['fields']['city_name'] =  $value['fields']['city_name'];
            $rt['result']['items'][$key]['fields']['goods_class'] =  $this->class_array[$value['fields']['gc_parent_id']];
            $rt['result']['items'][$key]['fields']['store_id'] = $value['fields']['store_id'];
            $rt['result']['items'][$key]['fields']['bid'] = $value['fields']['bid'];
            $rt['result']['items'][$key]['fields']['store_name'] = $value['fields']['store_name'];
            $rt['result']['items'][$key]['fields']['store_avatar'] = $value['fields']['store_avatar'];
            $rt['result']['items'][$key]['fields']['district_name'] = $value['fields']['district_name'];
            $rt['result']['items'][$key]['fields']['per_consumption'] = $value['fields']['per_consumption'];
            $rt['result']['items'][$key]['fields']['variableValue'] = $value['variableValue']['extinfo'][0];
        }
        if(count($rt['result']['items']) === 0)
        {
            $rt['status'] = 'ERROR';
            $rt['msg'] = '暂无数据';
        }
        echo json_encode($rt);
}

结果如下:

阿里云 OpenSearch 全文搜索



你可能感兴趣的:(全文搜索,阿里云,OpenSearch)