首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用中文进行Mysql全文搜索?

问如何使用中文进行Mysql全文搜索?
EN

Stack Overflow用户
提问于 2015-01-14 10:24:54
回答 2查看 4K关注 0票数 4

我为这个问题找到了各种各样的解决办法。一个解决方案是安装一个名为mysqlcft的MYSQL插件。然而,这个解决方案将无法工作,因为我目前的微小项目的网页托管不支持MYSQL插件。有其他解决办法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-15 05:33:17

通过MySQL 5.0的全文和亚洲语言的建议,试图解决这一问题。但问题是,除非您将"ft_min_word_len“设置为2,否则无法执行2个字符的搜索。同样,$1/月网络托管服务不允许您这样做。

好吧,花了一个晚上想出一个解决方案。其概念是将UTF-8字符串的所有非字母表字符转换为一些唯一的代码。

这是神奇的功能。借鉴CSDN论坛,做了一些修改。

代码语言:javascript
复制
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;
}

的结果

代码语言:javascript
复制
echo UTF2UCS("測試haha")

将是"6e2c 8a66哈哈“

假设您有一个名为"song_name“的字段。您只需通过UTF2UCS函数转换所有歌曲名称,然后将这些加密字符串保存在全文索引字段(如“song_name_ucs”)中。

下一次当你需要搜索某物时,你所需要做的就是:

代码语言:javascript
复制
$temp_string = UTF2UCS('測試', true);
SELECT * FROM song WHERE MATCH (song_name_ucs) AGAINST ('$temp_string') 

当您需要在搜索结果中同时显示“測”和“試”时,请记住在UTF2UCS的第二个参数中添加一个true。

这可能不是最好的解决方案,但它不需要任何插件或系统更改。纯PHP代码。

票数 3
EN

Stack Overflow用户

发布于 2015-01-14 11:38:27

主要问题是指:

汉字和日文等表意语言没有定界符。因此,MySQL的全文解析器无法确定这些语言和其他此类语言中单词的开头和结尾位置。

有人建议人工引入人工分词器(请参阅:使用MySQL 5.0的全文和亚洲语言)。虽然我对亚洲语言一无所知,但我相信分词的问题并不是微不足道的:

CJK的单词分离问题并不新鲜,所以我建议您检查一下,看看是否已经有了一些库、函数等等,您可以为此目的使用/调整应用程序。

我怀疑这样的预处理只能在MySQL中有效地完成(这个常见问题似乎同意),所以您可能需要在应用程序级别处理这个过程。

我建议研究一种专门的全文索引解决方案。为此目的,似乎可以配置狮身人面像或卢塞尼。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27940695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档