MySQL索引系列:全文索引

article/2025/11/4 22:06:11

什么是全文索引?

全文索引首先是 MySQL 的一种索引类型,也是搜索引擎的关键技术。

试想在1M大小的文件中搜索一个词,可能需要几秒,在100M的文件中可能需要几十秒,如果在更大的文件中搜索那么就需要更大的系统开销,这样的开销是不现实的。

所以在这样的矛盾下出现了全文索引技术,有时候有人叫倒排文档技术。

全文索引的作用是什么?

全文索引是将存储在数据库中的大段文本中的任意内容信息查找出来的技术。

既然是查找包含某些内容的文本,用 like + 通配符 或者正则表达式就可以实现模糊匹配,为什么还要全文索引?

  • 性能:通配符和正则表达式匹配通常要求MySQL尝试匹配表中所有行(而且这些搜索极少使用表索引)。因此,由于被搜索行数不断增加,这些搜索可能非常耗时。
  • 明确控制:使用通配符和正则表达式匹配,很难明确地控制匹配什么和不匹配什么。例如,指定一个词必须匹配,一个词必须不匹配;而一个词仅在第一个词确实匹配的情况下,才可以匹配或者才可以不匹配等。这些情况,使用通配符和正则表达式都不满足。
  • 智能化的结果:虽然基于通配符和正则表达式的搜索提供了非常灵活的搜索方式,但它们都不能提供一种智能化的选择结果的方法。 例如,一个特殊词的搜索将会返回包含该词的所有行,而不区分包含单个匹配的行和包含多个匹配的行(按照可能是更好的匹配来排列它们)。类似,一个特殊词的搜索将不会找出不包含该词但 包含其他相关词的行。

所有这些限制以及更多的限制都可以用全文本搜索来解决。在使用全文本搜索时,MySQL不需要分别查看每个行,不需要分别分析和处理每个词,可以根据需要获取全文中有关章,节,段,句,词等信息,也可以进行各种统计和分析。MySQL创建指定列中各词的一个索引,搜索可以针对这些词进行。这样,MySQL可以快速有效地决定哪些词匹配(哪些行包含它们), 哪些词不匹配,它们匹配的频率,等等。

但是全文索引可能存在精度问题

假如我们要搜索 胡歌很帅,拿百度来举个例子:
在这里插入图片描述

可以看到我明明搜索的是 ‘胡歌很帅’,但是百度搜索的关键字(标红的就是关键字)却不只是完整的 ‘胡歌很帅’,这一句话被分割为’胡歌’,‘很帅’,‘帅’,‘胡歌很’,'胡歌很帅’等,这就是全文索引里的分词机制,也是导致精度问题的原因。

版本支持

  1. MySQL 5.6 以前的版本,只有 MyISAM 存储引擎支持全文索引,InnoDB存储引擎并不支持全文索引技术,大多数的用户转向MyISAM存储引擎,虽然可以通过表的拆分,将进行全文索引的数据存储为MyIsam表,这样方式解决逻辑业务的需求,但是却丧失了INNODB存储引擎的事务性;
  2. MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存储引擎均支持全文索引;
  3. 只有字段的数据类型为 char、varchar、text 及其系列才可以建全文索引。

索引的创建、修改、删除

具体操作就不重复了,请看上一篇博客:MySQL索引系列:索引概述

使用全文索引

首先创建表,插入测试数据

create table test (id int(11) unsigned not null auto_increment,content text not null,primary key(id),fulltext key content_index(content)
) engine=Innodb default charset=utf8;insert into test (content) values ('a'),('b'),('c');
insert into test (content) values ('aa'),('bb'),('cc');
insert into test (content) values ('aaa'),('bbb'),('ccc');
insert into test (content) values ('aaaa'),('bbbb'),('cccc');

按照全文索引的使用语法执行下面查询:

select * from test where match(content) against('a');
select * from test where match(content) against('aa');
select * from test where match(content) against('aaa');# 使用完整的 Match() 说明传递给 Match() 的值必须与 FULLTEXT() 定义中的相同。如果指定多个列,则必须列
# 出它们(而且次序正确)。且搜索不区分大小写。

结果发现只有最后那条SQL有一条记录,为什么呢?

这个问题有很多原因,其中最常见的就是 最小搜索长度 导致的。另外插一句,使用全文索引时,测试表里至少要有 4 条以上的记录,否则,会出现意想不到的结果。

