[My SQL] 全文本搜索
全文本搜索不同于通配符和正则表达式搜索,它使用索引进行搜索,相比于前两者更高效,结果更加智能。
之前已经了解过,对于最常见的两种引擎MyISAM和InnoDB来说,前者支持全文本搜索,而后者不支持。
为了支持全文本搜索,必须定义被索引的列。一般在创建表时启用全文本搜索。
我们假设要创建一个productnotes的表:
在这张表的定义中,我们使用FULLTEXT(note_text)定义了被索引的列为note_text,注意引擎一定要选择支持全文本操作的MyISAM。
表的内容如下:
定义了全文本搜索之后,无论后续表会进行插入、更新或者删除,note_text这一列都会进行自动的索引。
在建立索引之后,使用Match()和Aganist()来进行全文本搜索,Match()指定被搜索的列,Aganist()指定要搜索的表达式。
如我们要索引note_text列包含rabbit的行:
结果返回了包含rabbit的两行数据,并且是有序输出。
传递给Match的值必须是定义的索引列,且全文本搜索是不区分大小写的,使用rabbit也可以搜索到RAbbit。
使用查询扩展
查询扩展可以搜索到更多的行,甚至这些行不包含rabbit。
可以看到使用了WITH QUERY EXPANSION的全文本搜索,输出了6行数据,首先前两行是包含rabbit的行,其他都是包含了前两行中其他词的行。
布尔文本搜索
全文本搜索的另一种方式是布尔文本搜索,常用的布尔操作符如下:
搜索包含rabbit和bait的行:
搜索包含rabbit bait这个短语的行:
搜索rabbit和carrot,增加前者等级,降低后者等级:
使用全文本搜索的几个说明:
50%规则:如果表的行数少于三行,则全文本搜索不返回结果;
单引号:忽略词中的单引号,don't的索引为dont;