mysql/mariadb 实现全文检索

本文涉及的产品
RDS Agent(兼容OpenClaw),2核4GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
9月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1440 152
|
9月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
1050 156
|
9月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
关系型数据库 Java MySQL
Linux安装JDK1.8 & tomcat & MariaDB(MySQL删减版)
本教程提供了在Linux环境下安装JDK1.8、Tomcat和MariaDB的详细步骤。这三个组件的组合为Java Web开发和部署提供了一个强大的基础。通过遵循这些简单的指导步骤,您可以轻松建立起一个稳定、高效的开发和部署环境。希望这个指导对您的开发工作有所帮助。
617 8
|
SQL 关系型数据库 MySQL
如何在 MySQL 或 MariaDB 中导入和导出数据库
如何在 MySQL 或 MariaDB 中导入和导出数据库
1409 0
|
SQL Ubuntu 关系型数据库
如何在云服务器上创建和管理 MySQL 和 MariaDB 数据库
如何在云服务器上创建和管理 MySQL 和 MariaDB 数据库
312 0
|
关系型数据库 MySQL 数据库连接
FreeSWITCH通过mod_mariadb原生连接MySQL
FreeSWITCH通过mod_mariadb原生连接MySQL
1421 0
|
NoSQL 关系型数据库 MySQL
阿里云RDS关系型数据库大全_MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等
阿里云RDS关系型数据库如MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等,NoSQL数据库如Redis、Tair、Lindorm和MongoDB
626 0
|
缓存 关系型数据库 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 问题解决
1170 19

推荐镜像

更多