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

时间:2015-01-14 10:24:54

标签: mysql search full-text-search

我找到了解决这个问题的各种解决方案。一种解决方案是安装一个名为mysqlcft的MYSQL插件。但是,这个解决方案不起作用,因为我当前的小项目的Web托管不支持MYSQL插件。任何替代解决方案?

2 个答案:

答案 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)

The main problem就是:

  

中文和日文等表意语言没有单词分隔符。因此,[MySQL的] FULLTEXT解析器无法确定单词在这些语言和其他语言中的开头和结尾位置。

建议使用变通方法手动引入人工单词分隔符(参见:FULLTEXT and Asian Languages with MySQL 5.0)。虽然我对亚洲语言一无所知,但我认为分离单词的问题并非无足轻重:

  

CJK的单词分离问题并不是什么新鲜事,所以我建议你检查一下你是否已经有一些库,函数等可以用于你的应用程序。

我怀疑这样的预处理只能在MySQL中高效完成(this FAQ似乎同意),所以你可能需要在应用程序级别处理这个过程。

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