如何编写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的函数。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之全文索引:深度剖析与优化实践 在数据库开发领域,MySQL作为一款广泛使用的数据库管理系统,其全文索引功能对于实现高效的文本搜索至关重要。在学习和使用MySQL全文索引的过程中,我积累了不少经验和心得,今天就想和大家分享一下,希望能和大家一起学习进步,更深入地掌握这一强大功能。 阅读详情

相关推荐

MySQL索引优化:全文索引

在MySQL中,是一种专门为文本数据设计的索引类型,用于高效处理自然语言搜索(如文章内容、评论、关键词匹配等)。与传统的B-Tree索引相比,全文索引在处理大量文本数据时性能更优,且支持更复杂的搜索语法。CHARVARCHARTEXTMySQL*"数据库设计"MySQL内置分词器对中文支持不佳(默认按空格分词),需使用第三方插件(如ngram全文索引的维护成本高于普通索引,写入操作可能变慢。MATCHUPPER()WHERE全文索引通常比原数据大,需预留足够磁盘空间。

weixin_43833540的博客 1113

mysql plugin 开发_Mysql源代码分析(5): Plugin架构介绍--转载

#define mysql_declare_plugin_end ,{0,0,0,0,0,0,0,0,0,0,0,0}}__MYSQL_DECLARE_PLUGIN根据plugin是动态链接plugin还是静态链接plugin有不同的定义:#ifndef MYSQL_DYNAMIC_PLUGIN#define __MYSQL_DECLARE_PLUGIN(NAME, VERSION, PSIZE,...

weixin_36205186的博客 413

基于Mysql数据库的驱动器分库分表分片插件:通过自己开发驱动器插件来实现分片管理

作者:禅与计算机程序设计艺术什么是分库分表?为什么要分库分表?当我们的业务增长到一定规模后,单个数据库的数据量越来越大,导致查询效率下降、存储空间占用过多等问题。这个时候,我们就需要将数据分布到多个数据库中,每个数据库存储特定的数据集,解决查询效率的问题。什么是分片?分片可以理解为将数据集按照某种规则进行拆分,每一块分配给一个服务器或节点来存储和处理。分片方案一般包括水平拆分(将数据按列或行切割)和垂直拆分(将数据按功能、主题等切割)。目前主流的分片方案有范围分片、哈希分片、列表分片和令牌分片等。一般情况下

AI天才研究院 4098

mysql UDF

linux平台 步骤如下: 下载源码:https://github.com/mysqludf/lib_mysqludf_sys 一、解压附件的压缩包之后 或者配置makefile LIBDIR=/usr/lib64/mysql/plugin install: gcc -DMYSQL_DYNAMIC_PLUGIN -fPIC -Wall -I /space/mysql/mysql-5.7....

jc_benben的专栏 575

告别切换烦恼!用Parallels Desktop的Host-Only网卡,在macOS上直接访问虚拟机里的公司内网

本文详细介绍了如何在macOS上使用Parallels Desktop的Host-Only网卡直接访问虚拟机内的公司内网,告别频繁切换操作系统的烦恼。通过配置Host-Only网络模式,实现主机与虚拟机的安全高效通信,特别适合需要频繁访问内网资源的IT从业者。文章包含分步指南、自动化脚本和常见问题解决方案,帮助用户优化工作流程。

weixin_28739079的博客 363

UsualToolCMS-验证码绕过漏洞复现

本文以UsualToolCMS为靶场,复现了验证码绕过漏洞

小小小屿屿屿的博客 919

MYSQL学习笔记2--mysql 静态和动态plugin

mysql源码编译 1.cmke 安装 yum install cmake 2.依赖的库下载机安装: yum -y install gcc* gcc-c++* autoconf* automake* zlib* libxml* ncurses-devel* libgcrypt* libtool* bison* openssl* 3. 4.make...

weixin_34209851的博客 183

如何在windows下使用cmake编译源码

MyProject/└── build/在MyProject目录下创建并编辑。创建build目录并进入。使用cmake命令生成构建文件。使用适当的命令编译项目。运行生成的可执行文件。

cdj444asdg的博客 3345

MySQL插件开发

个人学习来的简易版 UE4 MySQL插件

weixin_44519692的博客 1241

卫星监测“America”级#两#栖#攻#击#舰#(LHA-6)出港

卫星监测“America”级#两#栖#攻#击#舰#(LHA-6)出港 前脚刚走,后脚又来,山姆大叔又来刷存在感,2020年7月28日,USS Ronald Reagan流窜在我国东海海区被卫星拍了下来: 2020年8月1日,最新卫星图像显示USS Ronald Reagan已经返回母港日本横须贺:距离其出港(2020年6月8日)已经过去了快两个月 然而事情并没有到此结束,“America”级#两#栖#攻#击#舰#(LHA-6)选择在 “八.一” 这个特殊的日子前后出港颇具挑衅的味道。 根据2020年

qq_46071146的博客 1565

知识蒸馏⚗️ | YOLOv5知识蒸馏实战篇

YOLOv5知识蒸馏教程

Coding... 9361

mysql全文索引 插件_如何编写MySQL全文索引插件

1.简介全文索引插件用于对MYISAM的全文检索特性进行扩展。通过全文检索,我们可以对文档、图片或者视频等丰富的数据类型进行分词,建立索引,以便进行快速的检索。目前MySQL仅在MYISAM存储引擎里支持全文检索,而对于innodb,则要在6.0以后的版本中才会实现。但目前全文索引也有着如下的限制:1.只支持MyISAM2.不支持中文3.如果支持在一...

weixin_42347778的博客 255

逆强化学习:从专家示范中学习策略

逆强化学习(Inverse Reinforcement Learning,简称IRL)是强化学习(Reinforcement Learning,简称RL)的一个子领域,它的目标是从专家的行为中学习策略。在传统的强化学习中,智能体通过与环境交互,根据奖励信号来学习一个策略。而在逆强化学习中,我们没有直接的奖励信号,而是通过观察专家的行为来推断出奖励函数,从而学习到一个与专家类似的策略。逆强化学习作为强化学习的一个重要子领域,在许多实际应用场景中都取得了显著的成功。

AI天才研究院 1451

mysql全文索引插件_如何编写MySQL全文索引插件

1.简介 全文索引插件用于对MYISAM的全文检索特性进行扩展。通过全文检索,我们可以对文档、图片或者视频等丰富的数据类型进行分词1.简介全文索引插件用于对MYISAM的全文检索特性进行扩展。通过全文检索,我们可以对文档、图片或者视频等丰富的数据类型进行分词,建立索引,以便进行快速的检索。目前MySQL仅在MYISAM存储引擎里支持全文检索,而对于innodb,则要在6.0以后的版本中才会实现。但...

weixin_39632379的博客 159

SOI LDMOS器件的Sentaurus TCAD建模与关键电学特性仿真研究

本文研究了SOI LDMOS器件的TCAD建模与电学特性仿真。通过Sentaurus TCAD平台建立了单RESURF结构的SOI LDMOS模型,详细阐述了器件结构原理和RESURF耐压机制。研究采用SDE进行几何定义和掺杂配置,在Sentaurus Device中构建了完整的物理模型体系,包括迁移率、复合和碰撞电离模型。通过系统仿真提取了器件的转移特性、输出特性和击穿特性等关键参数,分析了各参数对性能的影响规律。研究结果为功率半导体器件的仿真建模提供了规范化参考,有助于优化SOI LDMOS的性能设计。

huanghm88的专栏 134

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

MySQL:如何编写全文索引插件

转载请署名:印风 1.简介 全文索引插件用于对MYISAM的全文检索特性进行扩展。通过全文检索,我们可以对文档、图片或者视频等丰富的数据类型进行分词,建立索引,以便进行快速的检索。 目前MySQL仅在MYISAM存储引擎里支持全文检索,而对于innodb,则要在6.0以后的版本中才会实现。 但目前全文索引也有着如下的限制: 1.        只支持MyISAM 2.        不

记录成长之路 1782

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

mysql 全文索引 插件_如何编写MySQL全文索引插件

1.简介 全文索引插件用于对MYISAM的全文检索特性进行扩展。通过全文检索,我们可以对文档、图片或者视频等丰富的数据类型进行分词1.简介全文索引插件用于对MYISAM的全文检索特性进行扩展。通过全文检索,我们可以对文档、图片或者视频等丰富的数据类型进行分词,建立索引,以便进行快速的检索。目前MySQL仅在MYISAM存储引擎里支持全文检索,而对于innodb,则要在6.0以后的版本中才会实现。但...

weixin_34743057的博客 172

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

mysql全文索引 插件,如何编写MySQL全文索引插件

为了帮助大家了解布尔查询,这里摘录一段MySQL手册里的相关描述。如下:1. 'applebanana'寻找包含至少两个单词中的一个的行。2. '+apple+juice'寻找两个单词都包含的行。3. '+applemacintosh'寻找包含单词“apple”的行,若这些行也包含单词“macintosh”,则列为更高等级。4. '+apple-macint...

weixin_34237125的博客 186

Mysql全文索引

Mysql 全文检索

青青子衿的博客 1万+

MySql 全文索引

Mysql 的全文索引主要用于全文字段的检索场景,支持 char、varchar、text 几个字段加全文索引,仅支持 InNoDB 与 MyISAM 引擎。

Cike___的博客 3050

MySQL全文索引检索中文

5.7.6版本不支持中文检索,需要手动修改配置 ft_min_word_len = 1,因为默认配置 4。

cz285933169的专栏 1689

MySQL全文索引

MySQL全文索引的使用方式,MySQL全文索引的三种模式

jkzyx123的博客 1326

MySQL使用全文索引(fulltext index) 及中文全文索引使用

mysql 全文索引

weixin_38289885的博客 8572

MySQL 之全文索引(fulltext)

本文源自:https://blog.youkuaiyun.com/mrzhouxiaofei/article/details/79940958 最近在复习数据库索引部分,看到了 fulltext,也即全文索引,虽然全文索引在平时的业务中用到的不多,但是感觉它有点儿意思,所以花了点时间研究一下,特此记录。 引入 概念 通过数值比较、范围过滤等就可以完成绝大多数我们需要的查询,但是,如果希望通过关键字的匹配来进行查询过滤,那么就需要基于相似度的查询,而不是原来的精确数值比较。全文索引就是为这种场景设计的。 你可能会说

数据库生态圈(RDB & NoSQL & Bigdata)——专注于关系库应用与研究(Oracle & Mysql & Postgresql & SQL Server ) 1万+
上一篇: MySQL全文检索插件
下一篇: explain的误解
epee
博客等级 码龄24年 2粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值