微信小程序搜索功能利用搜索词库来实现

微信小程序api后台搜索的代码

微信小程序搜索功能实现步骤

  1. 先建好一个搜索词权重表,里面含有id、搜索词、权重(用数字来写)
  2. 微信小程序前台有传入搜索词到后台api,比如现在的sousuoa()
  3. 引入搜索词库,然后进行分词
  4. 获取分词后判断分词是否存在搜索词权重表里面不,如果存在然后处理那个分词权重大哪个就排在前面,最后执行sql语句,sql语句要有根据分词来排序,怎样排序根据个人功能来实现
       //搜索功能实现
      public function sousuoa(){

      	$post=input();

  		$uid=$_POST['uid']; //用户的id
  		  $urls=$_SERVER['HTTP_HOST'];//当前的域名
  		    $list=$_POST['list'];
  		     $pages=$_POST['pages'];//当前第几页

  		     if($pages==0)
  		     {
  		     	 $pages_index=$pages;
  		     }
  		     else{
  		     	$pages_index=$pages*12;//一个页查的总数
  		     }
		$goods_discount=1;

		//默认第一张图,根据用户身份来显示第几张图片作为商品主图
		 $number_pic=0;
      
        if($uid){
			$member=Db::name('ns_member')->where('uid',$uid)->select();
		    if($member[0]['stauts']==2){//判断用户是否认证
		    	$member2=Db::name('ns_member_level')->where('level_id',$member[0]['member_level'])->select();
		    	$number_pic=$member2[0]['zhutu'];//根据用户的身份来获取不同身份图片id集
		    	$goods_discount=$member2[0]['goods_discount'];//根据用户的身份来获取打几折
		    } 
		}
		  $data=trim($post['inputValue']);//过滤传过来的搜索词
		include 'data/extend/PHPanalysis/phpanalysis.php';//引入搜索词库
		
 
        $str = trim($data);
		$do_fork = true;
	    $do_unit = true;//新词识别
	    $do_multi = true;//多元切分
	    $do_prop = false;//词性标注
	    $pri_dict = false;//是否预载全部词条
	    $pa = new \PhpAnalysis('utf-8', 'utf-8', $pri_dict);
	    //载入词典
	    $pa->LoadDict();  
	    //执行分词
	    $pa->SetSource($str);
	    $pa->differMax = $do_multi;
	    $pa->unitWord = $do_unit;
	    $pa->StartAnalysis( $do_fork );
	    $str = $pa->GetFinallyResult(' ', $do_prop);
	    $str = explode(' ',$str);
	      $args = array();
	    foreach ($str as $key =>$v){
	    	if(trim($v)=='' || trim($v)==')' || trim($v)=='(')continue;
	    	$args[] = $v;
	    }

	    //搜索词权重
	    $search=[];

	    $search_content=Db::name("nc_search")->select();//获取所有搜索词和权重
	    foreach ($search_content as $k=>$v)
	    {
	    	$search[]=$v['keywords'].'-'.$v['number'];//把搜索词和权重组在一起

	    }
	    $search_content=[];
	    //遍历用户输入的搜索词由词库分词的数组,如何判断分词的词是否在建好搜索词权重表里面
		foreach ($args as $key => $value) {

			foreach($search as $k=>$v ){

			    if (strstr($v , $value ) !== false ){//判断分词的词是否在建好搜索词权重表里面
			      $number = substr($v,strripos($v,"-")+1);//截取"-"后面的内容,就是权重,用来排序作用
			      $search_content[$value]=$number;//把权重做值,搜索词做键名,避免重复
			    }
			    
			}

			
		}

		   arsort($search_content);//数组根据值来降序排序
		
		   $search_arr=[];

		   foreach ($search_content as $k1=>$v1){
		   	 $search_arr[]=$k1;//重新组成一维数组
		   }

		
            $end = "";
		foreach ($search_arr as $key=>$value)
		{
            $end = $key +1;
			if($key == 0){
				$where = "where goods_name like '%$value%'";//模糊搜索条件
			    $sql = "select * from ns_goods  %s% order by (case when goods_name = '%$value%' then $end ";//模糊排序
			}else{
				$where .= " or goods_name like '%$value%'";//模糊搜索条件
				$sql .= " when goods_name like '%$value%' then $end";
			}
			
			
		}
		

    
		$sql = $sql." end ) LIMIT $pages_index,12";//搜索sql的语句
	$rsql = str_replace("%s%", $where, $sql);//模糊搜索条件组合替换 %s%
		
	$result = Db ::query($rsql);//执行sql的语句
	//根据用户不同身份显示不同商品主图
	foreach($result as $kk=>$vv){

			 $pic_arr=$vv['img_id_array'];//获取商品所有图片集
			 $pic_arr_list=explode(',',$pic_arr);//转换成数组
			 $number=count($pic_arr_list);//获取图片数组总数
			 if($number==1){
		        $goods_pic_id=$pic_arr_list[0];//如果只有一个就获取第一个
		       }else{
                if($number_pic==0){
                  	$goods_pic_id=$pic_arr_list[0];
                  }else{
                           if($number_pic<$number){
                              $number=$number_pic-1;
                              $goods_pic_id=$pic_arr_list[$number];
                           }else{
                              $goods_pic_id=$pic_arr_list[0];
                           }
                      }
		      }
			 $goodspic=Db::name('sys_album_picture')->where('pic_id',$goods_pic_id)->select();//根据用户不同身份显示不同商品主图
			 $goods_thumb=$goodspic[0]['pic_cover'];
			 $result[$kk]['pic']="https://$urls/".$goods_thumb;
			 $result[$kk]['goods_name']=mb_substr($vv['goods_name'],0,13,'utf-8');
			  $result[$kk]['price']= floor($vv['price']*$goods_discount);//打折后的价格取整
		
		}


		  echo json_encode($result);//返回json格式给微信小程序前端
		  exit(); 	
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值