微信小程序api后台搜索的代码
微信小程序搜索功能实现步骤
- 先建好一个搜索词权重表,里面含有id、搜索词、权重(用数字来写)
- 微信小程序前台有传入搜索词到后台api,比如现在的sousuoa()
- 引入搜索词库,然后进行分词
- 获取分词后判断分词是否存在搜索词权重表里面不,如果存在然后处理那个分词权重大哪个就排在前面,最后执行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();
}