MySQL系列(32):全文搜索功能
MySQL 中的全文索引的索引类型是 FULLTEXT 。
MySQL 的全文索引只能用于 InnoDB 或 MyISAM 表,并且只能为 CHAR、VARCHAR 或 TEXT 列创建。
全文索引
MySQL 全文索引搜索语法:[MATCH (col1,col2,...) AGAINST (expr [search_modifier])
1 | search_modifier: |
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 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() 函数的参数是分组列之一。
以下显示了此类查询的一些示例:
1 | # MATCH() in SELECT list... |
允许在 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 EXPANSION
或WITH 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 全文解析器插件)