MyISAM引擎支持全文本搜索,InnoDB不支持全文本搜索。
之前学习的通配符和正则表达式匹配通常需要MySQL尝试匹配表中的所有行,非常耗时;很难控制匹配什么和不匹配什么;不能提供一种智能化的选择结果的方法。
-
启动全文本搜索支持
CREATE TABLE productnoted ( node_id int NOT NULL AUTO_INCREMENT, prod_id char(10) NOT NULL, note_data datetime NOT NULL, note_text text NULL, PRIMARY KEY(note_id), FULLTEXT(note_text) )ENGINE=MyISAM;
为了进行全文本搜索,MySQL根据FULLTEXT(note_text)的指示对它进行索引,在定义之后MySQL自动维护该索引,在增删改时,索引随之自动更新。
可以在创建表时指定FULLTEXT,也可以在之后指定。不要在导入数据时使用FULLTEXT,先导入后修改表。
-
进行全文本搜索
在索引之后使用Match()和Against()函数执行全文本搜索。
-
Match()指定被搜索的列
-
Against()指定要使用的搜索表达式
SELECT note_text FROM productnoted WHERE Match(note_text) Against('rabbit'); #此SELECT语句能够检索单个列note_text,通过Against函数指定'rabbit'作为搜索文本,含有该文本的行将被返回/不区分大小写
-
-
使用查询扩展
查询扩展用来设法放宽所返回的全文本搜索结果的范围,比如查找与某个词有关的其他行。需要对数据和索引进行两遍扫描
- 1、进行一个基本的全文本扫描,找出与搜索条件匹配的所有行
- 2、检查这些匹配并选择所有的词
- 3、再次进行全文本搜索,原来的条件加上步骤2的所有有用的词
#下边例子值返回一行包含词'rabbit' SELECT note_text FROM productnoted WHERE Match(note_text) Against('rabbit'); #使用查询扩展,在要查找的词后+WITH QUERY EXPANSION SELECT note_text FROM productnoted WHERE Match(note_text) Against('rabbit' WITH QUERY EXPANSION);
-
布尔文本搜索
支持全文本搜索的另外一种形式,布尔方式,没有FULLTEXT索引也可以使用,可以提供关于如下内容的细节:
-
要匹配的词
#在note_text列检索包含词rabbit的所有行,结果与没有指定布尔操作相同 SELECT note_text FROM productnoted WHERE Match(note_text) Against('rabbit' IN BOOLEAN MODE); #这个搜索匹配包含词rebbit和bait的行 SELECT note_text FROM productnoted WHERE Match(note_text) Against('+rabbit +bait' IN BOOLEAN MODE); #这个搜索匹配包含两个词至少一个的行 SELECT note_text FROM productnoted WHERE Match(note_text) Against('rabbit bait' IN BOOLEAN MODE); #这个搜索匹配短语 rabbit bait SELECT note_text FROM productnoted WHERE Match(note_text) Against('"rabbit bait"' IN BOOLEAN MODE);
-
要排斥的词
#匹配包含rabbit但不包含任何以rope开头的词的行。 SELECT note_text FROM productnoted WHERE Match(note_text) Against('rabbit -rope*' IN BOOLEAN MODE);
-
排列提醒,指定优先级更高的词
#这个搜索匹配rabbit和bait,增加前者的等级,降低后者的等级 SELECT note_text FROM productnoted WHERE Match(note_text) Against('>rabbit <bait' IN BOOLEAN MODE); #这个搜索匹配rabbit和bait,降低后者的等级 SELECT note_text FROM productnoted WHERE Match(note_text) Against('+rabbit +(<bait)' IN BOOLEAN MODE);
-
表达式分组
-
另外一些内容
-