暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

(四)数据库 | 文本检索之通配符、正则表达式与全文本搜索

统计美学 2021-09-17
420

 本 



1

通配符(wildcard):用来匹配属性或属性值的一部分的特殊字符

2

正则表达式(regular expression):用来匹配文本的特殊字符串

3

全文本搜索(full-text search):提供了一种更加智能的文本检索方式!



通配符与搜索模式





”通配符“与LIKE操作符组成了最基本的文本匹配方式:

1、百分号(%):表任意串长字符串,需搭配LIKE操作符使用;

2、下划线(_):表任意单个字符,需搭配LIKE操作符使用;

3、星号(*):表所有属性,用于查询所有字段。





搜索模式(search pattern):由指定字符或字符串和通配符共同构成的文本匹配样式,搜索模式与LIKE操作符共同构成了用于文本匹配的检索条件。


注意


1、通配符匹配文本时默认不区分大小写,可以更改此设置;

2、百分号(%)通配符虽然可以匹配任意串长的字符串,但它不能匹配NULL值,因为NULL值不是字符串!如果想要在结果中包含NULL值的行,可以在WHERE子句中加入OR IS NULL即可;

3、通配符是一种极为重要且有送的工具,但其执行效率较低,所以不要过度使用通配符,最好不要将它放在搜索模式的开始处!


检索示例1



1、查询产品名称形如 "%ton anvil" 的产品信息

SELECT * FROM products

WHERE prod_name LIKE "%ton anvil";  # 字符串必须使用引号括起来

2、查询产品名称形如"_ ton anvil"的产品信息:
SELECT * FROM products

WHERE prod_name LIKE "_ ton anvil";





注意辨析两者的不同哦!



MySQL正则表达式





