Documentation Home
MySQL 8.0 参考手册  / 第 12 章函数和运算符  / 12.10 全文搜索功能  /  12.10.6 微调 MySQL 全文搜索

12.10.6 微调 MySQL 全文搜索

MySQL 的全文搜索功能几乎没有用户可调整的参数。如果您有 MySQL 源代码分发,您可以对全文搜索行为施加更多控制,因为某些更改需要修改源代码。参见 第 2.9 节,“从源代码安装 MySQL”

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

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

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

配置最小和最大字长

要索引的单词的最小和最大长度由搜索索引的和定义, 以及 搜索 innodb_ft_min_token_size索引 innodb_ft_max_token_size的 定义 。 InnoDBft_min_word_lenft_max_word_lenMyISAM

笔记

最小和最大字长全文参数不适用于FULLTEXT使用 ngram 解析器创建的索引。ngram 标记大小由 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。在这种情况下不需要重建索引。

笔记

通过进行此更改,您会严重 降低 MySQL 为函数提供足够相关值的能力MATCH() 。如果你真的需要搜索这样的常用词,最好使用IN BOOLEAN MODEinstead 搜索,它不遵守 50% 的阈值。

修改布尔全文搜索运算符

要更改用于对表进行布尔全文搜索的运算符 MyISAM,请设置 ft_boolean_syntax系统变量。(InnoDB没有等效设置。)可以在服务器运行时更​​改此变量,但您必须具有足够的权限才能设置全局系统变量(请参阅 第 5.1.8.1 节,“系统变量权限”)。在这种情况下不需要重建索引。

字符集修改

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

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

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

  • 为索引列使用的字符集添加新的排序规则,并更改列以使用该排序规则。有关添加归类的一般信息,请参阅第 10.14 节,“向字符集添加归类”。有关特定于全文索引的示例,请参阅 第 12.10.7 节,“为全文索引添加用户定义的排序规则”

重建 InnoDB 全文索引

为使更改生效,FULLTEXT 必须在修改以下任何全文索引变量后重建索引: innodb_ft_min_token_size; innodb_ft_max_token_size; innodb_ft_server_stopword_table; innodb_ft_user_stopword_table; innodb_ft_enable_stopword; ngram_token_size. 修改 innodb_ft_min_token_sizeinnodb_ft_max_token_sizengram_token_size需要重新启动服务器。

要重建表FULLTEXT的索引 InnoDB,请使用 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就足够了 :QUICK

mysql> REPAIR TABLE tbl_name QUICK;

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

FULLTEXT必须如刚才所示修复 包含任何索引的每个表。否则,对该表的查询可能会产生不正确的结果,并且对该表的修改会导致服务器将该表视为已损坏并需要修复。

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

出现此问题是因为这些参数只有服务器知道。它们不存储在MyISAM 索引文件中。如果您修改了服务器使用的最小或最大字长或停用词文件值,为避免出现此问题,请 为myisamchk指定与用于 mysqldft_min_word_len的相同的 ft_max_word_len、 和 ft_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语句。这些语句由服务器执行,它知道要使用的正确全文参数值。