1. 前言
相信小伙伴们在学习 spring cloud
微服务的过程中涉及到搜索相关的,你一定会想到使用elasticsearch
!没错 elasticsearch
很强大,但是对于一些中小型的项目、网站,简单的一些分词搜索需求,如果使用 elasticsearch
无论是硬件成本、开发开发成本都大大增加!
如果中小项目中一些简单的分词搜索,可以试试 mysql
分词查询,本章节跟着博主深入探讨 mysql
的分词查询技术,从基础使用到中文处理全面解析。
2. mysql 全文索引原理
mysql
自 5.6 起提供了全文索引(full‑text index)功能,通过分词(tokenization)机制将一段文本拆分成一个个“词元”(token),并建立倒排索引,从而实现高效的分词查询
1、分词(tokenization
)
将待索引文本(通常是 text 或 varchar)拆分为一个个词元。例如,英文文本会按空格与标点分词;中文文本默认按字符切割,但可配置 ngram 分词。
2、倒排索引(inverted index
)
对每个词元,记录它所出现的所有行号(文档 id),并统计词元出现频次。查询时,将搜索词同样分词后,快速在倒排索引中定位相关文档。
3、相关性计算
mysql
根据词元在文档中出现的频次(term frequency)、在整个表中出现的文档数(document frequency)等,使用类似 tf‑idf 的算法计算相关度,从高到低排序返回。
3. 配置全文索引与分词查询
下面我们以一个articles表,字段 articles_id 、title、content 为例子来进行操作,以下是建表语句和测试数据
create table `articles` ( `articles_id` int not null auto_increment comment '文章id', `title` varchar(255) default null comment '文章标题', `content` text comment '文章内容', primary key (`articles_id`) ) engine=innodb auto_increment=3 default charset=utf8mb4 collate=utf8mb4_0900_ai_ci; insert into `articles` (`articles_id`, `title`, `content`) values (1, '分词mysql查询', '跟麦可乐学编程:mysql分词查询'); insert into `articles` (`articles_id`, `title`, `content`) values (2, 'mysql分词', '跟麦可乐学:mysql分词');
3.1 建表与索引
对mysql熟悉的小伙伴,可以直接使用sql进行设置
alter table articles add fulltext index ft_index (title, content) with parser ngram; -- 中文需指定ngram解析器
喜欢图形化操作的小伙伴可按下图设置
3.2 基本查询语法
自然语言模式(natural language mode)
select articles_id, title, content, match(title, content) against('分词 查询') as score from articles where match(title, content) against('分词 查询');
默认按自然语言解析查询词,忽略停用词、极短词和频繁出现词
查询输出效果
布尔模式(boolean mode)
select articles_id, title, content from articles where match(title,content) against('+分词 -查询' in boolean mode);
查询输出效果
3.3 关键操作符
通过布尔模式查询上图的效果,下面介绍一下布尔模式支持逻辑运算符:
操作符 | 作用 | 示例 |
---|---|---|
+ | 必须包含 | +apple +juice |
- | 必须排除 | apple -macbook |
~ | 相关性降级 | ~fruit ~vegetable |
* | 通配符 | data* (匹配database等) |
"" | 短语搜索 | "high performance" |
小伙伴们通过上述操作符,就可以自由定制自己的分词查询规则
4. 中文分词 ngram 与插件方案
4.1 ngram 分词
mysql
自带的 ngram
插件可实现中文近似分词:
-- 修改my.cnf(建议token长度2) [mysqld] ngram_token_size=2 -- 建表时指定分词器 如: create table chinese_news ( id int primary key, content text, fulltext index (content) with parser ngram );
配置了 ngram_token_size=2
中文分词原理,按两字切分,例如
原始文本:"分词查询"
分词结果:["分词","词查","查询"]
4.2 第三方分词插件
mecab、jieba 插件:将分词逻辑交给外部库,实现更精准的中文分词。
这里博主就不做过多介绍了,可以根据插件文档进行安装即可
5. 进阶优化与监控
1.查询性能监控
- 使用
explain
查看fulltext
查询是否走全文索引。 - 利用慢查询日志筛选耗时的全文检索。
2.分片与分表
对于超大文本表,可按日期或业务维度分表分区,保证索引文件大小可控。
3.增量索引
innodb 支持后台算法自动增量更新全文索引,无需手动重建整个索引。
4.权重调优
match() against()
可对多列设置权重:
match(title) against('分词') * 2 + match(content) against('分词') as relevance
6. 结语
mysql
分词查询为全文搜索提供了高效的内置解决方案。通过合理配置分词参数、选择合适的分词器(如 ngram
或第三方插件),并运用自然语言模式与布尔模式,小伙伴们可以轻松满足大多数中小项目中的搜索场景的需求。对于更复杂的需求,建议结合专业搜索引擎如elasticsearch
构建搜索体系。
到此这篇关于深入探讨mysql分词查询与全文索引技术的文章就介绍到这了,更多相关mysql分词查询内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论