### 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。 - 修改字符集文件:这不需要重新编译。这个`真的`宏使用“字符类型”表将字母和数字与其他字符区分开来。您可以编辑文档的内容``数组,以指定`'-'`是一封“信”然后将给定的字符集用于`全文`索引。有关``数组格式,请参见[第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)声明。这些语句由服务器执行,服务器知道要使用的正确全文参数值。