前言
最近在学习和了解 MySQL 8 自带的全文搜索功能。自己在看资料的时候顺便翻译了一下,希望对大家有用。(章节序号可能有所差异,因为官方文档会不定期更新)
官方原文链接如下:《Full-Text Restrictions》
仅 InnoDB 和 MyISAM 表支持全文搜索。
分区表不支持全文搜索。参阅 Restrictions and Limitations on Partitioning.
全文搜索可用于大多数多字节字符集。例外情况是,对于 Unicode,可以使用 utf8mb3 或 utf8mb4 字符集,但不能使用 ucs2 字符集。 虽然不能对 ucs2 列使用 FULLTEXT 索引,但您可以对没有此类索引的 ucs2 列执行布尔模式搜索。
utf8mb3 的备注也适用于 utf8mb4,ucs2 的备注也适用于 utf16、utf16le 和 utf32。中文和日文等表意文字没有单词分隔符。因此,内置的全文分析器无法确定这些语言和其他此类语言中单词的开头和结尾位置。
提供了支持中文、日文和韩文 (CJK) 的基于字符的 ngram 全文解析器,以及支持日语的基于单词的 MeCab 解析器插件,用于 InnoDB 和 MyISAM 表。虽然支持在单个表中使用多个字符集,但 FULLTEXT 索引中的所有列都必须使用相同的字符集和排序规则。
MATCH() 字段列表必须与表的某些 FULLTEXT 索引定义中的字段列表完全匹配,除非此 MATCH() 在 MyISAM 表上处于布尔模式。对于 MyISAM 表,可以对非索引列进行布尔模式搜索,尽管它们可能很慢。
AGAINST() 的参数必须是查询评估期间常量的字符串值。例如,这排除了表列,因为每行的表列可能不同。从 MySQL 8.0.28 开始,MATCH() 的参数不能使用汇总列。
与非 FULLTEXT 搜索相比,FULLTEXT 搜索的索引提示更受限制。参阅 Index Hints.
对于 InnoDB,所有涉及具有全文索引的列的 DML 操作(INSERT、UPDATE、DELETE)都在事务提交时进行处理。例如,对于 INSERT 操作,插入的字符串将被标记化并分解为单个单词。然后,在提交事务时,将各个单词添加到全文索引表中。因此,全文搜索仅返回提交的数据。
%”字符不是全文搜索支持的通配符。