MySQL 5.6 以前的版本,只有 MyISAM 存储引擎支持全文索引。从InnoDB 1.2.x版本开始,InnoDB存储引擎开始支持全文检索,对应的MySQL版本是5.6.x系列。
注意,不管什么引擎,只有字段的数据类型为 char、varchar、text 及其系列才可以建全文索引。
不过MySQL从设计之初就是关系型数据库,存储引擎虽然支持全文检索,整体架构上对全文检索支持并不好而且限制很多,比如每张表只能有一个全文检索的索引,不支持没有单词界定符( delimiter)的语言,如中文、日语、韩语等。
所以如果有大批量或者专门的全文检索需求,还是应该选择专门的全文检索引擎,毕竟Elastic靠着全文检索起家,然后产品化、公司化后依赖全文检索不断扩充产品线和应用场景,并推出商业版本的解决方案然后融资上市,现在的市值已达100亿美元(2021/12/06 -纽约证券交易所中的市值101.5亿美元)。
具体如何使用InnoDB存储引擎的全文检索,只提供简单的使用说明,更多的详情请自行查阅相关官方文档或者书籍,我们不做任何技术支持。官方文档路径:https://dev.mysql.com/doc/refman/8.0/en/fulltext-search.html
创建
创建表时创建全文索引
create table fulltext_test (
id int(11) NOT NULL AUTO_INCREMENT,
content text NOT NULL,
tag varchar(255),
PRIMARY KEY (id),
FULLTEXT KEY content_tag_fulltext(content,tag)
) DEFAULT CHARSET=utf8;
在已存在的表上创建全文索引
create fulltext index content_tag_fulltext
on fulltext_test(content,tag);
通过 SQL 语句 ALTER TABLE 创建全文索引
alter table fulltext_test
add fulltext index content_tag_fulltext(content,tag);
使用全文索引
和常用的模糊匹配使用 like + % 不同,全文索引有自己的语法格式,使用 match 和 against 关键字,比如
select * from fulltext_test
where match(content,tag) against('xxx xxx');
MATCH() 函数:
用途:用于指定要进行全文搜索的列。
语法:MATCH(column1, column2, ... IN BOOLEAN MODE) AGAINST ('search_string' IN BOOLEAN MODE | IN NATURAL LANGUAGE MODE | WITH QUERY EXPANSION)
参数:
column1, column2, ...:要搜索的列名。
'search_string':要搜索的文本字符串。
IN BOOLEAN MODE:使用布尔模式进行全文搜索,其中AND、OR、NOT等逻辑操作符可以被识别。
IN NATURAL LANGUAGE MODE:使用自然语言模式进行全文搜索,可以识别同义词和短语。
WITH QUERY EXPANSION:在搜索结果中包含与原始查询相关的扩展词。
AGAINST() 函数:
用途:用于指定要搜索的文本字符串,并定义搜索模式。
语法:'search_string' IN BOOLEAN MODE | IN NATURAL LANGUAGE MODE | WITH QUERY EXPANSION
参数:
'search_string':要搜索的文本字符串。
IN BOOLEAN MODE:同上。
IN NATURAL LANGUAGE MODE:同上。
WITH QUERY EXPANSION:同上。
Comments NOTHING