Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Fine-Tuning MySQL Full-Text Search

14.9.6 MySQL 全文搜索微调

MySQL 的全文搜索功能只有少数用户可调整参数。如果您拥有 MySQL 源代码分布式,因为某些更改需要源代码修改。请参阅 第 2.8 节,“从源代码安装 MySQL”

全文搜索已经精心调整以提高效果。在大多数情况下,修改默认行为实际上可能会降低效果。除非您知道自己在做什么,否则请不要修改 MySQL 源代码

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

某些变量更改需要您重新构建表中的 FULLTEXT 索引。稍后在本节中将提供相关说明。

配置最小和最大单词长度

InnoDB 搜索索引的最小和最大单词长度由 innodb_ft_min_token_sizeinnodb_ft_max_token_size 定义,而 MyISAM 搜索索引则由 ft_min_word_lenft_max_word_len 定义。

Note

ngram 解析器创建的 FULLTEXT 索引不受最小和最大单词长度参数的影响。ngram token 大小由 ngram_token_size 选项定义。

更改这些选项后,重新构建 FULLTEXT 索引以使更改生效。例如,要使两个字符的单词可搜索,可以在选项文件中添加以下行:

[mysqld]
innodb_ft_min_token_size=2
ft_min_word_len=2

然后重新启动服务器并重新构建 FULLTEXT 索引。对于 MyISAM 表,请注意 myisamchk 在重新构建 MyISAM 全文索引时的备注。

配置自然语言搜索阈值

对于 MyISAM 搜索索引,自然语言搜索的 50% 阈值是由特定的权重方案确定的。要禁用它,请在 storage/myisam/ftdefs.h 文件中查找以下行:

#define GWS_IN_USE GWS_PROB

将该行更改为:

#define GWS_IN_USE GWS_FREQ

然后重新编译 MySQL。无需重新构建索引。

Note

通过进行这种更改,您 严重 降低了 MySQL 为 MATCH() 函数提供相关性值的能力。如果您真的需要搜索这些常见单词,那么使用 IN BOOLEAN MODE 搜索将更好,该模式不遵守 50% 阈值。

修改布尔全文搜索操作符

要更改在 MyISAM 表上进行布尔全文搜索的操作符,设置 ft_boolean_syntax 系统变量。(InnoDB 没有等效设置。)该变量可以在服务器运行时更改,但您必须拥有足够的权限来设置全局系统变量(见 第 7.1.9.1 节,“系统变量权限”)。在这种情况下,不需要重新构建索引。

字符集修改

对于内置的全文解析器,您可以通过以下几种方式更改词字符集,如下所示。然后,对于每个包含 FULLTEXT 索引的表,重新构建索引。假设您想将连字符 ('-') 视为词字符。使用以下方法之一:

  • 修改 MySQL 源代码:在 storage/innobase/handler/ha_innodb.cc(对于 InnoDB),或在 storage/myisam/ftdefs.h(对于 MyISAM),查看 true_word_char()misc_word_char() 宏。将 '-' 添加到其中一个宏中,然后重新编译 MySQL。

  • 修改字符集文件:这不需要重新编译。true_word_char() 宏使用一个 字符类型 表来区分字母和数字与其他字符。您可以编辑某个字符集 XML 文件中的 <ctype><map> 数组的内容,以指定 '-' 是一个 字母。 然后使用该字符集为您的 FULLTEXT 索引。有关 <ctype><map> 数组格式的信息,请参阅 第 12.13.1 节,“字符定义数组”

  • 添加一个新的排序规则 для character set 用于索引的列,并将这些列更改为使用该排序规则。有关添加排序规则的常规信息,请参阅 第 12.14 节,“添加字符集的排序规则”。对于全文索引的特定示例,请参阅 第 14.9.7 节,“添加用户定义的排序规则 для全文索引”

InnoDB 全文索引的重建

要使更改生效,FULLTEXT 索引必须在修改以下任何全文索引变量后重新构建:innodb_ft_min_token_sizeinnodb_ft_max_token_sizeinnodb_ft_server_stopword_tableinnodb_ft_user_stopword_tableinnodb_ft_enable_stopwordngram_token_size。修改 innodb_ft_min_token_sizeinnodb_ft_max_token_sizengram_token_size 需要重新启动服务器。

要重新构建 InnoDB 表的 FULLTEXT 索引,使用 ALTER TABLE 语句的 DROP INDEXADD INDEX 选项来删除和重新创建每个索引。

InnoDB 全文索引的优化

在具有全文索引的表上运行 OPTIMIZE TABLE 将重建全文索引,删除已删除的文档 ID 并合并相同单词的多个条目,以便可能。

要优化全文索引,启用 innodb_optimize_fulltext_only 并运行 OPTIMIZE TABLE

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_optimize 选项以阶段方式进行优化。 innodb_ft_num_word_optimize 选项定义了每次运行 OPTIMIZE TABLE 时优化的单词数量。默认设置为 2000,这意味着每次运行 OPTIMIZE TABLE 时优化 2000 个单词。后续 OPTIMIZE TABLE 操作将从上一个 OPTIMIZE TABLE 操作结束的地方继续。

重建 MyISAM 全文索引

如果您修改了影响索引的全文变量(ft_min_word_lenft_max_word_lenft_stopword_file),或者如果您更改了停止词文件本身,则在更改后重新启动服务器后必须重新构建 FULLTEXT 索引。

要重新构建 FULLTEXT 索引,仅需对 MyISAM 表执行快速修复操作:

mysql> REPAIR TABLE tbl_name QUICK;

或者,使用 ALTER TABLE,就像刚才描述的那样。在某些情况下,这可能比修复操作更快。

每个包含 FULLTEXT 索引的表都必须像刚才描述的那样进行修复。否则,对该表的查询可能会产生不正确的结果,并且对表的修改将使服务器将表视为损坏并需要修复。

如果您使用 myisamchk 执行修改 MyISAM 表索引的操作(例如修复或分析),则 FULLTEXT 索引将使用默认的全文参数值重建,除非您指定其他值。这可能会导致查询失败。

问题的原因是这些参数仅由服务器知道,不存储在 MyISAM 索引文件中。要避免问题,如果您修改了最小或最大单词长度或停止词文件值,请为 myisamchk 指定相同的 ft_min_word_lenft_max_word_lenft_stopword_file 值,如下所示:

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

要确保 myisamchk 和服务器使用相同的全文参数值,请将每个值都放在选项文件的 [mysqld][myisamchk] 部分中:

[mysqld]
ft_min_word_len=3

[myisamchk]
ft_min_word_len=3

使用 myisamchkMyISAM 表索引进行修改的替代方法是使用 REPAIR TABLEANALYZE TABLEOPTIMIZE TABLEALTER TABLE 语句。这些语句由服务器执行,服务器知道使用正确的全文参数值。