并非所有的引擎都支持全文本搜索,MySQL支持几种基本的数据库引擎。两个最常使用的引擎为MyISAM和InnoDB。前者支持全文本搜索,而后者不支持。
使用正则表达式的搜索机制的几个重要的限制:
1)性能:通配符和正则表达式匹配通常要求MySQL尝试匹配表中所有行(而且这些搜索极少使用表索引)。因此,由于被搜索的行不断递增,这些搜索可能非常耗时。
2)明确控制:使用通配符和正则表达式匹配很难(而且并不总是能)明确地控制匹配什么和不匹配什么。
3)智能化的结果:虽然基于通配符和正则表达式的搜索提供了非常灵活的搜索,但它们都不能提供一种智能化的选择结果的方法。例如,一个特殊词的搜索将会返回包含该词的所有行,而不区分包含单个匹配的行和包含多个匹配的行(按照可能是更好的匹配来排列它们)。类似,一个特殊词的搜索将不会找出不包含该词但包含其他相关词的行。
更新索引是要花时间,虽然不很多,但毕竟要花时间。如果正在导入数据到一个新表,此时不应该启用fulltext索引。应该首先导入所有数据,然后再修改表,定义fulltext。这样有助于更快地导入数据(而且使索引数据的总时间小于在导入每行时分别进行索引所需的总时间)。
在索引之后,使用两个函数Match()和Against()执行全文本搜索,其中的Match()指定被搜索的列,Against()指定要使用的搜索表达式。传递给Match()的值必须与fulltext()定义中的相同,如果指定多个列,则必须列出它们(而且次序要正确)。除非不适用binary方式,否则全文本搜索不区分大小写。全文本搜索的一个重要部分就是对结果排序。具有较高等级的行先返回(因为这些行很可能是你真正想要的行)。如果指定多个搜索项,则包含多数匹配词的那些行具有比包含较少词(或仅有一个匹配)的那些行高的等级值。
查询扩展用来设法放宽所返回的全文本搜索结果的范围。在使用查询扩展时,MySQL对数据和索引进行两遍扫描来完成搜索。首先,进行一个基本的全文本搜索,找出与搜索条件匹配的所有行。其次,MySQL检查这些匹配行并选择所有有用的词。再其次,MySQL再次进行全文本搜索,这次不仅适用原来的条件,而且还使用所有用的词。注意,查询扩展功能是在MySQL 4.1.1中引入的,因此不能用于之前的版本。表中的行越多(这些行中的文本越多),使用查询扩展返回的结果越好。
MySQL支持全文本搜索的另外一种形式称为布尔方式。以布尔方式可以提供关于如下内容的细节:
1)要匹配的词。
2)要排斥的词(如果某行包含这个词,则不返回改行,即使它包含其他指定的词也是如此)。
3)排列提示(指定某些词比其他词更重要,更重要的词等级跟高)。
4)表达式分组。
5)另外一些内容。
布尔方式不同于迄今使用的全文本搜索语法的地方在于,即使没有定义fulltext索引,也可以使用它。但这是一种非常缓慢的操作(其性能将随着数据的增加而降低)。
全文本布尔操作符如下:
在布尔排序中,不按等级值降序排序返回的行。
关于全文本搜索的某些重要的说明如下:
1)在索隐全文本数据时,短词被忽略且从索引中排除。短词定义为那些具有3个或3个以下字符的词(如果需要,这个数目可以更改)。
2)MySQL带有一个内建的非用词列表。这些词在索引全文数据时总是被忽略。如果需要,可以覆盖这个列表。
3)许多词出现的频率很高,搜索它们没有用处(返回太多的结果)。因此,MySQL规定了一条50%规则。如果一个词出现在50%以上的行中,则将它作为一个非用词忽略。50%规则不用于in Boolean mode。
4)如果表中的行数少于3行,则全文本搜索不返回结果(因为每个词要么不出现,要么至少出现在50%的行中)。
5)忽略词中的单引号。
6)不具有词分隔符(如日语和汉语)的语言不能恰当地返回全文本搜索结果。
7)仅在MyISAM数据引擎中支持全文本搜索。
邻近搜索是许多全文本搜索支持的一个特性,它能搜索相邻的词(在相同的句子中、相同的段落中或者在特定数目的词的部分中,等等)。MySQL全文本搜索现在还不支持邻近操作符。