首頁 >php教程 >php手册 >分享mysql中文全文搜索:中文分词简单函数

分享mysql中文全文搜索:中文分词简单函数

WBOY
WBOY原創
2016-06-07 11:40:341175瀏覽

分享mysql中文全文搜索:中文分词简单函数
原文地址:http://www.jb100.net/html/content-22-400-1.html
前段时间研究中文全文搜索,结果发现mysql不支持中文的全文搜索。但是有一些解决办法,就是手动把中文单词用空格分开,然后搜索的时候加 上 in boolean mode。 但是这就带来一个问题,就是中文分词。这个是个很大的难题,貌似中科院有个小组就是专门做中文分词技术的。我们用 php来分词的话,要实现真正语义上的分词是非常困难的,就算实现了效率也不高。一般情况下,我们采用的是如下方法分词:

比如我们有一句话:你好我是刘春龙
那么我们可以这样来分词: 你好 好我 我是 是刘 刘春 春龙


这样虽然看起来有点傻,但是实际应用起来确实可行,因为我们搜索时候输入的关键词也是按照这个方法分词。

下面有个我自己写的函数,可以实现这种分词。传入三个参数,分别是:

1.需要分词的字符串,必须,英文,标点,数字,汉字,日语等都可以。编码为UTF-8
2.是否返回字符串,可选,默认是。如果传入false,那么将返回一个数组。
3.是否base64_encode中文,可选,默认是。Mysql的全文搜索有个配置是 ft_min_word_len 这个值一般是4,而 我们分成的中文词语是两个字,就不会被mysql认为是一个词。而base64_encode过后,词语的长度为8,就不存在最小长度问题 了。 base64_encode过后数据量会增大 50%。


注意,这里输入和输出的字符串编码都是UTF-8 function string2words($s,$return_string = true,$encode64 = true) <br> { <br>         $re = ''; <br>         //匹配汉字 <br>         if (preg_match_all("/([x{4e00}-x{9fff}]{2,})/u",$s,$ms)) <br>         { <br>                 foreach($ms[0] as $w) <br>                 { <br>                         //关键部分:分词 <br>                         $l = strlen($w)/3; <br>                         for($i=0;$i                         { <br>                                 $wi = substr($w,$i*3,6); <br>                                 if (strlen($wi) > 3) <br>                                 { <br>                                         $re .= ($encode64)?' '.str_replace(',','@',base64_encode($wi)):' '.$wi; <br>                                 } <br>                         } <br>                 } <br>         } <br>         //匹配数字 <br>         if (preg_match_all("/(d+[.]?d+)/",$s,$ms)) <br>         { <br>                 foreach($ms[0] as $wi) <br>                 { <br>                         if(strlen($wi) >= 2) <br>                         { <br>                                 $re .= ($encode64)?' '.str_replace(',','@',base64_encode($wi)):' '.$wi; <br>                         } <br>                 } <br>                 $s = preg_replace("/(d+[.]?d+)/",' ',$s); <br>         } <br>         //去掉所有双字节字符 <br>         $s = preg_replace("/([^x{00}-x{ff}]+)/u",' ',$s); <br>         $re = $s.' '.$re; <br>         if (!$return_string) <br>         { <br>                 $re = preg_replace("/([^d])([,.-?n])([^d])/",'$1 $3',$re); <br>                 $re = trim(preg_replace("/[s]{2,}/",' ',$re)); <br>                 $arr = explode(' ',$re); <br>                 $re = array(); <br>                 foreach($arr as $a) <br>                 { <br>                         if (strlen($a) >= 2) $re[] = $a; <br>                 } <br>                 return $re; <br>         } <br>         else <br>         { <br>                 $re = trim(preg_replace("/[s,.]{2,}/",' ',$re)); <br>                 return $re; <br>         } <br> } 原文地址:http://www.jb100.net/html/content-22-400-1.html

AD:真正免费,域名+虚机+企业邮箱=0元

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn