说明
在MySQL5.1中可以为全文索引编写插件。插件的作用是代替MySQL内部的分词模块。 我们知道MySQL自带的分词只是通过空格和控制符将词分开,对于英语来说,可以通过这种方式分词,但中文是没有空格的,所以MySQL本身的全文索引不支持中文。 我们可以通过全文索引分词插件的方式让MySQL可以对中文分词,从而使得MySQL的全文索引支持中文。
设置了MySQL的插件之后,当我们插入或者更新在全文索引中的字段时,MySQL使用插件对字段进行分词。当对这个索引进行检索时,也需要使用插件对检索的关键字进行分词。
安装
需要从C或C++编写插件,编译为so文件。编译时需要定义MYSQL_DYNAMIC_PLUGIN。某些平台下的gcc可能还要加上-D_GNU_SOURCE,否则会报错。
gcc -fPIC -DMYSQL_DYNAMIC_PLUGIN -Wall -shared -I /usr/local/mysql-5.1.25/include/ \
-I /usr/local/mysql-5.1.25-rc/include/ \
-I /usr/local/mysql-5.1.25-rc/ \
-o libthunder_ft.so thunder_ft.c
然后放在plugin_dir启动选项定义的目录下,默认是MySQL安装目录下的lib/plugin目录。然后使用
INSTALL PLUGIN plugin_name SONAME 'plugin_library'
安装插件。
删除可以使用
UNINSTALL PLUGIN plugin_name
如果删除了一个全文索引插件,那么使用了这个插件的表将不可用,不能对该表做任何操作。
代码
每一个插件都要提供一个st_mysql_plugin结构
struct st_mysql_plugin
{
int type; /* the plugin type (a MYSQL_XXX_PLUGIN value) */
void *info; /* pointer to type-specific plugin descriptor */
const char *name; /* plugin name */
const char *author; /* plugin author (for SHOW PLUGINS) */
const char *descr; /* general descriptive text (for SHOW PLUGINS ) */
int license; /* the plugin license (PLUGIN_LICENSE_XXX) */
int (*init)(void *); /* the function to invoke when plugin is loaded */
int (*deinit)(void *);/* the function to invoke when plugin is unloaded */
unsigned int version; /* plugin version (for SHOW PLUGINS) */
struct st_mysql_show_var *status_vars;
void * __reserved1; /* placeholder for system variables */
void * __reserved2; /* placeholder for config options */
};
用plugin.h中的宏mysql_declare_plugin定义,如:
mysql_declare_plugin(thunder_ft)
{
MYSQL_FTPARSER_PLUGIN, /* type */
&thunder_ft_descriptor, /* descriptor */
"thunder_ft", /* name */
"Jedy", /* author */
"A fulltext plugin", /* description */
PLUGIN_LICENSE_GPL,
thunder_ft_plugin_init, /* init function (when loaded) */
thunder_ft_plugin_deinit, /* deinit function (when unloaded) */
0x0001, /* version */
thunder_status, /* status variables */
NULL, /* system variables */
NULL
}
mysql_declare_plugin_end;
init和deinit两个函数用于插件的初始化和卸载,在install,uninstall或者server启动停止时执行一次,我们可以用这两个函数分配和收回一些资源。
status_vars是一个st_mysql_show_var结构,定义如下:
struct st_mysql_show_var {
const char *name;
char *value;
enum enum_mysql_show_type type;
};
其中value是一个char指针,MySQL会按照enum_mysql_show_type的类型将这个指针转为符合类型的指针。 的元素为
SHOW_BOOL | Pointer to a boolean variable |
SHOW_INT | Pointer to an integer variable |
SHOW_LONG | Pointer to a long integer variable |
SHOW_LONGLONG | Pointer to a longlong integer variable |
SHOW_CHAR | A string |
SHOW_CHAR_PTR | Pointer to a string |
SHOW_ARRAY | Pointer to another st_mysql_show_var array |
SHOW_FUNC | Pointer to a function |
SHOW_UNDEF | undefined |
status_vars指向一个结构数组,数组最后一行为{0,0,0}(有些编译器中要写为{0,0,SHOW_UNDEF},否则会报错)代表数组结束。之前的每一行为一个状态值。
我们还需要申明一个st_mysql_ftparser结构:
struct st_mysql_ftparser
{
int interface_version;
int (*parse)(MYSQL_FTPARSER_PARAM *param);
int (*init)(MYSQL_FTPARSER_PARAM *param);
int (*deinit)(MYSQL_FTPARSER_PARAM *param);
};
init是初始化函数,在每个使用到parser的语句之前调用,deinit在parser函数之后调用。 比如一次insert多行,init调用一次,然后调用多次parser进行分词,每一行都处理完成之后调用deinit。 例如:
static struct st_mysql_ftparser thunder_ft_descriptor={
MYSQL_FTPARSER_INTERFACE_VERSION, /* interface version */
thunder_ft_parse, /* parsing function */
thunder_ft_init, /* parser init function */
thunder_ft_deinit /* parser deinit function */
};
传给这三个函数的参数MYSQL_FTPARSER_PARAM定义如下:
typedef struct st_mysql_ftparser_param
{
int (*mysql_parse)(struct st_mysql_ftparser_param *,
char *doc, int doc_len);
int (*mysql_add_word)(struct st_mysql_ftparser_param *,
char *word, int word_len,
MYSQL_FTPARSER_BOOLEAN_INFO *boolean_info);
void *ftparser_state;
void *mysql_ftparam;
struct charset_info_st *cs;
char *doc;
int length;
int flags;
enum enum_ftparser_mode mode;
} MYSQL_FTPARSER_PARAM;
其中mysql_parse是MySQL内部parser的回调函数。mysql_add_word是分词后将词传给MySQL的函数。 ftparser_state用于给编写者保存一定的状态信息,可以是任何的指针。 cs是字符集的指针,可以由之得到传入文本的字符信息。doc是需要parser的文本指针,length是其长度。这里的doc不是以\0结尾的字符 串,所以一定要通过length处理。flags目前只有MYSQL_FTFLAGS_NEED_COPY这样一个非零值,告诉MySQL mysql_add_word添加的词需要进行拷贝,比如算法是每次parser把doc拷贝到一个buffer中处理,而返回这个buffer中词的指 针时需要设置MYSQL_FTFLAGS_NEED_COPY,因为buffer的值在处理过程中会变化的。mode用于区别是普通分词还是 boolean的分词。
MYSQL_FTPARSER_FULL_BOOLEAN_INFO的分词只是用于解析boolean检索时的条件,建索引时始终使用的是MYSQL_FTPARSER_SIMPLE_MODE。
MySQL函数
实现分词可以使用完全独立的函数也可以使用一些MySQL的函数。MySQL中提供了btree的实现,可以直接使用。另外MySQL分配和释放内 存也是使用了自己定义的函数my_malloc和my_free,它们的第二个参数说明了出错的处理,一般设为MYF(MY_WME)即可。
使用get_charset_by_csname可以返回一个charset_info_st结构的指针,三个参数分别为字符集名字的字串,类型和错误处理的flag。
param->cs->cset->ctype(param->cs, &ctype, (uchar*) doc, (uchar*) end)返回对应param->cs字符集的一个字符的长度,ctype的值反映了一些这个字符种类的信息,比如字母,空格或控制符等。在utf8 字符集中汉字既是大写字母又是小写字母。
分享到:
相关推荐
一、MySQL中文全文索引插件mysqlcft的特点: 1、优点: ①、精准度很高:采用自创的“三字节交叉切分算法”,对中文语句进行分割,无中文分词词库,搜索精准度远比中文分词算法高,能达到LIKE '%...%"的准确率。...
一、MySQL中文全文索引插件mysqlcft的特点: 1、优点: ①、精准度很高:采用自创的“三字节交叉切分算法”,对中文语句进行分割,无中文分词词库,搜索精准度远比中文分词算法高,能达到LIKE '%...%"的准确率。...
安装SphinxSE后,我们可以在MySQL中像操作普通表一样使用Sphinx的全文索引,这极大地方便了数据库查询和管理。 在搭建Sphinx的过程中,我们需要做以下步骤: 1. **安装Sphinx**: 根据操作系统下载并安装Sphinx软件...
- **索引增强**:支持全文索引和空间索引,以及对JSON字段的索引,提高了复杂查询的性能。 - **并行查询**:引入并行查询执行,尤其在涉及大量数据的JOIN操作中,显著提高性能。 3. **安全增强**: - **加密连接...
2. **Full-text 搜索改进**:MySQL 5.5 对全文索引和搜索进行了优化,支持了短语搜索和对部分词汇的忽略,使得文本检索更为智能和灵活。 3. **分区功能加强**:MySQL 5.5 扩展了分区功能,支持更多的分区类型,如...
这个"mysql-installer-community-5.7.20.0"是一个社区版的安装程序,它包含了MySQL 5.7.20以及相关的插件和工具。 MySQL 5.7的主要改进和特点包括: 1. **性能优化**:5.7版本引入了InnoDB存储引擎的性能提升,如...
全文索引的建立和使用是MySQL在处理中文数据时提升性能的重要手段。通过合理设置分词大小、创建全文索引,结合MATCH AGAINST查询语法,可以有效地实现对百万级中文数据的高效检索,从而满足用户对数据查询速度的需求...
7.10.3MySQL5.1中全文索引的变化303 7.10.4全文索引的限制和替代方案304 7.10.5全文索引的配置和优化306 7.11分布式(XA)事务307 7.11.1内部XA事务307 7.11.2外部XA事务308 7.12查询缓存309 7.12.1MySQL如何...
与MySQL结合使用,Elasticsearch可以实现高效、复杂的全文搜索。MySQL是流行的关系型数据库管理系统,它存储结构化数据,而Elasticsearch则擅长处理非结构化的搜索需求。 在配置Elasticsearch进行全文搜索前,确保...
2. myisam_ftdump - 显示全文索引信息。 3. myisamchk - MyISAM 表维护实用工具。 4. myisamlog - 显示 MyISAM 日志文件内容。 5. myisampack - 产生压缩,只读 MyISAM 表。 6. mysql_config_editor - MySQL 的配置...
唯一索引确保列中的值不重复,而全文索引则用于支持文本搜索。 数据库的事务管理是保证数据一致性的重要手段。MySQL的InnoDB引擎支持ACID(原子性、一致性、隔离性和持久性)特性。事务的隔离级别有四种:读未提交...
2. **InnoDB性能提升**:5.7版对InnoDB进行了大量优化,包括更快的索引插入、更高效的缓冲池管理以及更快速的全文搜索。此外,InnoDB还引入了新的内存管理机制,减少了内存碎片。 3. **Performance Schema**:MySQL...
4. **Full-text Search增强**:此版本改进了全文搜索功能,支持部分索引和短语搜索,提高了搜索效率。 5. **分区功能**:MySQL 5.5加强了分区功能,允许用户对大型表进行更有效的管理,通过分区策略来提高查询速度...
2. **InnoDB全文搜索**:5.6版本首次引入了内置的全文索引功能,允许用户在InnoDB表中进行快速的全文搜索,无需依赖外部搜索引擎。 3. **可重复读事务隔离级别改进**:在可重复读隔离级别下,5.6版本引入了“Next-...
在MySQL中,可以为表的列创建索引,如唯一索引、主键索引和全文索引等。`ALTER TABLE`命令可以用来添加、删除和更改索引。 最后,备份和恢复数据库是日常运维的重要环节。MySQL提供了多种备份工具,如`mysqldump`,...
引入了lombok插件,简化了实体类的编写 使用HandlerInterceptor进行了操作权限控制 数据库表使用自增唯一ID 封装了mybatis-plus-generator代码生成器,使用菜单操作即可生成前后端代码 内置swagger2接口API 环境jdk...