我为这个问题找到了各种各样的解决办法。一个解决方案是安装一个名为mysqlcft的MYSQL插件。然而,这个解决方案将无法工作,因为我目前的微小项目的网页托管不支持MYSQL插件。有其他解决办法吗?
发布于 2015-01-15 05:33:17
通过MySQL 5.0的全文和亚洲语言的建议,试图解决这一问题。但问题是,除非您将"ft_min_word_len“设置为2,否则无法执行2个字符的搜索。同样,$1/月网络托管服务不允许您这样做。
好吧,花了一个晚上想出一个解决方案。其概念是将UTF-8字符串的所有非字母表字符转换为一些唯一的代码。
这是神奇的功能。借鉴CSDN论坛,做了一些修改。
function UTF2UCS($str, $s) {
$str = strtolower($str);
$char = 'UTF-8';
$arr = array();
$out = "";
$c = mb_strlen($str,$char);
$t = false;
for($i =0;$i<$c;$i++){
$arr[]=mb_substr($str,$i,1,$char);
}
foreach($arr as $i=>$v){
if(preg_match('/\w/i',$v,$match)){
$out .= $v;
$t = true;
}else{
if($t) $out .= " ";
if(isset($s) && $s) $out .= "+";
$out .= bin2hex(iconv("UTF-8","UCS-2",$v))." ";
$t = false;
}
}
return $out;
}的结果
echo UTF2UCS("測試haha")将是"6e2c 8a66哈哈“
假设您有一个名为"song_name“的字段。您只需通过UTF2UCS函数转换所有歌曲名称,然后将这些加密字符串保存在全文索引字段(如“song_name_ucs”)中。
下一次当你需要搜索某物时,你所需要做的就是:
$temp_string = UTF2UCS('測試', true);
SELECT * FROM song WHERE MATCH (song_name_ucs) AGAINST ('$temp_string') 当您需要在搜索结果中同时显示“測”和“試”时,请记住在UTF2UCS的第二个参数中添加一个true。
这可能不是最好的解决方案,但它不需要任何插件或系统更改。纯PHP代码。
发布于 2015-01-14 11:38:27
主要问题是指:
汉字和日文等表意语言没有定界符。因此,MySQL的全文解析器无法确定这些语言和其他此类语言中单词的开头和结尾位置。
有人建议人工引入人工分词器(请参阅:使用MySQL 5.0的全文和亚洲语言)。虽然我对亚洲语言一无所知,但我相信分词的问题并不是微不足道的:
CJK的单词分离问题并不新鲜,所以我建议您检查一下,看看是否已经有了一些库、函数等等,您可以为此目的使用/调整应用程序。
我怀疑这样的预处理只能在MySQL中有效地完成(这个常见问题似乎同意),所以您可能需要在应用程序级别处理这个过程。
https://stackoverflow.com/questions/27940695
复制相似问题