MySQL全文索引检索中文

MySQL全文索引检索中文

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

sql 复制代码
SHOW VARIABLES LIKE 'ft%';
show VARIABLES like 'ngram_token_size';

配置

修改 MySQL 配置文件

sql 复制代码
vim /etc/my.cnf

在配置的 [mysqld] 下面添加**ft_min_word_len = 1** ,如果是 innodb 引擎添加配置 innodb_ft_min_token_size = 1

以上配置都不推荐,我比较推荐使用 MySQL 自带的插件 N-gram 因为它对中文的检索更友好。N-gram 插件不需要安装,当创建索引的时候申明使用N-gram就可以了,这个本文后面会提到。一般分词都是设置为2,设置为1我试过检索不出来。设置了 ngram_token_size之后,innodb_ft_min_token_sizeinnodb_ft_max_token_size就没有用了。

可以使用以下语句查询 ngram_token_size配置。

sql 复制代码
SHOW VARIABLES LIKE 'ngram_token_size';

重启MySQL

修改配置以后重启 MySQL服务

sql 复制代码
service mysqld stop
service mysqld start

创建全文索引

sql 复制代码
-- 不使用n-gram
ALTER TABLE <表名> ADD FULLTEXT <索引名>(<字段名>);

-- 使用n-gram,全文索引名一般使用 ft_ 的前缀,例如 ft_user_id
ALTER TABLE <表名> ADD FULLTEXT INDEX <索引名>(<字段名>) WITH PARSER ngram;

全文索引字段必须是中文字符类型,最好是 utf8mb4

优化索引

如果在修改配置前就已经创建了全文索引,则需要重新生成全文索引。可以先删除再重新创建全文索引,也可以执行如下sql优化索引。

sql 复制代码
-- 更新索引
OPTIMIZE TABLE <表名>;

-- 删除索引,再重新创建索引
ALTER TABLE <表名> DROP INDEX <索引名>;
ALTER TABLE <表名> ADD FULLTEXT INDEX <索引名>(<字段名>) WITH PARSER ngram;

全文检索

MySQL 的 MATCH AGAINST 语句支持多种搜索模式,每种模式都有其特定的应用场景。以下是 MySQL 中 MATCH AGAINST 支持的几种主要模式:

1. 自然语言模式(Natural Language Mode)

自然语言模式是最简单的全文搜索模式,默认情况下,如果没有显式指定搜索模式,MATCH AGAINST 将使用自然语言模式。在这种模式下,多个词语之间用空格分隔,表示任意一个词语都可以匹配。

示例

假设你希望匹配包含任意其中一个词语的记录:

sql 复制代码
SELECT * FROM <表名>
WHERE MATCH(<字段名>) AGAINST('关键词1 关键词2 关键词3');

2. 布尔模式(Boolean Mode)

布尔模式允许你更精细地控制搜索行为,可以使用特殊符号来表示逻辑运算符。布尔模式的特点包括:

  • 加号(+)表示必须包含的词,类似于 and
  • 减号( -)表示必须不包含的词,类似于 not
  • 空格表示或的关系,类似于 or
  • 星号( *)表示通配符,用于模糊匹配。
  • >< 可以用来表示词频的阈值。
  • 双引号(")表示短语搜索。

示例

假设你希望匹配包含所有词语的记录:

sql 复制代码
SELECT * FROM <表名>
WHERE MATCH(<字段名>) AGAINST('+关键词1 +关键词2' IN BOOLEAN MODE);

3. 查询扩展模式(Query Expansion Mode)

查询扩展模式是在布尔模式的基础上增加了查询扩展的功能,它允许 MySQL 根据已有的搜索词自动扩展搜索范围,以找到更多相关文档。查询扩展模式使用 WITH QUERY EXPANSION 关键字。

示例

假设你希望匹配包含所有词语的记录,并扩展搜索范围:

sql 复制代码
SELECT * FROM <表名>
WHERE MATCH(<字段名>) AGAINST('+关键词1 +关键词2' WITH QUERY EXPANSION);

4. 混合模式

你可以结合使用自然语言模式和布尔模式,根据需要选择最适合的模式。例如,你可以使用自然语言模式来匹配多个词语中的任意一个,同时使用布尔模式来精确控制某些词语的匹配。

示例

假设你希望匹配包含任意其中一个词语的记录,并且排除某些词语:

sql 复制代码
SELECT * FROM <表名>
WHERE MATCH(<字段名>) AGAINST('关键词1 关键词2' IN BOOLEAN MODE);

注意事项

  1. 全文索引:确保你已经在相关列上创建了全文索引。
  2. 字符集 :确保使用支持中文的字符集,如 utf8mb4
  3. 停用词处理:对于中文全文搜索,停用词的处理非常重要,可以自定义停用词列表来提高搜索质量。
  4. 全文索引参数 :根据需要调整全文索引的相关参数,如 ft_min_word_lenft_max_word_len

参考

相关推荐
岁岁种桃花儿4 小时前
MySQL从入门到精通系列:InnoDB记录存储结构
数据库·mysql
jiunian_cn5 小时前
【Redis】hash数据类型相关指令
数据库·redis·哈希算法
冉冰学姐5 小时前
SSM在线影评网站平台82ap4(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm框架·在线影评平台·影片分类
Exquisite.6 小时前
企业高性能web服务器(4)
运维·服务器·前端·网络·mysql
知识分享小能手6 小时前
SQL Server 2019入门学习教程,从入门到精通,SQL Server 2019数据库的操作(2)
数据库·学习·sqlserver
西瓜程序猿7 小时前
传统礼簿收礼小工具:记了么,解决纸质收礼记账痛点
经验分享·测试工具·程序人生·全文检索·交友
踩坑小念7 小时前
秒杀场景下如何处理redis扣除状态不一致问题
数据库·redis·分布式·缓存·秒杀
萧曵 丶8 小时前
MySQL 语句书写顺序与执行顺序对比速记表
数据库·mysql
Wiktok9 小时前
MySQL的常用数据类型
数据库·mysql
曹牧9 小时前
Oracle 表闪回(Flashback Table)
数据库·oracle