如何用汉字进行Mysql全文检索?

How to perform Mysql fulltext search with Chinese characters?

我已经找到了解决这个问题的各种方法。一种解决方案是安装一个名为 mysqlcft 的 MYSQL 插件。但是,由于我当前的小项目的虚拟主机不支持 MYSQL 插件,因此此解决方案将不起作用。任何替代解决方案?

The main problem 是:

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 似乎同意),所以你可能需要在应用程序级别处理这个过程。

我建议研究专用的全文索引解决方案。似乎可以为此目的配置 Sphinx or Lucene

尝试按照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 代码。