在MySQL 5.7.6之前,全文索引只支持英文全文索引,不支持中文全文索引,需要利用分词器把中文段落预处理拆分成单词,然后存入数据库。
从MySQL 5.7.6开始,MySQL内置了ngram全文解析器,用来支持中文、日文、韩文分词。
创建示例
-- 创建表格
CREATE TABLE articles (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255),
content TEXT
);
-- 添加全文索引
-- 使用WITH PARSER ngram语句创建全文索引时,可以指定使用ngram分词器。
ALTER TABLE articles ADD FULLTEXT INDEX idx_content (content) WITH PARSER ngram;
-- 执行全文搜索
SELECT * FROM articles WHERE MATCH(content) AGAINST('你要搜索的关键词');
配置参数
ft_min_word_len
ft_min_word_len
默认值为 4 ,MySQL 将不会为长度小于 4 的词构建全文索引。
举个例子,假设你有一篇包含短词的文章,比如 "The cat is on the mat.",而 ft_min_word_len
设置为 4。在这种情况下,诸如 "the", "cat", "is", "on", "the", "mat" 这样的短词将不会被包括在全文索引中。因此,如果你搜索 "the",你将无法找到任何匹配,因为 "the" 这个词在索引中不存在。
--显示当前 MySQL 实例中 ft_min_word_len 的设置值
SHOW VARIABLES LIKE 'ft_min_word_len';
如果你希望更改 ft_min_word_len
的值,你可以通过修改 MySQL 配置文件(通常是 my.cnf
或 my.ini
)来实现。找到 ft_min_word_len
参数所在的部分,并将其设置为你想要的值,然后重新启动 MySQL 服务使更改生效。
也可以用命令实现
--长度改为2
SET GLOBAL ft_min_word_len = 2;
--重新构建全文索引,以便新的设置生效
ALTER TABLE your_table_name ENGINE=MyISAM;
根据我的实测,这个参数对中文并没有影响,因为我在创建索引时指定使用ngram分词器。
与默认的全文索引相比,使用 N-gram 解析器创建的全文索引可以搜索到更短的词语,因为它会将文本分成连续的字符片段作为词条。这意味着即使词语的长度小于 ft_min_word_len
参数的值,它们仍然可以被搜索到。
ngram_token_size
MySQL 中使用全局变量ngram_token_size来配置ngram中n的大小,它的取值范围是1到10,默认值是2。通常ngram_token_size设置为要查询的单词的最小字数。如果需要搜索单字,就要把ngram_token_size设置为1。在默认值是2的情况下,搜索单字是得不到任何结果的。因为中文单词最少是两个汉字,推荐使用默认值2。如果你想查询到单个字,那么我们需要设置为1。ngram_token_size的值设置的越小,全文索引占用的空间也越小。一般来说,查询正好等于ngram_token_size的词,速度会更快,但是查询比它更长的词或短语,则会变慢。
-- 显示ngram_token_size的值
show VARIABLES like 'ngram_token_size';
修改方法:在my.ini文件下的 [mysqld] 下面加上 ngram_token_size = 2 即可,当然也可以设置成1。如果是Linux系统则修改my.cnf文件。
索引问题
上面创建的示例中只有content设置了全文索引,要同时查询2个字段,就需要同时对2个字段进行索引,而不是单独再给title字段索引。
-- 删除现有的全文索引
ALTER TABLE articles DROP INDEX idx_content;
-- 添加2个字段的全文索引
ALTER TABLE articles ADD FULLTEXT INDEX idx_title_content (title, content) WITH PARSER ngram;
标签:中文,--,全文索引,token,len,ngram,mysql,size From: https://www.cnblogs.com/yuyanc/p/18134637