Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  Functions and Operators  /  Full-Text Search Functions

14.9 全文搜索函数

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 的索引。

  • 全文索引只能与InnoDBMyISAM表一起使用,并且只能在CHARVARCHARTEXT列上创建。

  • MySQL提供了内置的全文ngram解析器,支持中文、日文和韩文(CJK),并且提供了可安装的MeCab全文解析插件用于日文。解析差异在第14.9.8节“ngram全文解析器”第14.9.9节“MeCab全文解析插件”中进行了描述。

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

  • 对于大型数据集,加载数据到没有FULLTEXT索引的表,然后创建索引后の方快捷,而不是加载数据到已经存在FULLTEXT索引的表。

全文搜索使用MATCH() AGAINST()语法。MATCH()接受一个逗号分隔的列表,指定要搜索的列。AGAINST接受一个字符串来搜索,并且可选地指定搜索类型。搜索字符串必须是一个常量字符串,在查询评估期间保持不变。这排除了例如表列,因为它可以在每行中不同。

MySQL 不允许使用MATCH()与 rollup 列;更具体地说,任何匹配以下所有条件的查询都将被拒绝,并返回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');

使用MATCH()与 rollup 列在WHERE子句中是允许的。

全文搜索有三种类型:

  • 自然语言搜索将搜索字符串解释为自然人类语言中的短语(自由文本)。除了双引号(")字符外,没有特殊操作符。stopword列表适用。关于stopword列表的更多信息,请见第14.9.4节,“Full-Text Stopwords”

    如果给定IN NATURAL LANGUAGE MODE修饰符或没有修饰符,全文搜索都是自然语言搜索。关于更多信息,请见第14.9.1节,“Natural Language Full-Text Searches”

  • 布尔搜索将搜索字符串解释为特殊查询语言的规则。字符串包含要搜索的单词。它也可以包含操作符,以指定必须在匹配行中存在或不存在的单词,或者将其权重设置为高或低。某些常见单词(stopwords)从搜索索引中被排除,如果出现在搜索字符串中,也不会匹配。IN BOOLEAN MODE修饰符指定布尔搜索。关于更多信息,请见第14.9.2节,“Boolean Full-Text Searches”

  • 自然语言搜索扩展是一种对自然语言搜索的修改。搜索字符串用于执行自然语言搜索,然后从最相关的行中添加词语,并再次执行搜索。查询返回第二个搜索结果的行。IN NATURAL LANGUAGE MODE WITH QUERY EXPANSIONWITH QUERY EXPANSION 修饰符指定自然语言搜索扩展。更多信息,请见第14.9.3节,“Full-Text Searches with Query Expansion”

关于FULLTEXT查询性能的信息,请见第10.3.5节,“Column Indexes”

关于InnoDB FULLTEXT索引的更多信息,请见第17.6.2.4节,“InnoDB Full-Text Indexes”

全文搜索的限制条款列表在第14.9.5节,“Full-Text Restrictions”中。

myisam_ftdump实用工具将MyISAM全文索引的内容导出。这可能对调试全文查询非常有帮助。更多信息,请见第6.6.3节,“myisam_ftdump — Display Full-Text Index information”