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