我找到了解决这个问题的各种解决方案。一种解决方案是安装一个名为mysqlcft的MYSQL插件。但是,这个解决方案不起作用,因为我当前的小项目的Web托管不支持MYSQL插件。任何替代解决方案?
答案 0 :(得分:2)
试图通过RandomSeed的建议“FULLTEXT和亚洲语言与MySQL 5.0”解决问题。但问题是你不能执行2个字符的搜索,除非你将“ft_min_word_len”设置为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代码。
答案 1 :(得分:1)
中文和日文等表意语言没有单词分隔符。因此,[MySQL的] FULLTEXT解析器无法确定单词在这些语言和其他语言中的开头和结尾位置。
建议使用变通方法手动引入人工单词分隔符(参见:FULLTEXT and Asian Languages with MySQL 5.0)。虽然我对亚洲语言一无所知,但我认为分离单词的问题并非无足轻重:
CJK的单词分离问题并不是什么新鲜事,所以我建议你检查一下你是否已经有一些库,函数等可以用于你的应用程序。
我怀疑这样的预处理只能在MySQL中高效完成(this FAQ似乎同意),所以你可能需要在应用程序级别处理这个过程。