MySQL 的全文搜索功能只有少数用户可调整参数。如果您拥有 MySQL 源代码分布式,因为某些更改需要源代码修改。请参阅 第 2.8 节,“从源代码安装 MySQL”。
全文搜索已经精心调整以提高效果。在大多数情况下,修改默认行为实际上可能会降低效果。除非您知道自己在做什么,否则请不要修改 MySQL 源代码。
本节中描述的大多数全文变量必须在服务器启动时设置。需要重新启动服务器来更改它们;无法在服务器运行时修改它们。
某些变量更改需要您重新构建表中的 FULLTEXT
索引。稍后在本节中将提供相关说明。
InnoDB 搜索索引的最小和最大单词长度由 innodb_ft_min_token_size
和 innodb_ft_max_token_size
定义,而 MyISAM 搜索索引则由 ft_min_word_len
和 ft_max_word_len
定义。
ngram 解析器创建的 FULLTEXT 索引不受最小和最大单词长度参数的影响。ngram token 大小由 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 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 节,“字符定义数组”。 -
添加一个新的排序规则 для character set 用于索引的列,并将这些列更改为使用该排序规则。有关添加排序规则的常规信息,请参阅 第 12.14 节,“添加字符集的排序规则”。对于全文索引的特定示例,请参阅 第 14.9.7 节,“添加用户定义的排序规则 для全文索引”。
要使更改生效,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
表的 FULLTEXT
索引,使用 ALTER TABLE
语句的 DROP INDEX
和 ADD INDEX
选项来删除和重新创建每个索引。
在具有全文索引的表上运行 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
操作结束的地方继续。
如果您修改了影响索引的全文变量(ft_min_word_len
、ft_max_word_len
或 ft_stopword_file
),或者如果您更改了停止词文件本身,则在更改后重新启动服务器后必须重新构建 FULLTEXT
索引。
要重新构建 FULLTEXT
索引,仅需对 MyISAM
表执行快速修复操作:
mysql> REPAIR TABLE tbl_name QUICK;
或者,使用 ALTER TABLE
,就像刚才描述的那样。在某些情况下,这可能比修复操作更快。
每个包含 FULLTEXT
索引的表都必须像刚才描述的那样进行修复。否则,对该表的查询可能会产生不正确的结果,并且对表的修改将使服务器将表视为损坏并需要修复。
如果您使用 myisamchk 执行修改 MyISAM
表索引的操作(例如修复或分析),则 FULLTEXT
索引将使用默认的全文参数值重建,除非您指定其他值。这可能会导致查询失败。
问题的原因是这些参数仅由服务器知道,不存储在 MyISAM
索引文件中。要避免问题,如果您修改了最小或最大单词长度或停止词文件值,请为 myisamchk 指定相同的 ft_min_word_len
、ft_max_word_len
和 ft_stopword_file
值,如下所示:
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 TABLE
、ANALYZE TABLE
、OPTIMIZE TABLE
或 ALTER TABLE
语句。这些语句由服务器执行,服务器知道使用正确的全文参数值。