当前位置: 首页 > 工具软件 > mysqlcft > 使用案例 >

MySQL 中文索引插件mysqlcft

杜禄
2023-12-01

  MySQL全文索引在高并发、数据库记录数较多的情况下,select.where.like '%_%'的全文搜索方式不仅效率差,而且以通配符%和_开头做查询时,使用不到索引,需要权标扫描,对数据库的压力也很大。MySQL针对这一问题提供了一种全文索引FULLTEXT解决方案,这不仅仅提高了性能和效率(因为MySQL对 这些字段做了索引来优化搜索),而且实现了更高质量的搜索。但是,迄今为止,MySQL对中文全文索引无法正确支持。

  中文与西方文字如英文的一个重要区别在于,西方文字以单词为单位,单词与单词之间用空格分隔。而中文以字为单位,词由一个或多个字组成,词与词之间没有空格分隔。当试图在一个含有中文字符的字段中使用全文搜索时,不会得到正确的结果,原因在于中文中没有像空格那样对词定界,不能以空格进行分隔,对中文词语进行索引。

一、Mysql中文全文索引插件mysqlcft的特点:

1.优点:

①精确度很高;采用自创的“三字节交叉切分算法”,对中文语句进行分割,无中文分词词库,搜索精准度远比中文分词算法高,能达到LIKE '%.%'的准确率。

②查询速度快:查询速度比LIKE '%.%'搜索快3~50倍

③标准插件式:以MySQL5.1全文索引的标准插件形式开发,不修改MySQL源代码,不影响MySQL其他功能,可快速跟进MySQL新版本

④支持版本多:支持所有的MySQL 5.1 Release Canidate版本,即MySQL 5.1.22 RC 最新的MySQL 5.1.25 RC

⑤支持字符集:支持包括GBK、GB2312、UTF-8、Latinl、BIG5在内的MySQL字符集

⑥系统兼容好:具有i386和x86_64两个版本,支持32位(i386)和64位(x86_64)及Linux系统

⑦适合分布式:非常适合MySQL Slave分布式系统架构,无词库维护成本,不存在词库同步问题。

2.缺点:

①mysqlcft中文全文索引只适用于MyISAM引擎表,因为MySQL只支持对MyISAM表建立FULLTEXT索引

②MySQL不能静态编译安装,否则无法安装mysqlcft插件

③基于“三字节交叉切分算法”的索引文件会比海量、ft-hightman等基于“中文分词算法”的所有文件稍大,但不是很多

二、使用

1.MySQL必须是动态编译安装,以便加载动态链接库

2.Linux系统下编辑MySQL配置文件my.cnf(Windows编辑my.ini)

配置文件中添加:

[mysqld]

ft_min_word_len=1 

附:MySQL配置文件在全文索引应用中的优化

#key_buffer指定用于索引的缓冲区大小,在全文索引中,增加它可得到更好的索引处理与查询性能

key_buffer=512M

#sort_buffer_size为查询排序时说能使用的缓冲区大小,全文索引的SQL语句之后通常会使用ORDER BY排序,增加它可以加快SQL语句执行时间。该参数对应的分配内存是每连接独占,100个连接使用的内存将是32M*100=3200M

sort_buffer_size=32M

#对大于可用内存的表执行GROUP BY 或ORDER BY操作,应增加read_rnd_buffer_size的值以加速排序操作后面的行读取

rend_rnd_buffer_size=64M

#如果表出现故障或索引出错,REPAIR TABLE时用到的缓冲区大小

myisam_sort_buffer_size=128M

#确定使用的filesort算法的索引值大小的限制

max_length_for_sort_data=64

#MySQL全文索引查询所用关键字最小长度限制(不要改变这项值)

ft_min_word_len=1

#降低UPDATE优先级,设置查询优先

low_priority_updates=1

3.安装mysqlcft中文全文索引插件

    查看插件目录    show variables like 'plugin_dir';

    下载mysqlcft插件,解压复制到插件目录下

    安装mysqlcft插件    install plugin mysqlcft soname 'mysqlcft.so';

    查看所有的插件    show plugins;如果有找到mysqlcft则表示安装成功

4.给表添加中文全文索引

alert table 表名 add fulltext 索引名(列名) with parser mysqlcft;

5.全文索引的查找

select * from 表名 where match(字段) against('查找的值' in boolean mode);


 类似资料: