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.9.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全文参数值重建索引 。这可能会导致查询失败。

The problem occurs because these parameters are known only by the server. They are not stored in MyISAM index files. To avoid the problem if you have modified the minimum or maximum word length or stopword file values used by the server, specify the same ft_min_word_len, ft_max_word_len, and ft_stopword_file values for myisamchk that you use for mysqld. For example, if you have set the minimum word length to 3, you can repair a table with myisamchk like this:

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