mysql之全文索引

q1871901600 发布于 2024-11-04 20 次阅读


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:同上。
一个会写python的Java工程师
最后更新于 2024-11-04