mysql插件开发_Mysql 编写全文插件索引

说明

在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中提供了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字符集中汉字既是大写字母又是小写字母。

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值