模糊查询搜索功能在有错字的情况下也能搜出结果

9 篇文章 0 订阅

第一次听老板说这种需求,第一感觉就是离谱,没办法,硬着头皮上
基本思路是将文字拆分成单独的一个个文字,然后使用数学上的排列组合,将可能得结果都组合出来,再循化模糊查询,将最全字匹配的放最上面,单字的放最下面。

function keywords_zh($array,$level = -1,&$list =[]){
    for ($i=0; $i < count($array); $i++) { 
        if($level < 0){
             //第一级直接输出对应数字
             $list[] = $array[$i];
        }else{
            $values  = $array[$i];
            //根据等级组装前几位
            $values=[];
            for ($k=0; $k < $level ; $k++) { 
                $values[]   =  $array[$i+$k+1];
            }
            $j= 0;
                //循环拼合最后一位
            for ($n=($i+$level+1); $n < count($array); $n++) { 
                $j++;
                $first[]  =  $values; // 组合上几位
                $first[]=  $array[$n];
                $list[] = $first;

            }
            //到最后一位结束递归
            if($j == 1){
                break;
            } 
        } 
    }
     //长度大于等级+2停止递归
     if(($level+2)  < count($array)){
         keywords_zh($array,$level+1,$list);
     }	
     return $list;
}
$keyword_arr = str_caifen($keyword);
$new_arr_get = keywords_zh($keyword_arr);
   // var_dump($new_arr_get);
   // exit;
   foreach ($new_arr_get as $k => $item){
       $res1[] = db('new_property')
           ->field('id,name')
           ->where("trim(replace(name,'·','')) like trim(replace('%".$item."%',' ','')) AND xiansuo =0")
           ->select();
       
   }
   //降维
   $result1 = array_reduce($res1, 'array_merge', array());
   //去重
   $data[$key] = ArrayUnique($result1);

//拆分
function str_caifen($str){
    if(!$str){
        return false;
    }
    return preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值