分词搜索必须上Elasticsearch?试试MySQL分词查询技术

 更新时间:2026年04月23日 15:05:09   作者:Micro麦可乐  
文章介绍了MySQL的全文索引及其分词查询技术,从原理、配置、基本查询、中文分词、进阶优化与监控等多个方面进行详细阐述,适合中小型项目简单分词搜索需求,感兴趣的朋友跟随小编一起看看吧

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. 进阶优化与监控

  • 查询性能监控
    • 使用 EXPLAIN 查看 FULLTEXT 查询是否走全文索引。
    • 利用慢查询日志筛选耗时的全文检索。
  • 分片与分表
    • 对于超大文本表,可按日期或业务维度分表分区,保证索引文件大小可控。
  • 增量索引
    • InnoDB 支持后台算法自动增量更新全文索引,无需手动重建整个索引。
  • 权重调优

MATCH() AGAINST() 可对多列设置权重:

MATCH(title) AGAINST('分词') * 2 +
MATCH(content) AGAINST('分词') AS relevance

6. 结语

MySQL分词查询为全文搜索提供了高效的内置解决方案。通过合理配置分词参数、选择合适的分词器(如 ngram 或第三方插件),并运用自然语言模式与布尔模式,小伙伴们可以轻松满足大多数中小项目中的搜索场景的需求。对于更复杂的需求,建议结合专业搜索引擎如Elasticsearch构建搜索体系。

到此这篇关于分词搜索必须上Elasticsearch?试试MySQL分词查询技术的文章就介绍到这了,更多相关mysql分词查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql服务器查询慢原因分析与解决方法小结

    mysql服务器查询慢原因分析与解决方法小结

    在开发的朋友特别是和mysql有接触的朋友会碰到有时mysql查询很慢,当然我指的是大数据量百万千万级了,不是几十条了,下面我们来看看解决查询慢的办法
    2012-04-04
  • MySQL复合查询(多表查询、子查询)的实现

    MySQL复合查询(多表查询、子查询)的实现

    MySQL复合查询是指在一个SQL语句中使用多个查询条件,以过滤和检索数据,本文主要介绍了MySQL复合查询(多表查询、子查询)的实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • log引起的mysql不能启动的解决方法

    log引起的mysql不能启动的解决方法

    今天服务器挂了原来服务器的硬盘进行了数据转移 弄到mysql的时候发现里面log日志文件高达900MB
    2008-07-07
  • 查询MySQL中的树型表两种方法

    查询MySQL中的树型表两种方法

    在 MySQL中查询树型表(即具有层级结构的表)可以使用递归查询或者使用嵌套集模型,下面介绍两种方法查询MySQL中的树型表,感兴趣的朋友一起看看吧
    2024-01-01
  • MySQL 分表分库怎么进行数据切分

    MySQL 分表分库怎么进行数据切分

    这篇文章主要介绍了MySQL 分表分库怎么进行数据切分,帮助大家更好的理解和学习使用MySQL,感兴趣的朋友可以了解下
    2021-03-03
  • MySQL专用服务器自动配置参数的实现

    MySQL专用服务器自动配置参数的实现

    本文主要介绍了MySQL专用服务器自动配置参数的实现,MySQL8.0推出了专用数据库服务器自动配置参数,通过打开innodb_dedicated_server,下面就来详细的介绍一下,感兴趣的可以了解一下
    2024-09-09
  • 浅析MySQL的基数统计

    浅析MySQL的基数统计

    这篇文章主要介绍了MySQL的基数统计的相关资料,帮助大家更好的理解和学习MySQL数据库的使用,感兴趣的朋友可以了解下
    2020-11-11
  • 大批量数据用mysql批量更新数据的4种方法总结

    大批量数据用mysql批量更新数据的4种方法总结

    这篇文章主要给大家介绍了关于大批量数据用mysql批量更新数据的4种方法,要在MySQL中新增大批量数据,可以通过以下几种方法来实现,文中给出了详细的代码示例,需要的朋友可以参考下
    2024-05-05
  • mysql创建表设置表主键id从1开始自增的解决方案

    mysql创建表设置表主键id从1开始自增的解决方案

    在MySQL中用很多类型的自增ID,每个自增ID都设置了初始值,一般情况下初始值都是从0开始,然后按照一定的步长增加(一般是自增 1),下面这篇文章主要给大家介绍了关于mysql创建表设置表主键id从1开始自增的解决方案,需要的朋友可以参考下
    2023-04-04
  • 轻松掌握MySQL函数中的last_insert_id()

    轻松掌握MySQL函数中的last_insert_id()

    相信大家应该都知道Mysql函数可以实现许多我们需要的功能,这篇文章介绍的Mysql函数Last_insert_id()就是其中之一,文章通过一个例子展开来讲,应该更有助于大家的理解和学习,有需要的朋友们下面来一起看看吧。
    2016-12-12

最新评论