search_modifier:
IN NATURAL LANGUAGE MODE
| IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION
| IN BOOLEAN MODE
| WITH QUERY EXPANSION
MySQL 支持全文索引和搜索:
MySQL 中的全文索引是 类型的索引
FULLTEXT。
全文索引只能用于
InnoDB或
MyISAM表,并且只能为CHAR、
VARCHAR或
TEXT列创建。
MySQL 提供了一个内置的支持中文、日语和韩语 (CJK) 的全文 ngram 解析器,以及一个可安装的用于日语的 MeCab 全文解析器插件。解析差异在第 12.10.8 节“ngram 全文解析器”和
第 12.10.9 节“MeCab 全文解析器插件”中进行了概述。
FULLTEXT对于大型数据集,将数据加载到没有索引的表中然后创建索引比将数据加载到具有现有索引的表中
要快得多FULLTEXT。
全文搜索是使用
MATCH() AGAINST()语法执行的。
MATCH()采用逗号分隔的列表来命名要搜索的列。
AGAINST接受一个要搜索的字符串,以及一个可选的修饰符,指示要执行的搜索类型。搜索字符串必须是在查询评估期间保持不变的字符串值。例如,这排除了表列,因为每行可能不同。
以前,MySQL 允许使用带有 的汇总列
MATCH(),但使用此构造的查询执行不佳且结果不可靠。(这是因为它MATCH()不是作为其参数的函数实现的,而是作为基表的基础扫描中当前行的行 ID 的函数实现的。)从 MySQL 8.0.28 开始,MySQL 没有不再允许此类查询;更具体地说,任何符合此处列出的所有条件的查询都会被拒绝
ER_FULLTEXT_WITH_ROLLUP:
MATCH()出现在
的SELECT列表、GROUP BY
子句、HAVING子句或子句中。ORDER
查询块包含一个GROUP BY ... WITH
ROLLUP子句。
函数调用的参数MATCH()
是分组列之一。
此处显示了此类查询的一些示例:
# MATCH() in SELECT list...
SELECT MATCH (a) AGAINST ('abc') FROM t GROUP BY a WITH ROLLUP;
SELECT 1 FROM t GROUP BY a, MATCH (a) AGAINST ('abc') WITH ROLLUP;
# ...in HAVING clause...
SELECT 1 FROM t GROUP BY a WITH ROLLUP HAVING MATCH (a) AGAINST ('abc');
# ...and in ORDER BY clause
SELECT 1 FROM t GROUP BY a WITH ROLLUP ORDER BY MATCH (a) AGAINST ('abc');