MySQL 5.7 中文全文检索ngram使用总结

本文介绍了MySQL 5.7.6起内置的ngram全文解析器,用于支持中文、日文、韩文分词。讲解了ngram_token_size的设置,创建全文索引的方法,以及全文检索的自然语言模式和BOOLEAN模式,并给出了示例。全文索引的变量值查询和查询字符的使用也进行了说明。

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

在MySQL 5.7.6之前,全文索引只支持英文全文索引,不支持中文全文索引,需要利用分词器把中文段落预处理拆分成单词,然后存入数据库。
从MySQL 5.7.6开始,MySQL内置了ngram全文解析器,用来支持中文、日文、韩文分词。
本文使用的MySQL 版本是5.7.22,InnoDB数据库引擎。

ngram全文解析器

ngram就是一段文字里面连续的n个字的序列。ngram全文解析器能够对文本进行分词,每个单词是连续的n个字的序列。例如,用ngram全文解析器对“生日快乐”进行分词:

n=1: '生', '日', '快', '乐' 
n=2: '生日', '日快', '快乐' 
n=3: '生日快', '日快乐' 
n=4: '生日快乐'

MySQL 中使用全局变量ngram_token_size来配置ngram中n的大小,它的取值范围是1到10,默认值是2。通常ngram_token_size设置为要查询的单词的最小字数。如果需要搜索单字,就要把ngram_token_size设置为1。在默认值是2的情况下,搜索单字是得不到任何结果的。因为中文单词最少是两个汉字,推荐使用默认值2。

全局变量ngram_token_size的两种设置方法:
1、启动mysqld命令时

mysqld --ngram_token_size=2

2、修改MySQL配置文件

[mysqld] 
ngram_token_size=2

创建全文索引

1、创建表的同时创建全文索引

CREATE TABLE articles (
    id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    title VARCHAR (200),
    body TEXT,
    FULLTEXT (title, body) WITH PARSER ngram
) ENGINE = INNODB;

2、通过 alter table 的方式来添加

ALTER TABLE articles ADD FULLTEXT INDEX ft_index (title,body) WITH P
### 如何在 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); ``` 这里展示的是自然语言模式下的简单匹配方式,当然还有布尔模式等多种高级选项可供选用取决于具体业务逻辑的要求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值