1、正则表达式是由正则表达式语言建立的文本匹配样式,通常由正则表达式语言中的特殊符号(".","|","-","...)与指定字符或字符串共同组成,正则表达式与关键字REGEXP共同构成用于文本匹配的检索条件。


2、正则表达式中常用的特殊符号的含义与用法:
'.':匹配任意单个字符,含义同通配符'_';
'|':OR逻辑操作符,匹配两个字符串之一;
'[]':匹配几个字符之一,如[abc]表示匹配a或b或c;
'^':NOT逻辑操作符,如[^a]匹配除a外的任意单个字符;
'-':简化指定的匹配范围,如[0-9]等价于[0123456789];
'\\':转义字符,用于特殊符号的转义,消除其特殊含义,如当匹配'\'时则需进行转义'\\\',同时\\也用来引用元字符,为元字符加上特殊含义,如'\\n'表示换行、'\\t'表示制表。



3、特殊字符之重复元字符,用于指定其前任意单个字符出现次数:
重复元字符
元字符
含义匹配示例
*
0个或多个字符
'sticks*': 'stick', 'sticks', 'stickss'...
+
1个或多个字符
'sticks+': 'sticks', 'stickss'...
?
0个或1个字符
'sticks?': 'stick', 'sticks'
{n}
n个字符
'sticks{4}': 'stickssss'
{n,}
至少n个字符
'sticks{3}': 'sticksss', 'stickssss'...
{n,m}
指定字符数范围
'sticks{3,4}': 'sticksss', 'stickssss'


4、特殊字符之定位元字符,用于指定正则表达式的匹配位置:
定位元字符
元字符
含义
^
文本的开始
$
文本的末尾
[[:<:]]
词的开始
[[:>:]]
词的结尾


5、正则表达式之字符类(character class),定义了数字、字母等常用匹配集合,可以用于简化特殊符号'[]'的使用:
字符类

说明
等价于
[:alnum:]
任意字母和数字
[a-zA-Z0-9]
[:alpha:]
任意字母
[a-zA-Z]
[:blank:]
空格和制表
[\\n\\t]
[:digit:]任意数字[0-9]
[:lower:]
任意小写字母
[a-z]
[:upper:]
任意大写字母
[A-Z]
[:print:]
任意可打印字符NULL
[:cntrl:]
ASCII控制字符
NULL
[:space:]
任意含空格的空白字符[\\f\\n\\r\\t\\v]




【注意】为了防止产生歧义,我们通常将由通配符和指定字符(串)所构成的文本匹配样式称为“搜索模式”,将由正则表达式语言所建立的文本匹配样式称为“正则表达式”。



检索示例2


3、查询产品名形如'(0 stick)'或'(1 sticks)'的产品信息

SELECT prod_id, prod_name

FROM products

WHERE prod_name REGEXP '\\([:digit:] sticks?\\)'

ORDER BY prod_name;


4、查询以数字或小数点开头的产品名称的产品信息

SELECT prod_id, prod_name

FROM products

WHERE prod_name REGEXP '^[0-9\\.]'

ORDER BY prod_name;


注意


元字符'^'由两种用法,用在[]里面时表示否定该集合中的所有元素([]里面),如[^abc]表示除abc以外的所有字符,用在[]外面时指字符串的开始位置。



全文本搜索






全文本搜索是针对全文本数据的一种高级检索方式,通过结合函数Match()和Against()实现,前者指定被检索的列,后者指定匹配字符串。相对于使用通配符和正则表达式进行文本匹配,全文本搜索具有如下几个有点:

1、性能较强,它对于指定列进行了索引;

2、精确控制,能够精确指定文本中需要包含那些词、不需要包含哪些词;

3、智能返回,通过计算用于匹配的指定字符串的出现次数、位置等信息,对检索结果进行重要性排序。


查询扩展


1、作用:能够放宽全文本搜索返回结果的范围,即使列属性值并不精确包含指定的匹配字符串;

2、原理:首先使用全文本搜索返回结果中所有“有意义”的词,然后将这些词作为匹配字符串再次进行全文本搜索;

3、操作:在匹配字符串后面使用WITH QUERY EXPANSION 关键字进行声明即可启用查询扩展,就像这样:

WHERE Match(note_text) Against("anvils" WITH 

QUERY EXPANSION);


布尔文本搜索


布尔模式是全文本搜索的一种进阶形式,只需要在匹配字符串的后面进行声明(IN BOOLEAN MODE)即可启用布尔文本搜索模式。他能方便的指定包含那些词、不包含那些词,甚至能够指定各个词的重要程度。


为了实现布尔文本搜索,需要借助布尔文本搜索操作符以和指定匹配字符串构成搜索模式,简单理解:布尔模式=全文本搜索+操作符+声明!

布尔文本搜索操作符
操作符
含义
+
必须包含该词:+rabbit
-排除某个词:-rabbit
<
包含且降低等级值:<carrot
>
包含且提高等级值:>rabbit
()
把词和操作符组成子表达式,将它们作为一个整体:(>rabbit)
~
取消一个词的排序等级值: ~rabbit
*
词尾通配符:
""定义一个短语,将它们作为一个整体


注意


1、无词分隔符(如英语中的空格)的语言无法恰当地返回全文本搜索结果,如汉语、日语等;

2、InnoDB(一种数据库引擎)不支持全文本搜索,若需要使用全文本搜索,必须在建表时将其引擎指定为MyISAM。

检索示例3


5、全文本搜索:
SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('rabbit');

6、查询扩展:
SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('rabbit' WITH QUERY EXPANSION);


7、布尔文本搜索:

SELECT note_text

FROM productnotes # 包含词rabbit和carrot的产品注释,并降低carrot等级值
WHERE Match(note_text) Against('+rabbit +(<carrot)' IN BOOLEAN MODE);
SELECT note_text
FROM productnotes # 包含短语rabbit bait且不包含rope, ropes...的产品注释
WHERE Match(note_text) Against('"rabbit bait" -rope*' IN BOOLEAN MODE);


END


本期要点

文本检索的三大工具:

通配符(LIKE, %, _, *)

正则表达式(REGEXP)

全文本搜索(Match(),Against())




文章转载自统计美学,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论