译自MySQL8官方文档 12.9 全文搜索功能
作者:谎言诞行    发布时间:2024年02月03日

前言

最近在学习和了解 MySQL 8 自带的全文搜索功能。自己在看资料的时候顺便翻译了一下,希望对大家有用。(章节序号可能有所差异,因为官方文档会不定期更新)

官方原文链接如下:《Full-Text Search Functions》


相关章节链接:

《12.9.1 自然语言全文搜索》

《12.9.2 布尔全文搜索》

《12.9.3 具有查询扩展功能的全文搜索》

《12.9.4 全文搜索的停用字》

《12.9.5 全文搜素的约束》

《12.9.6 微调 MySQL 全文搜索》

《12.9.7 为全文索引添加用户自定义排序规则》

《12.9.8 ngram 全文解析器》

《12.9.9 MeCab 全文解析器插件》


全文搜索语法模板

MATCH (col1,col2,...) AGAINST (expr [search_modifier])

search_modifier:
  {
       IN NATURAL LANGUAGE MODE
     | IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION
     | IN BOOLEAN MODE
     | WITH QUERY EXPANSION
  }


MySQL 支持全文索引和搜索:

  • MySQL中的全文索引是 FULLTEXT 类型的索引。

  • 全文索引只能用在 InnoDB 或者 MyISAM 类型的表上, 并且只能在 CHARVARCHAR, 或者 TEXT 类型的列上创建。

  • MySQL 提供一个内置全文解析器 ngram,它支持中文,日文, 和韩文 (CJK), 并且提供一个可安装的日文全文解析插件 MeCab。 分析的差异概述如下“章节 《12.9.8 ngram 全文解析器》”, 和 章节”12.9.9 MeCab 全文解析器插件》“。

  • 创建表时,可以在 CREATE TABLE 语句中给出 FULLTEXT 索引定义,也可以在以后使用 ALTER TABLE 或 CREATE INDEX 添加。

  • 对于大型数据集,将数据加载到没有 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 BY 子句中。

  • 查询块包含一个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');

允许在 WHERE 子句中使用带有汇总列的MATCH()。


全文搜索有三种类型:

  • 自然语言搜索,将搜索字符串解释为自然人类语言中的短语(自由文本中的短语)。除了双引号 (“) 字符外,没有特殊运算符。停用字列表适用。有关停用字列表的更多信息,请参阅 《12.9.4, 全文搜索的停用字》。如果搜索附带IN NATURAL LANGUAGE MODE 修饰符或者不带任何修饰符,则以自然语言模式执行全文搜索。更多信息,请参阅 章节 《12.9.1 自然语言全文搜索》

  • 布尔搜索,使用特殊查询语言的规则解释搜索字符串。该字符串包含要搜索的单词。它还可以包含指定要求的运算符,以便单词在匹配行中必须存在或不存在,或者它的权重应高于或低于平时。某些常用词(非索引词)会从搜索索引中省略,如果搜索字符串中存在,则不匹配。使用 IN BOOLEAN MODE 修饰符来执行一个布尔搜索。更多信息,请参阅 章节 《12.9.2 布尔全文搜索》

  • 查询扩展搜索,是对自然语言搜索的修改。搜索字符串用于执行自然语言搜索。然后,将搜索返回的最相关行中的单词添加到搜索字符串中,并再次完成搜索。该查询返回第二次搜索的行。IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION 或者WITH QUERY EXPANSION 修饰符指定查询扩展搜索。更多信息,请参阅 章节 《12.9.3 具有查询扩展功能的全文搜索》


有关 FULLTEXT 查询性能的信息,请参阅 “列索引”

有关 InnoDB FULLTEXT 索引的更多信息,请参阅 《InnoDB 全文索引》

全文搜索的约束信息在《章节12.9.5 全文搜索的约束》

myisam_ftdump实用工具转储 MyISAM 全文索引的内容。这可能有助于调试全文查询。请参阅 《myisam_ftdump — 显示全文索引信息》

填写一种颜色的字符(不区分大小写),1分钟有效,点击图片刷新