12.9.6 微调 MySQL 全文搜索
MySQL 的全文搜索功能几乎没有用户可调参数。如果您拥有 MySQL 源代码发行版,则可以对全文搜索行为进行更多控制,因为某些更改需要修改源代码。参见第 2.9 节“从源代码安装 MySQL”。
全文搜索经过仔细调整以提高有效性。在大多数情况下,修改默认行为实际上会降低有效性。 除非您知道自己在做什么,否则请勿更改 MySQL 源。
必须在服务器启动时设置本节中描述的大多数全文变量。需要重新启动服务器才能更改它们。服务器运行时无法修改它们。
某些变量更改要求您重建 table 中的FULLTEXT
索引。有关说明,请参阅本节后面的内容。
配置最小和最大字长
对于InnoDB
搜索索引,要索引的单词的最小和最大长度由innodb_ft_min_token_size和innodb_ft_max_token_size定义,对于MyISAM
索引由ft_min_word_len和ft_max_word_len定义。
Note
最小和最大字长全文参数不适用于使用 ngram 解析器创建的FULLTEXT
索引。 ngram 令牌大小由ngram_token_size选项定义。
更改所有这些选项后,请重新构建FULLTEXT
索引,以使更改生效。例如,要使两个字符的单词可搜索,可以将以下行放在选项文件中:
[mysqld]
innodb_ft_min_token_size=2
ft_min_word_len=2
然后重新启动服务器并重建您的FULLTEXT
索引。对于MyISAM
table,请注意以下有关重建MyISAM
全文索引的说明中有关myisamchk的说明。
配置自然语言搜索阈值
对于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%的阈值。
修改 Boolean 全文本搜索运算符
要更改用于MyISAM
table 上的 Boolean 全文本搜索的运算符,请设置ft_boolean_syntax系统变量。 (InnoDB
没有等效的设置.)服务器运行时可以更改此变量,但是您必须具有足以设置全局系统变量的特权(请参阅第 5.1.8.1 节“系统变量特权”)。在这种情况下,无需重建索引。
字符集修改
对于内置的全文分析器,您可以通过以下几种方法更改被视为单词字符的字符集。进行修改后,为包含任何FULLTEXT
索引的每个 table 重建索引。假设您要将连字符('-')视为单词字符。使用以下方法之一:
-
修改 MySQL 源:在
storage/innobase/handler/ha_innodb.cc
(对于InnoDB
)或storage/myisam/ftdefs.h
(对于MyISAM
)中,请参见true_word_char()
和misc_word_char()
宏。将'-'
添加到这些宏之一,然后重新编译 MySQL。 -
修改字符集文件:不需要重新编译。
true_word_char()
宏使用“字符类型”table 将字母和数字与其他字符区分开。 。您可以在一个字符集 XML 文件中编辑<ctype><map>
数组的内容,以指定'-'
是“字母”。然后将给定的字符集用于FULLTEXT
索引。有关<ctype><map>
数组格式的信息,请参见第 10.13.1 节“字符定义数组”。 -
为索引列使用的字符集添加新的排序规则,并更改列以使用该排序规则。有关添加排序规则的一般信息,请参见第 10.14 节“为字符集添加排序规则”。有关全文索引的示例,请参见第 12.9.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_size,innodb_ft_max_token_size或ngram_token_size要求重新启动服务器。
要为InnoDB
table 重建FULLTEXT
索引,请将ALTER TABLE与DROP INDEX
和ADD INDEX
选项一起使用以删除并重新创建每个索引。
优化 InnoDB 全文索引
在具有全文索引的 table 上运行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)
为避免大型 table 上全文索引的重建时间过长,可以使用innodb_ft_num_word_optimize选项分阶段执行优化。 innodb_ft_num_word_optimize
选项定义每次运行OPTIMIZE TABLE时优化的单词数。默认设置为 2000,这意味着每次运行OPTIMIZE TABLE时都会优化 2000 个单词。随后的OPTIMIZE TABLE操作从先前的OPTIMIZE TABLE操作结束的地方 continue。
重建 MyISAM 全文索引
如果您修改影响索引的全文变量(ft_min_word_len,ft_max_word_len或ft_stopword_file),或者更改了停用词文件本身,则必须在进行更改并重新启动服务器后重新构建FULLTEXT
索引。
要重建MyISAM
table 的FULLTEXT
索引,只需执行QUICK
修复操作即可:
mysql> REPAIR TABLE tbl_name QUICK;
或者,按照刚才的说明使用ALTER TABLE。在某些情况下,这可能比维修操作要快。
包含任何FULLTEXT
索引的每个 table 都必须修复,如所示。否则,查询 table 可能会产生错误的结果,并且对该 table 的修改将导致服务器将 table 视为已损坏并且需要修复。
如果您使用myisamchk执行修改MyISAM
table 索引的操作(例如修复或分析),则除非使用* default *全文参数值,否则FULLTEXT
索引将重建,这些参数值用于最小字长,最大字长和停用字文件,除非您否则指定。这可能会导致查询失败。
发生问题是因为这些参数仅由服务器知道。它们没有存储在MyISAM
索引文件中。为避免此问题,如果您修改了服务器使用的最小或最大字长或停用词文件值,请为mysqld指定相同的myisamchk值ft_min_word_len,ft_max_word_len和ft_stopword_file。例如,如果将最小字长设置为 3,则可以使用myisamchk修复 table,如下所示:
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
table 索引修改的替代方法是使用REPAIR TABLE,ANALYZE TABLE,OPTIMIZE TABLE或ALTER TABLE语句。这些语句由服务器执行,服务器知道要使用的适当的全文参数值。