MySQL 中的全文索引,有两个变量,最小搜索长度和最大搜索长度,对于长度小于最小搜索长度和大于最大搜索长度的词语,都不会被索引。通俗点就是说,想对一个词语使用全文索引搜索,那么这个词语的长度必须在以上两个变量的区间内。

这两个的默认值可以使用以下命令查看

show variables like '%ft%';

可以看到这两个变量在 MyISAM 和 InnoDB 两种存储引擎下的变量名和默认值

// MyISAM
ft_min_word_len = 4;
ft_max_word_len = 84;// InnoDB
innodb_ft_min_token_size = 3;
innodb_ft_max_token_size = 84;1234567

可以看到最小搜索长度 MyISAM 引擎下默认是 4,InnoDB 引擎下是 3,也即,MySQL 的全文索引只会对长度大于等于 4 或者 3 的词语建立索引,而刚刚搜索的只有 rabbit 的长度大于等于 3。

配置最小搜索长度

全文索引的相关参数都无法进行动态修改,必须通过修改 MySQL 的配置文件来完成。修改最小搜索长度的值为 1,首先打开 MySQL 的配置文件 /etc/my.cnf,在 [mysqld] 的下面追加以下内容

[mysqld]
innodb_ft_min_token_size = 1

然后重启 MySQL 服务器,并修复全文索引。注意,修改完参数以后,一定要修复下索引,不然参数不会生效。

两种修复方式,可以使用下面的命令修复

repair table productnotes quick;

或者直接删掉重新建立索引,再次执行上面的查询,就都可以查出来了。

全文搜索的分类

  • 自然语言的全文搜索

  • 布尔全文搜索

  • 带查询扩展的全文搜索

关于这几个分类,具体描述还是看官方手册手册吧

参考文章
官方手册

MySQL必知必会
全文索引的原理


http://chatgpt.dhexx.cn/article/a5n2BDE4.shtml

相关文章

全文索引简介

全文索引技术就是将各种信息,文档中所有的文字序列都作为检索对象,找出包含检索词汇的信息或文档。 全文索引在数据库中一般是作为单独模块使用的,如MYSQL全文检索工具——Sphinx,一般全文索引模块需要配合数据库的存储方式进行处…

【MySQL】全文索引详解

文章目录 🍀全文索引概述 🍀全文索引的创建 🍀创建表时定义索引 🍀在已存在表上创建 🍀执行create语句 🍀执行ALTER TABLE语句 全文索引概述 全文索引主要对字符串类型建立基于分词的索引&#xff0c…

html怎么异步传数据,用jQuery实现异步通信(用json传值)方法步骤

jQuery是时下比较流行的一个js库,能够用简单的代码做出理想的效果,就像官网上说的那样“write less ,do more”。Jquery在一定程度上改写了以往对JavaScript的写法,本人就用jquery实现上篇中用ajax实现异步通信的效果,感受一下jqu…

用jQuery实现异步通信(用json传值)具体思路

jQuery是时下比较流行的一个js库,能够用简单的代码做出理想的效果,就像官网上说的那样“write less ,do more”。Jquery在一定程度上改写了以往对JavaScript的写法,本人就用jquery实现上篇中用ajax实现异步通信的效果,感受一下jqu…

jQuery的toggle

<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><!--引入jq框架--><script src"https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script></head><body>…

12.jQuery技术

一、jQuery知识点总览。 css&#xff08;&#xff09;方法&#xff1a;//通过css&#xff08;&#xff09;方法获取样式值let backgroundcolor $("#one").css("backgroundColor");alert(backgroundcolor);//通过css&#xff08;&#xff09;方法设置id为…

jQuery

##jQuery基础 1.概念&#xff1a;一个JavaScript框架。简化JS开发 *jQuery是一个快速、简洁的JavaScript框架&#xff0c;是继Prototype之后又一个优秀的JavaScript代码库&#xff08;框架&#xff09;于2006年1月由John Resig发布。 jQuery设计的宗旨是“write Less&#xf…

jQuery建立WebSocket连接

jQuery建立WebSocket连接&#xff0c;向服务端发送数据&#xff0c;实现WebSocket连接成功。 js代码如下&#xff1a; <script src"https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script><script type"text/javascript">…

WebGoat攻略 for Mac(1)

