php和mysql中文搜索解决方案
MySQL中文搜索是一个难题,这问题不在搜索这块,而是在分词这块,中文不像英文一样,以英文一句话直接找空格就可以把一句划分成单词,中文的一句话就不好好办了,因问一个字前后都可以搭配,要精确的分词,可以说程序已经基本了解了这段文字的意思,全国像这样的技术也就是百度,搜狗等。普通的网站当然也不需要那么精准的搜索能力。
解决办法
1.转成拼音使用全文搜索FULLTEXT
优点:精准度高,搜索效率高
缺点:必须依赖多个第三方类库,1.分词,2.转拼音,储存过程必须纯上拼音字段
ALTER TABLE `blog` ADD FULLTEXT (`spell`); SELECT COUNT(*) AS tp_count FROM `blog` WHERE ( MATCH(`spell`) AGAINST("RuanJian SheJi JiaGou SheJi MianXiang DuiXiang SheJiMoShi LingYu QuDong SheJi") ) LIMIT 1 ;
Phpanalysis插件可以在网上下载(如:http://down.51cto.com/data/914810)本贴由FastMVC首发,谢谢关注FastMVC
保存生成拼音的代码
public $Phpanalysis; public function splitWord($str,$sub=500){ if(!preg_match('/[\x{4e00}-\x{9fa5}-]/u',$str))return ['text'=>$str,'split'=>$str,'spell'=>$str]; $this->Phpanalysis = new \app\e\Phpanalysis();//初始化类 $this->Phpanalysis->LoadDict(); $str = strip_tags($str); $str = preg_replace('/[^\w\x{4e00}-\x{9fa5}-]+|\s\w\s|[_\s]+/u',' ',$str); $str = mb_substr($str,0,$sub,'utf-8'); $this->Phpanalysis->SetSource($str); $this->Phpanalysis->StartAnalysis(); $result = $this->Phpanalysis->GetFinallyResult(); return ['text'=>$str,'split'=>$result,'spell'=>$this->Phpanalysis->getChineseSpells($result)]; }
2.利用集成程序,就以迅搜(xunsearch)为例
官方网站:http://www.xunsearch.com 下载地址:http://www.xunsearch.com/download/xunsearch-full-latest.tar.bz2 CHM手册:http://www.xunsearch.com/download/xs_php_manual.chm
优点:精准度高,搜索效率高
缺点:必须自己配置服务器,普通站的服务器不能完成要求,技术难度角高
3.MySQL like方法搜索
MySQL like方法就是,用多组的结果进行比对,然后选出最形似的内容
优点:初学者能完成
缺点:精准度差,搜索效率极低,处理1000条数据都困难
//LIKE语句的语法格式是: select * from 表名 where 字段名 like 对应值(子串)。LIKE 'Mc%'
1275