Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

14.9.6 微调 MySQL 全文搜索

MySQL 的全文搜索功能很少有可调整的参数。如果您拥有 MySQL 源代码分布,您可以通过修改源代码来控制全文搜索行为。请参阅第 2.8 节,“从源代码安装 MySQL”

全文搜索已经非常精心地调整了,以提高效果。修改默认行为通常会降低效果。除非您知道自己在做什么,否则不要修改 MySQL 源代码

本节中大多数全文变量都需要在服务器启动时设置。要更改它们,您需要重新启动服务器;它们不能在服务器运行时进行修改。

某些变量更改还需要您重建表中的 FULLTEXT 索引。后续部分将提供相关说明。

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

Note

最小和最大单词长度全文参数不适用于使用ngram解析器创建的FULLTEXT索引。ngram token size由ngram_token_size选项定义。

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

[mysqld]
innodb_ft_min_token_size=2
ft_min_word_len=2

然后重启服务器并重新建立FULLTEXT索引。对于MyISAM表,注意以下关于重建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节,“字符定义数组”

  • 添加用于索引列的字符集的新排序规则,并将列更改为使用该排序规则。关于添加排序规则的总体信息,请参见第12.14节,“添加字符集排序规则”。关于全文索引的特定示例,请参见第14.9.7节,“为全文索引添加用户定义排序规则”

重建 InnoDB 全文索引

为了使更改生效,需要重建以下全文索引变量:innodb_ft_min_token_size;innodb_ft_max_token_size;innodb_ft_server_stopword_table;

To rebuild FULLTEXT indexes for an InnoDB table, use ALTER TABLE with the DROP INDEX and ADD INDEX options to drop and re-create each index.

Optimizing InnoDB Full-Text 索引

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操作将从前一个操作结束的地方继续。

重建MyISAM全文索引

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

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

mysql> REPAIR TABLE tbl_name QUICK;

或者,使用ALTER TABLE语句正如前面所描述的那样。在某些情况下,这可能比修复操作更快。

每个包含FULLTEXT索引的表都必须像这样重建否则,查询该表可能返回错误结果,并对该表进行修改时服务器将视该表为损坏并需要修复。

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

问题发生是因为这些参数只有服务器知道,不存储在MyISAM索引文件中。如果您已经修改了服务器使用的最小或最大单词长度或停用词文件值,指定相同的ft_min_word_lenft_max_word_lenft_stopword_file值用于myisamchkmysqld。例如,如果您将最小单词长度设置为3,可以使用myisamchk修复表像这样:

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语句。这些语句由服务器执行,它们知道使用正确的全文参数值。