WebGoat攻略 for Mac&#xff08;1&#xff09; 一、环境配置1.配置Docker2.配置WebGoat3.连接WebGoat 二、题目攻略Introduction(介绍)a.WebGoatb.WebWolf General(通用)a.HTTP Basics(HTTP基础)b.HTTP Proxies配置OWASP ZAP c.Developer Tools(开发人员工具)d.CIA Triade.Cry…

代码审计之WEBGOAT 反序列化

反序列化这关在前端页面可以看到是提交token到后端&#xff0c;先看一下接口名 可以看到接口名为InsecureDeserialization/task&#xff0c;那就后端全局搜索InsecureDeserialization/task&#xff0c;最终定位到InsecureDeserializationTask.java 源码如下&#xff1a; packa…

kali搭建webgoat靶场

下载webgoat-server-8.0.0.M26.jar与webwolf-server-8.0.0.M26.jar&#xff0c;并保存至kali的documents处&#xff0c;并在此打开终端&#xff08;不然无法打开&#xff09; 打开webgoat-server-8.0.0.M26.jar 浏览器访问127.0.0.1:8080/WebGoat/login.html 进行注册且登录 成…

基于 WebGoat 平台的 SQL 注入攻击

基于 WebGoat 平台的 SQL 注入攻击 扩展功能参考: https://blog.csdn.net/HZC0217/article/details/126790211 使用实例参考: https://www.cnblogs.com/hndreamer/p/16635984.html 目录 1、什么是 webgoat? 2、jar 下载 3、环境搭建 4、运行 webgoat 5、在浏览器中登录 …

owaspbwa之WebGoat

简介 下载&#xff1a;https://sourceforge.net/projects/owaspbwa/files/ GitHub: https://github.com/chuckfw/owaspbwa/wiki/UserGuide 0x001 侦查 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 5.3p1 Debian 3ubuntu4 (Ubuntu Linux; protoc…

WebGoat之JWT部分攻略

环境搭建 使用docker容器搭建webgoat环境 什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准.该token被设计为紧凑且安全的&#xff0c;特别适用于分布式站点的单点登录&#xff08;单点登录SSO&#xff1a;在多个应用系统中&…

Webgoat靶场搭建

环境 jdk16 安装 文件源码看评论区哈。 下载过后是这个jdk-16.0.2.7z文件&#xff0c;这是个JDK16的包,进入bin目录下&#xff0c;可以看到靶场文件&#xff0c; 启动网站 打开一个cmd窗口执行启动网站命令 java --add-opens java.base/sun.nio.chALL-UNNAMED --add-op…

WebGoat通关教程

这里我们用docker镜像一键搭建即可 用docker命令开启webgoat docker run -d -p 8081:8080 -p 9090:9090 -e TZEurope/Amsterdam webgoat/goatandwolf 打开192.168.109.131:8081/WebGoat和192.168.109.131:9090/WebWolf能打开即可 192.168.109.131是本地IP 直接注册一个账号&…

在Ubuntu环境下使用docker配置webgoat环境

1.安装Docker环境 sudo apt install docker.io 2.配置Docker加速 打开配置文件 vim /etc/docker/daemon.json添加mirrors信息 {"registry-mirrors":["https://registry.docker-cn.com","http://hub-mirror.c.163.com"]}3.重启docker system…

WebGoat General Crypto Basics

目录 第2页 第3页 第4页 第6页 第2页 这一页是讲base64编码和Basic Authentication的 简单来说Basic Authentication中使用了base64编码&#xff0c;以本页的题目举例&#xff0c;如果有个HTTP头长这样 Authorization: Basic ZmFuY3llbGU6c2VjcmV0 那这个网站就是用了Basi…

docker安装webgoat

docker安装webgoat 一般来说 无需docker&#xff0c;在 https://github.com/WebGoat/WebGoat/releases中&#xff0c;下载最新的v8.2.2.jar,然后java -jar webgoat-server-8.2.2.jar然后反问http://127.0.0.1/WebGoat即可 但是&#xff0c;由于本人windows主机(java10.0.2)和ka…

WebGoat-8.2.2版靶机学习总结

摘要&#xff1a;本文档介绍了WebGoat靶机平台在Windows10系统下的使用。其操作过程均在一台主机上完成。该平台涉及的训练项目有http代理、数据库注入、身份校验缺陷、XSS、访问控制缺陷、通信拦截、序列化问题、CSRF、问题组件等内容&#xff0c;帮助学习者学习网络攻防基础&…