如何用汉字进行Mysql全文检索?
How to perform Mysql fulltext search with Chinese characters?
我已经找到了解决这个问题的各种方法。一种解决方案是安装一个名为 mysqlcft 的 MYSQL 插件。但是,由于我当前的小项目的虚拟主机不支持 MYSQL 插件,因此此解决方案将不起作用。任何替代解决方案?
Ideographic languages such as Chinese and Japanese do not have word delimiters. Therefore, [MySQL's] FULLTEXT parser cannot determine where words begin and end in these and other such languages.
已建议使用变通方法手动引入人工单词分隔符(请参阅:FULLTEXT and Asian Languages with MySQL 5.0)。虽然我对亚洲语言一无所知,但我相信分离单词的问题并非微不足道:
The problem of word separation for CJK is nothing new, so I'd advise you check to see if there is already some library, function, etc. that you can use/adapt for your application for this purpose.
我怀疑这样的预处理只能在 MySQL 中有效地完成(this FAQ 似乎同意),所以你可能需要在应用程序级别处理这个过程。
尝试按照RandomSeed的建议解决问题"FULLTEXT and Asian Languages with MySQL 5.0"。但问题是您不能执行 2 个字符的搜索,除非您将 "ft_min_word_len" 设置为 2。同样,每月 1 美元的网络托管服务不允许您这样做。
好吧,花了 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 代码。
我已经找到了解决这个问题的各种方法。一种解决方案是安装一个名为 mysqlcft 的 MYSQL 插件。但是,由于我当前的小项目的虚拟主机不支持 MYSQL 插件,因此此解决方案将不起作用。任何替代解决方案?
Ideographic languages such as Chinese and Japanese do not have word delimiters. Therefore, [MySQL's] FULLTEXT parser cannot determine where words begin and end in these and other such languages.
已建议使用变通方法手动引入人工单词分隔符(请参阅:FULLTEXT and Asian Languages with MySQL 5.0)。虽然我对亚洲语言一无所知,但我相信分离单词的问题并非微不足道:
The problem of word separation for CJK is nothing new, so I'd advise you check to see if there is already some library, function, etc. that you can use/adapt for your application for this purpose.
我怀疑这样的预处理只能在 MySQL 中有效地完成(this FAQ 似乎同意),所以你可能需要在应用程序级别处理这个过程。
尝试按照RandomSeed的建议解决问题"FULLTEXT and Asian Languages with MySQL 5.0"。但问题是您不能执行 2 个字符的搜索,除非您将 "ft_min_word_len" 设置为 2。同样,每月 1 美元的网络托管服务不允许您这样做。
好吧,花了 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 代码。