# 12.10 全文搜索功能

12.10.1 自然语言全文搜索

12.10.2 布尔全文搜索

12.10.3 带有查询扩展的全文搜索

12.10.4 全文停用词

12.10.5 全文限制

12.10.6 微调 MySQL 全文搜索

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

12.10.8 ngram 全文解析器

12.10.9 MeCab 全文解析器插件

匹配 (*col1*,*col2*,...) 反对 (*表达式* [*搜索修饰符*])

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

MySQL 支持全文索引和搜索:

  • MySQL 中的全文索引是一种类型的索引全文.

  • 全文索引只能与InnoDB要么MyISAM表,并且只能为字符,VARCHAR, 要么文本列。

  • MySQL 提供了一个内置的全文 ngram 解析器,它支持中文、日文和韩文 (CJK),以及一个可安装的日文 MeCab 全文解析器插件。解析差异在第 12.10.8 节,“ngram 全文解析器”, 和第 12.10.9 节,“MeCab 全文解析器插件”.

  • 一种全文索引定义可以在创建表创建表时的语句,或稍后使用更改表要么创建索引.

  • 对于大型数据集,将数据加载到没有数据的表中要快得多全文索引,然后创建索引,而不是将数据加载到现有的表中全文指数。

    全文搜索使用匹配()对()句法。匹配()接受一个以逗号分隔的列表来命名要搜索的列。反对接受一个要搜索的字符串和一个可选的修饰符,指示要执行的搜索类型。搜索字符串必须是在查询评估期间保持不变的字符串值。例如,这排除了表格列,因为每行可能不同。

    以前,MySQL 允许使用汇总列匹配(),但使用此构造的查询性能不佳且结果不可靠。(这是因为匹配()不是作为其参数的函数,而是作为基表底层扫描中当前行的行 ID 的函数。)从 MySQL 8.0.28 开始,MySQL 不再允许此类查询;更具体地说,任何匹配此处列出的所有条件的查询都会被拒绝ER_FULLTEXT_WITH_ROLLUP (opens new window)

  • 匹配()出现在选择列表,通过...分组条款,拥有条款,或订购方式查询块的子句。

  • 查询块包含一个GROUP BY ... 与汇总条款。

  • 调用的参数匹配()函数是分组列之一。

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

# 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');

使用匹配()哪里条款是允许的。

全文搜索有三种类型:

  • 自然语言搜索将搜索字符串解释为自然人类语言中的短语(自由文本中的短语)。除双引号(“)字符外,没有特殊运算符。停止字列表适用。有关停止字列表的更多信息,请参阅第12.10.4节,“全文停止语”.

    如果在自然语言模式下修改器已给出,或者如果未给出修改器。有关更多信息,请参阅第12.10.1节,“自然语言全文搜索”.

  • 布尔搜索使用特殊查询语言的规则解释搜索字符串。字符串包含要搜索的单词。它还可以包含一些操作符,这些操作符指定了一些要求,比如一个单词在匹配行中必须存在或不存在,或者它的权重应该高于或低于通常的值。某些常用词(stopwords)从搜索索引中省略,如果搜索字符串中存在,则不匹配。这个在布尔模式下修饰符指定布尔搜索。有关更多信息,请参阅第12.10.2节,“布尔全文搜索”.

  • 查询扩展搜索是对自然语言搜索的修改。搜索字符串用于执行自然语言搜索。然后,将搜索返回的最相关行中的单词添加到搜索字符串中,然后再次执行搜索。查询返回第二次搜索的行。这个在具有查询扩展的自然语言模式下使用查询扩展修饰符指定查询扩展搜索。有关更多信息,请参阅第12.10.3节,“带查询扩展的全文搜索”.

    有关全文查询性能,请参阅第8.3.5节,“列索引”.

    有关InnoDB 全文索引,参见第15.6.2.4节,“InnoDB全文索引”.

    中列出了全文搜索的限制条件第12.10.5节,“全文限制”.

    这个存储引擎_ftdump实用程序转储米萨姆全文索引。这可能有助于调试全文查询。看见第4.6.3节,“myisam_ftdump-显示全文索引信息“.