Kimen's blog Kimen's blog
首页
  • Vue
  • Java
  • 数据库
  • 技术文档
  • 经验之谈
  • 疑难杂症
  • IDE
  • MAC软件分享
  • 学习
  • 运维
  • 折腾
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Kimen Tang

全沾打工人
首页
  • Vue
  • Java
  • 数据库
  • 技术文档
  • 经验之谈
  • 疑难杂症
  • IDE
  • MAC软件分享
  • 学习
  • 运维
  • 折腾
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 数据库

    • 如何通过sql实现一个简单搜索引擎
      • 需求分析
      • 实现1.0版本
      • 实现2.0版本
      • MySQL中的正则表达
    • 『MySQL5.7』创建用户并授权
  • 后端
  • 数据库
Kimen
2021-05-03
目录

如何通过sql实现一个简单搜索引擎

# 需求分析

通过搜索商品的标题关键词搜索出对应的所有商品,比如输入Cat可以查询标题中包含Cat(不区分大小写)的所有商品:

# 实现1.0版本

看到这个需求首先能想到的就是使用数据库的like,模糊匹配关键词

SELECT
	*
FROM
	tbl_product
WHERE
	title LIKE '%cat%';
1
2
3
4
5
6

但是如果我输入的关键词是Cat Mat,那么就一个商品也匹配不到了

实际应该需要将Cat和Mat这两个单词的商品全部查询出来

# 实现2.0版本

如果使用的是Mysql,那么我们可以使用Mysql的REGEXP关键字实现正则匹配 对于上面的需求,我们只需要将Cat和Mat中的空格替换成通配符就可以了

SELECT
	*
FROM
	pet_product
WHERE
	title REGEXP 'cat[[:space:]a-zA-Z]+.*mat';
1
2
3
4
5
6

# MySQL中的正则表达

MySQL中使用 REGEXP 操作符来进行正则表达式匹配。

模式 描述
^ 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配'\n'或'\r'之后的位置
$ 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline 属性,$也匹配'\n'或'\r'之后的位置
. 匹配除"\n"之外的任何单个字符。要匹配包括'n'在内的任何字符,请使用象'[.\n]'的模式。
[…] 字符集合。匹配所包含的任意一个字符。 例如,'[abc]' 可以匹配"plain"中的'a'。
[^…] 负值字符集合。匹配未包含的任意字符。例如,'[^abc]' 可以匹配"plain"中的'p'。
p1|p2|p3 匹配p1或p2或p3。例如,'z
* 匹配前面的子表达式零次或多次。例如,z0* 能匹配"z"以及"zoo"。*等价于{O,}
+ 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配"zo"以及"zoo",但不能匹配"z"。+等价于{1,}。
{n} n是一个非负整数。匹配确定的n次。例如,'o{2}'不能匹配"Bob"中的‘o',但是能匹配"food"中的两个0。
{n,m} m和n均为非负整数,其中n <= m。最少匹配n次且最多匹配m次。
  • 查找name字段中以'st'为开头的所有数据
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';
1
  • 查找name字段中以'ok'为结尾的所有数据
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';
1
  • 查找name字段中包含'mar'字符串的所有数据
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';
1
  • 查找name字段中以元音字符开头或以'ok'字符结尾的所有数据
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';
1
编辑 (opens new window)
上次更新: 2021/12/20, 09:41:36
『MySQL5.7』创建用户并授权

『MySQL5.7』创建用户并授权→

最近更新
01
『MySQL5.7』创建用户并授权
09-07
02
当『Emby、Plex、Jellyfin』遇上『阿里云盘』🎬
08-17
03
当『Infuse』遇上『阿里云盘』 🚀
08-17
更多文章>
Theme by Vdoing | Copyright © 2020-2022 Kimen Tang | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式