### 12.10.6 微调 MySQL 全文搜索

MySQL 的全文搜索功能几乎没有用户可调参数。如果您有 MySQL 源代码分发版，则可以对全文搜索行为施加更多控制，因为某些更改需要修改源代码。看[第 2.9 节，“从源代码安装 MySQL”](source-installation.html).

全文搜索经过仔细调整以提高有效性。在大多数情况下修改默认行为实际上会降低有效性。*除非您知道自己在做什么，否则不要更改 MySQL 源*.

本节中描述的大多数全文变量必须在服务器启动时设置。需要重新启动服务器才能更改它们；在服务器运行时不能修改它们。

一些变量更改需要您重建`全文`表中的索引。本节稍后将给出这样做的说明。

-   [配置最小和最大字长](fulltext-fine-tuning.html#fulltext-word-length)

-   [配置自然语言搜索阈值](fulltext-fine-tuning.html#fulltext-natural-language-threshold)

-   [修改布尔全文搜索运算符](fulltext-fine-tuning.html#fulltext-modify-boolean-operators)

-   [字符集修改](fulltext-fine-tuning.html#fulltext-modify-character-set)

-   [重建 InnoDB 全文索引](fulltext-fine-tuning.html#fulltext-rebuild-innodb-indexes)

-   [优化 InnoDB 全文索引](fulltext-fine-tuning.html#fulltext-optimize)

-   [重建 MyISAM 全文索引](fulltext-fine-tuning.html#fulltext-rebuild-myisam-indexes)

#### 配置最小和最大字长

要索引的单词的最小和最大长度由[`innodb_ft_min_token_size`](innodb-parameters.html#sysvar_innodb_ft_min_token_size)和[`innodb_ft_max_token_size`](innodb-parameters.html#sysvar_innodb_ft_max_token_size)为了`InnoDB`搜索索引，以及[`ft_min_word_len`](server-system-variables.html#sysvar_ft_min_word_len)和[`ft_max_word_len`](server-system-variables.html#sysvar_ft_max_word_len)为了`MyISAM`那些。

笔记

最小和最大字长全文参数不适用于`全文`使用 ngram 解析器创建的索引。ngram 标记大小由[`ngram_token_size`](server-system-variables.html#sysvar_ngram_token_size)选项。

更改任何这些选项后，重建您的`全文`使更改生效的索引。例如，要使两个字符的单词可搜索，您可以将以下行放入选项文件中：

```
[mysqld]
innodb_ft_min_token_size=2
ft_min_word_len=2
```

然后重新启动服务器并重建您的`全文`索引。为了`MyISAM`表，请注意关于[**迈萨姆奇克**](myisamchk.html)在随后的重建说明中`MyISAM`全文索引。

#### 配置自然语言搜索阈值

为了`MyISAM`在搜索索引中，自然语言搜索的 50% 阈值由所选的特定加权方案决定。要禁用它，请在中查找以下行`存储/myisam/ftdefs.h`：

```
#define GWS_IN_USE GWS_PROB
```

将该行更改为：

```
#define GWS_IN_USE GWS_FREQ
```

然后重新编译 MySQL。在这种情况下不需要重建索引。

笔记

通过进行此更改，您*严重*降低 MySQL 为[`匹配（）`](fulltext-search.html#function_match)功能。如果你真的需要搜索这样的常用词，最好使用搜索`在布尔模式下`相反，它没有遵守 50% 的阈值。

#### 修改布尔全文搜索运算符

更改用于布尔全文搜索的运算符`MyISAM`表，设置[`ft_boolean_syntax`](server-system-variables.html#sysvar_ft_boolean_syntax)系统变量。(`InnoDB`没有等效设置。）可以在服务器运行时更​​改此变量，但您必须具有足够的权限才能设置全局系统变量（请参阅[第 5.1.9.1 节，“系统变量权限”](system-variable-privileges.html)）。在这种情况下，不需要重建索引。

#### 字符集修改

对于内置的全文解析器，您可以通过多种方式更改被视为单词字符的字符集，如下面的列表中所述。进行修改后，为每个包含任何内容的表重建索引`全文`索引。假设您要将连字符 ('-') 视为单词字符。使用以下方法之一：

-   修改MySQL源：在`存储/innobase/handler/ha_innodb.cc`（为了`InnoDB`)，或在`存储/myisam/ftdefs.h`（为了`MyISAM`)，见`true_word_char()`和`杂项单词字符（）`宏。添加`'-'`到其中一个宏并重新编译MySQL。

-   修改字符集文件：这不需要重新编译。这个`真的`宏使用“字符类型”表将字母和数字与其他字符区分开来。您可以编辑文档的内容`<ctype><map>`数组，以指定`'-'`是一封“信”然后将给定的字符集用于`全文`索引。有关`<ctype><map>`数组格式，请参见[第10.13.1节，“字符定义数组”](character-arrays.html).

-   为索引列使用的字符集添加新的排序规则，并更改列以使用该排序规则。有关添加排序规则的一般信息，请参阅[第10.14节，“向字符集添加排序规则”](adding-collation.html)。有关全文索引的特定示例，请参阅[第12.10.7节，“为全文索引添加用户定义的排序规则”](full-text-adding-collation.html).

#### 重建InnoDB全文索引

为了使这些变化生效，`全文`修改以下任何全文索引变量后，必须重新生成索引：[`innodb_ft_min_令牌_大小`](innodb-parameters.html#sysvar_innodb_ft_min_token_size);[`innodb_ft_max_token_size`](innodb-parameters.html#sysvar_innodb_ft_max_token_size); [`innodb_ft_服务器_stopword_表`](innodb-parameters.html#sysvar_innodb_ft_server_stopword_table); [`innodb_ft_user_stopword_表`](innodb-parameters.html#sysvar_innodb_ft_user_stopword_table); [`innodb_ft_enable_stopword`](innodb-parameters.html#sysvar_innodb_ft_enable_stopword); [`ngram_令牌_大小`](server-system-variables.html#sysvar_ngram_token_size).修改[`innodb_ft_min_令牌_大小`](innodb-parameters.html#sysvar_innodb_ft_min_token_size), [`innodb_ft_max_token_size`](innodb-parameters.html#sysvar_innodb_ft_max_token_size)或[`ngram_令牌_大小`](server-system-variables.html#sysvar_ngram_token_size)需要重新启动服务器。

重建`全文`索引`InnoDB`桌子，用[`改变桌子`](alter-table.html)和`下降指数`和`添加索引`删除和重新创建每个索引的选项。

#### 优化InnoDB全文索引

跑步[`优化表格`](optimize-table.html)在具有全文索引的表上重建全文索引，删除已删除的文档ID，并在可能的情况下合并同一单词的多个条目。

要优化全文索引，请启用[`innodb_优化_全文_`](innodb-parameters.html#sysvar_innodb_optimize_fulltext_only)然后跑`优化表格`.

```
mysql> set GLOBAL innodb_optimize_fulltext_only=ON;
Query OK, 0 rows affected (0.01 sec)

mysql> OPTIMIZE TABLE opening_lines;
+--------------------+----------+----------+----------+
| Table              | Op       | Msg_type | Msg_text |
+--------------------+----------+----------+----------+
| test.opening_lines | optimize | status   | OK       |
+--------------------+----------+----------+----------+
1 row in set (0.01 sec)
```

为了避免大型表上全文索引的重建时间过长，可以使用[`innodb_ft_num_word_优化`](innodb-parameters.html#sysvar_innodb_ft_num_word_optimize)选择分阶段执行优化。这个`innodb_ft_num_word_优化`选项定义每次优化的字数[`优化表格`](optimize-table.html)他跑了。默认设置为2000，这意味着每次优化2000个单词[`优化表格`](optimize-table.html)他跑了。后来的[`优化表格`](optimize-table.html)操作从前面的位置继续[`优化表格`](optimize-table.html)手术结束了。

#### 重建MyISAM全文索引

如果修改影响索引的全文变量([`ft_min_word_len`](server-system-variables.html#sysvar_ft_min_word_len), [`ft_max_word_len`](server-system-variables.html#sysvar_ft_max_word_len)或[`ft_stopword_文件`](server-system-variables.html#sysvar_ft_stopword_file))，或者如果更改了stopword文件本身，则必须重新生成`全文`在进行更改并重新启动服务器后进行索引。

重建`全文`a的索引`米萨姆`表中，只需做一个`快的`维修操作：

```
mysql> REPAIR TABLE tbl_name QUICK;
```

或者，使用[`改变桌子`](alter-table.html)如前所述。在某些情况下，这可能比维修操作更快。

每个包含`全文`索引必须如图所示进行修复。否则，对该表的查询可能会产生不正确的结果，对该表的修改会导致服务器认为该表已损坏，需要修复。

如果你使用[**myisamchk**](myisamchk.html)执行一个修改`米萨姆`表索引（如修复或分析）`全文`索引是使用*违约*除非另有指定，否则最小字长、最大字长和stopword文件的全文参数值。这可能会导致查询失败。

出现问题是因为这些参数只有服务器知道。它们不储存在`米萨姆`索引文件。如果修改了服务器使用的最小或最大字长或stopword文件值，为了避免出现问题，请指定相同的值[`ft_min_word_len`](server-system-variables.html#sysvar_ft_min_word_len), [`ft_max_word_len`](server-system-variables.html#sysvar_ft_max_word_len)和[`ft_stopword_文件`](server-system-variables.html#sysvar_ft_stopword_file)价值观[**myisamchk**](myisamchk.html)你用来[**mysqld**](mysqld.html)。例如，如果已将最小字长设置为3，则可以使用[**myisamchk**](myisamchk.html)这样地：

```
myisamchk --recover --ft_min_word_len=3 tbl_name.MYI
```

为了确保[**myisamchk**](myisamchk.html)服务器对全文参数使用相同的值，将每个参数都放在`[mysqld]`和`[myisamchk]`选项文件的部分：

```
[mysqld]
ft_min_word_len=3

[myisamchk]
ft_min_word_len=3
```

替代使用[**myisamchk**](myisamchk.html)对于`米萨姆`表索引修改是使用[`修理台`](repair-table.html), [`分析表`](analyze-table.html), [`优化表格`](optimize-table.html)或[`改变桌子`](alter-table.html)声明。这些语句由服务器执行，服务器知道要使用的正确全文参数值。
