## 12.10 全文搜索功能

[12.10.1 自然语言全文搜索](fulltext-natural-language.html)
[12.10.2 布尔全文搜索](fulltext-boolean.html)
[12.10.3 带有查询扩展的全文搜索](fulltext-query-expansion.html)
[12.10.4 全文停用词](fulltext-stopwords.html)
[12.10.5 全文限制](fulltext-restrictions.html)
[12.10.6 微调 MySQL 全文搜索](fulltext-fine-tuning.html)
[12.10.7 为全文索引添加用户定义的排序规则](full-text-adding-collation.html)
[12.10.8 ngram 全文解析器](fulltext-search-ngram.html)
[12.10.9 MeCab 全文解析器插件](fulltext-search-mecab.html)

[](<>)[](<>)[](<>)[](<>)

[](<>) [`匹配 （*`col1`*,*`col2`*，...） 反对 （*`表达式`* [*`搜索修饰符`*])`](fulltext-search.html#function_match)

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

MySQL 支持全文索引和搜索：

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

-   全文索引只能与[`InnoDB`](innodb-storage-engine.html)要么[`MyISAM`](myisam-storage-engine.html)表，并且只能为[`字符`](char.html),[`VARCHAR`](char.html)， 要么[`文本`](blob.html)列。

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

-   一种`全文`索引定义可以在[`创建表`](create-table.html)创建表时的语句，或稍后使用[`更改表`](alter-table.html)要么[`创建索引`](create-index.html).

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

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

    以前，MySQL 允许使用汇总列`匹配（）`，但使用此构造的查询性能不佳且结果不可靠。（这是因为`匹配（）`不是作为其参数的函数，而是作为基表底层扫描中当前行的行 ID 的函数。）从 MySQL 8.0.28 开始，MySQL 不再允许此类查询；更具体地说，任何匹配此处列出的所有条件的查询都会被拒绝[`ER_FULLTEXT_WITH_ROLLUP`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_fulltext_with_rollup)：

-   `匹配（）`出现在`选择`列表，`通过...分组`条款，`拥有`条款，或`订购方式`查询块的子句。

-   查询块包含一个`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节，“全文停止语”](fulltext-stopwords.html).

    如果`在自然语言模式下`修改器已给出，或者如果未给出修改器。有关更多信息，请参阅[第12.10.1节，“自然语言全文搜索”](fulltext-natural-language.html).

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

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

    有关`全文`查询性能，请参阅[第8.3.5节，“列索引”](column-indexes.html).

    有关`InnoDB` `全文`索引，参见[第15.6.2.4节，“InnoDB全文索引”](innodb-fulltext-index.html).

    中列出了全文搜索的限制条件[第12.10.5节，“全文限制”](fulltext-restrictions.html).

    这个[**存储引擎\_ftdump**](myisam-ftdump.html)实用程序转储`米萨姆`全文索引。这可能有助于调试全文查询。看见[第4.6.3节，“myisam_ftdump-显示全文索引信息“](myisam-ftdump.html).
