InnoDB不支持全文本搜索,而MyISAM支持全文本搜索。
全文本搜索的优点:
在使用全文本搜索的时候,MySQL不需要分别查看每一行的,不需要分别分析和处理每个词。MySQL只需要创建指定列中的各词的一个索引,搜索就可以针对这些词进行了。这样MySQL可以快速有效的决定哪些词匹配哪些词不匹配以及匹配的频率是多少?
如何使用全文本搜索:
首先索引被搜索的列,而且根据数据改变不断的重新索引。在对表列中进行适当的设计后,MySQL会自动进行索引和重新索引。再配合着Match()和Against()函数一起使用。
例子:创建索引
CREATE TABLE productnotes
(
note_id int NOT NULL AUTO_INCRMENT,
prod_id char(10) NOT NULL,
note_data datetime NOT NULL,
note_text text NULL,
PRIMARY KEY(note_id),
FULLTEXT(note_text)
)ENGING=MyISAM;
CREAT TABLE定义了productnotes并列出它所包含的列。有一个note_text列,进行全文本搜索时,MySQL根据子句FULLTEXT(note_text)的指示对它进行索引。这里的FULLTEXT索引单个列,也可以索引多个列。且定义之后MySQL会自动的维护索引。增、改、删索引可以随之自动更新。
注意:不要在导入数据的时候使用FULLTEXT,在导入数据时应该先导入数据到一个新表中之后再启用FULLTEXT索引。
进行全文本搜索:使用Match()指定被搜索的列,Against()指定要使用的搜索表达式
例子:
SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('rabbit');
SELECT检索note_text列,用于WHERE子句使用Match(note_text)指定列进行全文本搜索,用Against('rabbot')作为搜索词并返回包含搜索词的行。
注意:搜索不区分大小写,如果想区分加上BINARY关键字
特殊要求:当需要查询一个包含“anvils"词的注释,还要查询与此注释相关的行。
技术:使用查询扩展来完成此要求
例子
SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('rabbit' WITH QUERY EXPANSION);
查询扩展后,带有"anvils"的行在最前面,后面是包含此次的句子中其他词的行也被索引出来。