文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  微调 MySQL 全文搜索

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 搜索索引)定义。

注意

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

更改任何这些选项后,重建 FULLTEXT 索引以使更改生效。例如,要使两位数的词可搜索,您可以在选项文件中添加以下几行

[mysqld]
innodb_ft_min_token_size=2
ft_min_word_len=2

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

配置自然语言搜索阈值

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

#define GWS_IN_USE GWS_PROB

将该行更改为

#define GWS_IN_USE GWS_FREQ

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

注意

通过进行此更改,您 严重 降低了 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() 宏使用 字符类型 表来区分字母和数字与其他字符。您可以编辑 <ctype><map> 数组中的内容,该数组位于某个字符集 XML 文件中,以指定 '-'字母。 然后将给定字符集用于您的 FULLTEXT 索引。有关 <ctype><map> 数组格式的信息,请参见 第 12.13.1 节,“字符定义数组”

  • 为索引列使用的字符集添加一个新的排序规则,并将列更改为使用该排序规则。有关添加排序规则的一般信息,请参见 第 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 索引。

要重建 MyISAM 表的 FULLTEXT 索引,执行 QUICK 修复操作就足够了。

mysql> REPAIR TABLE tbl_name QUICK;

或者,可以使用 ALTER TABLE,如上所述。在某些情况下,这可能比修复操作更快。

包含任何 FULLTEXT 索引的每个表都必须按上述方式修复。否则,该表的查询可能会产生错误的结果,并且对该表的修改会导致服务器将该表视为损坏的,需要修复。

如果使用 myisamchk 执行修改 MyISAM 表索引的操作(例如修复或分析),则除非另有指定,否则将使用 默认 全文参数值(最小词长、最大词长和停用词文件)来重建 FULLTEXT 索引。这会导致查询失败。

问题发生的原因是这些参数仅为服务器所知。它们不会存储在 MyISAM 索引文件中。为了避免在修改服务器使用的最小词长或最大词长或停用词文件值时出现问题,请为 myisamchk 指定与用于 mysqld 的相同的 ft_min_word_lenft_max_word_lenft_stopword_file 值。例如,如果将最小词长设置为 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

使用 myisamchk 修改 MyISAM 表索引的另一种方法是使用 REPAIR TABLEANALYZE TABLEOPTIMIZE TABLEALTER TABLE 语句。这些语句由服务器执行,服务器知道要使用的正确的全文参数值。