
文
本
检
索

通配符(wildcard):用来匹配属性或属性值的一部分的特殊字符
正则表达式(regular expression):用来匹配文本的特殊字符串
全文本搜索(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" 的产品信息:
WHERE prod_name LIKE "%ton anvil"; # 字符串必须使用引号括起来

WHERE prod_name LIKE "_ ton anvil";

注意辨析两者的不同哦!


MySQL正则表达式





| 元字符 | 含义 | 匹配示例 |
| * | 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' |

| 元字符 | 含义 |
| ^ | 文本的开始 |
| $ | 文本的末尾 |
| [[:<:]] | 词的开始 |
| [[:>:]] | 词的结尾 |

| 类 | 说明 | 等价于 |
| [: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)'的产品信息
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以外的所有字符,用在[]外面时指字符串的开始位置。



全文本搜索



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



SELECT note_text
FROM productnotes # 包含短语rabbit bait且不包含rope, ropes...的产品注释





本期要点



文本检索的三大工具:
通配符(LIKE, %, _, *)
正则表达式(REGEXP)
全文本搜索(Match(),Against())











