如何通过sql实现一个简单搜索引擎
# 需求分析
通过搜索商品的标题关键词搜索出对应的所有商品,比如输入Cat
可以查询标题中包含Cat
(不区分大小写)的所有商品:
# 实现1.0版本
看到这个需求首先能想到的就是使用数据库的like,模糊匹配关键词
SELECT
*
FROM
tbl_product
WHERE
title LIKE '%cat%';
1
2
3
4
5
6
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
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