mysql/mariadb 实现全文检索

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: mysql/mariadb 实现全文检索

mysql/mariadb 实现全文检索

为什么要使用全文检索

有很多业务都有根据某关键字或者某短语去模糊搜索结果的情况,比如文章或者博客标题,内容,等关键字搜索,或者根据多个词语组合搜索,比如搜索“nba 湖人 科比”找到匹配度最高的内容等,因此全文检索在各场景的应用还是很广的

都有哪些方式实现全文检索

就我个人实际项目应用中搭建以及落地的项目情况来说,早期主要用solr,后期主要用elasticsearch

,其实这些都是很不错的第三方全文检索应用,但是如果规模量级很小的项目,用这些就有点杀鸡用牛刀了,而且为了保证solr 或者es

高可用,一般都会进行集群搭建与维护,这就额外的增加了开发和部署以及维护成本,所以这里主要介绍一下中小项目下直接用mysql5.6+/mariadb10.0.6+

实现全文检索功能

如何用mysql实现全文检索

由于mariadb 全文检索模式需要适用Mroonga 存储引擎,但此引擎不支持事务,所以选择了择中方案,先调用分词器,将内存分解为自然语言分词,然后保存在一个独立字段中,本文只是创建了个测试表用来演示,暂不涉及分词器部分,后续篇章中会有独立介绍以及全部分词器代码项目demo 链接如下

java字符串分词参考我另一篇文章《java应用集成HanLP进行中文自然语言分词详细完整案例以及demo》

like 方式

like 方式左关联like %xx 会导致索引失效,然后大部分业务都需要左右模糊匹配查询,因此大数据两情况下会造成极大性能耗费

match 方式(仅限于mysql >=5.6)

match 基于fulltext 索引机制需要查询字段必须先创建fulltext 索引,否则无法使用,而且一起查询的列也都必须一同做关联索引,不然一样无法使用

match 全文检索分为三种类型,如下:

1.自然语言搜索(IN NATURAL LANGUAGE MODE)

查询关键字表达式会被解析器分解为若干个单词,把每个单词匹配的行都查询出来。

2.布尔搜索 (IN BOOLEAN MODE) 查询关键字表达式中可以包含特定的修饰字符,通过修饰字符,来满足特殊的查询条件。

修饰符 说明
+ 加号,结果中必需包含
- 减号,结果中不能包含
空格,结果中,至少包含一个由空格连接的单词
* 星号,作为通配符匹配

3.查询扩展搜索(WITH QUERY EXPANSION)

使用场景以及语法demo

准备测试数据以及创建索引


a564c8256921435ca62c8c0966a23a4c.png


86a8daa6a06c4ba4b8728d21430694f8.png

注意:如果要同时查询多个字段的匹配情况,需要创建独立字段的索引以及多个字段一起的索引

比如我有title和body两个字,可能需要各自独立查询,也需要同时查询,那么就得创建独立索引的同时也要创建一起的关联索引,如下



查询对应匹配项数量

select count(*) from test where MATCH(title,body) AGAINST ('开发' IN BOOLEAN MODE)


查询含有’开发‘字样的匹配项行内容

select * from test where MATCH(title,body) AGAINST ('开发' IN BOOLEAN MODE)

9a89a155eb7248dfb9d63bece92cf2fd.png

查询匹配度

select MATCH(title,body) AGAINST ('+开发' IN BOOLEAN MODE) from test

b970e8c479684274983ea1b34c1fedf2.png

查询含有’开发‘字样且不含有‘入门‘字样的匹配项行内容

select * from test where MATCH(title,body) AGAINST ('+开发 -入门' IN BOOLEAN MODE)

查询含有’世界’为开头的匹配项,和like’xx%’ 右匹配相同,比如如 lik*,表示可以是 lik,like,likes

select * from test where MATCH(title,body) AGAINST ('世界*' IN BOOLEAN MODE)

40e6605097eb4fdbab8566016730eb25.png

查询确切含有’入门课程‘字样短语的匹配项行内容

select * from test where MATCH(title,body) AGAINST ('"入门课程"' IN BOOLEAN MODE)

2fc415bc3d164d289f4fb2bc8288bbaf.png

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
关系型数据库 Java MySQL
Linux安装JDK1.8 & tomcat & MariaDB(MySQL删减版)
本教程提供了在Linux环境下安装JDK1.8、Tomcat和MariaDB的详细步骤。这三个组件的组合为Java Web开发和部署提供了一个强大的基础。通过遵循这些简单的指导步骤,您可以轻松建立起一个稳定、高效的开发和部署环境。希望这个指导对您的开发工作有所帮助。
229 8
|
4月前
|
缓存 关系型数据库 MySQL
error: Failed dependencies: mariadb-connector-c-config is obsoleted by mysql-community-server-8.0.36-1.el7.x86_64 问题解决
error: Failed dependencies: mariadb-connector-c-config is obsoleted by mysql-community-server-8.0.36-1.el7.x86_64 问题解决
260 19
|
3月前
|
SQL 关系型数据库 MySQL
如何在 MySQL 或 MariaDB 中导入和导出数据库
如何在 MySQL 或 MariaDB 中导入和导出数据库
559 0
|
3月前
|
SQL Ubuntu 关系型数据库
如何在云服务器上创建和管理 MySQL 和 MariaDB 数据库
如何在云服务器上创建和管理 MySQL 和 MariaDB 数据库
50 0
|
3月前
|
关系型数据库 MySQL 数据库连接
FreeSWITCH通过mod_mariadb原生连接MySQL
FreeSWITCH通过mod_mariadb原生连接MySQL
324 0
|
5月前
|
存储 SQL 关系型数据库
【MySQL技术内幕】5.8-全文检索
【MySQL技术内幕】5.8-全文检索
87 0
|
6月前
|
关系型数据库 MySQL 数据库
MySQL 全文检索
MySQL 全文检索
|
NoSQL 关系型数据库 MySQL
阿里云关系型数据库详细介绍MySQL/MariaDB/SQL Server/PolarDB/PostgreSQL等
阿里云关系型数据库详细介绍MySQL/MariaDB/SQL Server/PolarDB/PostgreSQL等,阿里云RDS关系型数据库如MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等
205 0
|
NoSQL 关系型数据库 MySQL
阿里云RDS关系型数据库大全_MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等
阿里云RDS关系型数据库如MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等,NoSQL数据库如Redis、Tair、Lindorm和MongoDB
332 0
|
NoSQL Cloud Native 关系型数据库
阿里云RDS数据库_MySQL_SQL Server_MariaDB_PolarDB_PostgreSQL
阿里云RDS关系型数据库大全:MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等
133 0

热门文章

最新文章

下一篇
无影云桌面