MySQL系列(32):全文搜索功能

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

MySQL 的全文索引只能用于 InnoDB 或 MyISAM 表,并且只能为 CHAR、VARCHAR 或 TEXT 列创建。

全文索引

MySQL 全文索引搜索语法:[MATCH (col1,col2,...) AGAINST (expr [search_modifier])

1
2
3
4
5
6
7
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 全文解析器插件。解析差异在Section 12.10.8, “ngram Full-Text Parser”, 和Section 12.10.9, “MeCab Full-Text Parser Plugin中有概述。
  • 创建表时,可以在 CREATE TABLE 语句中给出 FULLTEXT 索引定义,或者稍后使用 ALTER TABLECREATE 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() 函数的参数是分组列之一。

以下显示了此类查询的一些示例:

1
2
3
4
5
6
7
8
9
# 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() 与汇总列一起使用。

全文搜索三种类型

  • 自然语言搜索:将搜索字符串解释为自然人类语言中的短语(自由文本中的短语)。 没有特殊的运算符,双引号 (“) 字符除外。停用词列表适用。有关停用词列表的更多信息,参考Section 12.10.4, “Full-Text Stopwords”.。

    如果给出了 IN NATURAL LANGUAGE MODE 修饰符或没有给出修饰符,则全文搜索是自然语言搜索。 有关详细信息,参考Section 12.10.1, “Natural Language Full-Text Searches”.。

  • 布尔搜索:使用特殊查询语言的规则解释搜索字符串。 该字符串包含要搜索的词,它还可以包含指定要求的运算符,例如匹配行中必须存在或不存在单词,或者它的权重应该比平常高或低。 某些常用词(停用词)从搜索索引中省略,如果出现在搜索字符串中则不匹配。 IN BOOLEAN MODE 修饰符指定布尔搜索。 有关详细信息,参考Section 12.10.2, “Boolean Full-Text Searches”.。

  • 查询扩展搜索:是自然语言搜索的修改。 搜索字符串用于执行自然语言搜索。 然后将搜索返回的最相关行中的词添加到搜索字符串中,然后再次进行搜索。 查询返回来自第二次搜索的行。 IN NATURAL LANGUAGE MODE WITH QUERY EXPANSIONWITH QUERY EXPANSION 修饰符指定查询扩展搜索。 有关详细信息,参考Section 12.10.3, “Full-Text Searches with Query Expansion”.

有关FULLTEXT查询性能的信息,请参考Section 8.3.5, “Column Indexes”。全文搜索限制,请参考Section 12.10.5, “Full-Text Restrictions”.

全文搜索

自然语言全文搜索

布尔全文搜索

查询扩展本文搜索

全文停用词

全文限制

微调 MySQL 全文搜索

为全文索引添加用户定义的排序规则

全文解析器

ngram 全文解析器

12.10.9 MeCab 全文解析器插件

参考

12.10.1 Natural Language Full-Text Searches(自然语言全文搜索)

12.10.2 Boolean Full-Text Searches(布尔全文搜索)

12.10.3 Full-Text Searches with Query Expansion(带查询扩展的全文搜索)

12.10.4 Full-Text Stopwords(全文停用词)

12.10.5 Full-Text Restrictions(全文限制)

12.10.6 Fine-Tuning MySQL Full-Text Search(微调MySQL全文搜索)

12.10.7 Adding a User-Defined Collation for Full-Text Indexing(为全文索引添加用户定义的排序规则)

12.10.8 ngram Full-Text Parser(ngram全文解析)

12.10.9 MeCab Full-Text Parser Plugin(MeCab 全文解析器插件)

作者

光星

发布于

2023-03-26

更新于

2023-03-28

许可协议

评论