MySQL也可以实现分词搜索(FULLTEXT)

本文介绍如何在MySQL中使用全文索引实现高效的分词搜索。包括创建支持中文分词的全文索引步骤,以及如何调整分词长度来优化搜索效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FULLTEXT

以前使用查找时都是以 %关键字% 进行模糊查询结果的,这种查询方式有一些缺点,比如不能查询多个列必须手动添加条件以实现,效率不高等
现在有一种新的查找方式可以解决以上问题,就是使用全文索引进行查找
注意:并非所有存储引擎都支持全文搜索功能。在MySQL 5.6或更高版本中,只有MyISAM和InnoDB存储引擎支持全文搜索。

全文搜索的简单使用

建表添加FULLTEXT索引

使用该技术非常简单,首先需要有一张表,我建立了一张图书表并插入了两条数据

CREATE TABLE `book`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `book_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `author` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `publisher` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  FULLTEXT INDEX `bookname_author_publisher_fulltext`(`book_name`, `author`, `publisher`) WITH PARSER `ngram`
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

在这里插入图片描述

接下来添加索引

添加FULLTEXT索引的语法是

CREATE FULLTEXT INDEX index_name ON table_name(idx_column_name,…)

但是由于我们需要分词搜索,MySQL本身不支持中文分词,所以在使用全文索引时需要引入Ngram解析器使得支持中文分词搜索(MySQL版本大于5.6),只需要在创建索引时在语句后面添加WITH PARSER NGRAM 即可
例如,创建了一个支持以书名,作者和出版社为搜索条件的全文索引语法如下
create FULLTEXT index bookname_author_publisher on book(book_name,author,publisher) WITH PARSER ngram

尝试搜索

现在,我们已经创建好了索引,它支持以书名,作者和出版社的内容进行搜索,我们尝试搜索下包含三国的数据
select * from book where MATCH(book_name,author,publisher) against(‘三国’)
结果:
在这里插入图片描述
可以看到,包含三国的数据有两条,分别是书名为三国演义和作者为张三国的数据,已经成功实现分词搜索了
需要说明的是,该Ngram解析器默认的分词长度(ngram_token_size)是2,也就是说,默认是以2个字符进行分词的,如果你只搜索1个字符的话是不会有任何结果的,但是这个值可以自定义。

  • 查看分词长度 SHOW VARIABLES LIKE ‘ngram_token_size’;
  • 修改分词长度 在MySQL的配置文件中(.ini)找到[mysqld]字样的地方,在下方添加ngram_token_size=1即可修改为支持1个字符起搜索(范围1~10)
    关于MySQL的配置文件的位置,如果你是压缩包安装的应该直接就能找到,如果是通过安装程序安装的话可以从服务中找到你的MySQL服务,然后点击属性就可以看到位置了
    在这里插入图片描述
结束

以上就是关于MySQL实现分词搜索的简单过程了,详细语法可以通过该网址进行学习
需要补充的是,我在学习时看到使用该索引进行全文搜索时,会应用50%阈值(50%阈值意味着如果一个单词出现在超过50%的行中,MySQL将在搜索结果中忽略它。),但是实际测试下来并没有忽略掉。
1.布尔全文搜索模式进行搜索时,不会应用50%阈值
2.按理说使用自然语言搜索进行全文搜索时会应用50%阈值,可是我实际测试并没有忽略(innoDB),后来看到一句话

这里是引用
MyISAM全文搜索会忽略至少在一半以上数据行中出现的单词(也即所谓的50%阈值),InnoDB无此限制。而在布尔全文搜索中MyISAM的50%阈值不生效。(来自https://www.likecs.com/show-374225.html?sc=8500)

这一块暂时不清楚什么情况,后续测试再更新吧

### 如何在 MySQL 5.7 中实现分词检索 #### 配置 ngram 解析器 为了使 MySQL 支持中文全文检索,需启用 `ngram` 插件。此插件自 MySQL 5.7.6 起被引入并默认安装但未加载[^1]。 ```sql INSTALL PLUGIN ngram SONAME 'ha_ngram.so'; ``` 上述命令用于首次激活 `ngram` 插件;如果已经处于活动状态则无需重复执行该指令。 #### 创建表结构时指定解析器 当创建含有 FULLTEXT 索引的表格时,应指明采用何种解析算法: ```sql CREATE TABLE articles ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR(200), body TEXT, FULLTEXT INDEX (title,body) WITH PARSER ngram ) ENGINE=InnoDB; ``` 这段 SQL 定义了一个名为 `articles` 的新表,并为其字段组合 `(title, body)` 添加了基于 `ngram` 方法构建的全文索引[^2]。 #### 设置最小词语长度参数 考虑到汉语表达习惯以及实际应用需求,可能需要调整最低可识别词汇单位大小,默认情况下为四个字符。对于大多数场景来说,这个数值显得过大,因此推荐将其设为更合理的值——比如单个汉字即算作有效词条: 编辑配置文件 `my.cnf` 或者 `my.ini`(视操作系统而定),找到 `[mysqld]` 段落追加如下行项以改变全局设定: ```ini ft_min_word_len = 1 innodb_ft_min_token_size = 1 ``` 重启服务端程序让更改生效之后再继续下面的操作步骤[^4]。 #### 执行查询操作 完成前述准备工作以后就可以像平常那样编写 SELECT 查询语句来进行数据查找啦! ```sql SELECT * FROM articles WHERE MATCH(title,body) AGAINST('关键词' IN NATURAL LANGUAGE MODE); ``` 这里展示的是自然语言模式下的简单匹配方式,当然还有布尔模式等多种高级选项可供选用取决于具体业务逻辑的要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值