MyISAM支持全文搜索,而InnoDB在MySQL 5.6.4开始支持。
性能,通配符和正则表达式匹配通常要求MySQL尝试匹配表中所有行(而且这些搜索极少使用表索引)
在使用全文本搜索时,MySQL不需要分别查看每个行,不需要分别分析和处理每个词。MySQL创建指定列中各词的一个索引,搜索可以针对这些词进行。MySQL可以快速有效地决定哪些词匹配(哪些行包含它们),哪些词不匹配,它们匹配的频率。
在索引之后,SELECT可与Match()和Against()一起使用以实际执行搜索。
启用全文本搜索支持
使用FULLTEXT指示对它进行索引,FULLTEXT可以索引单个列,也可以指定多个列。
在定义之后,MySQL自动维护该索引。在增加、更新或删除行时,索引随之自动更新。
可以在创建表时指定FULLTEXT,或者在稍后指定(这种情况下所有已有数据必须立即索引)
不要在导入数据时使用FULLTEXT
应该先导入所有数据,然后修改表定义FULLTEXT,有助于更快导入数据。
创建全文搜索的表
CREATE TABLE productontes (
note_id INT NOT NULL AUTO_INCREMENT,
prod_id CHAR (10) NOT NULL,
note_date datetime NOT NULL,
note_text text NULL,
PRIMARY KEY (note_id),
FULLTEXT (note_text)
) ENGINE = MyISAM;
进行全文本搜索
在索引之后,使用两个函数Match()和Against()指定要使用的搜索表达式。
其中Match()指定被搜索的列,Against()指定要使用的搜索表达式。
SELECT
note_text
FROM
productnotes
WHERE
MATCH (note_text) AGAINST ('rabbit');
传递给Match()的值必须与FULLTEXT()定义中的相同。如果指定多个列,则必须列出它们(并且次序正确)
搜索不区分大小写
除非是用BINARY方式,否则全文本搜索不区分大小写。
全文本搜索排序
全文本搜索的一个重要部分就是对结果排序。具有较高的行先返回
SELECT
note_text,
MATCH (note_text) AGAINST ('rabbit') AS rank
FROM
productnotes;
等级由MySQL根据行中词的数目、唯一词的数目、整个索引词的总数以及包含该词的行的数目的计算出来。
排序多个搜索项,如果指定多个搜索项,则包含多数匹配词的那些行将具有比包含较少词(或仅有一个匹配)的那些行高的等级。
让MySQL支持中文全文搜索
MySQL自带的ngram插件,用于支持中文、日语、韩语全文搜索,ngram在MySQL 5.7.6中引入。
创建表:
CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body) WITH PARSER ngram
) ENGINE=InnoDB CHARACTER SET utf8mb4;
或者修改表
ALTER TABLE articles ADD FULLTEXT INDEX ft_index (title,body) WITH PARSER ngram;
官网教程:https://dev.mysql.com/doc/refman/5.7/en/fulltext-search-ngram.html