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 标记大小由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()
宏使用“字符类型”表来区分字母和数字与其他字符。.您可以编辑其中一个字符集 XML 文件中<ctype><map>
数组的内容,以指定'-'
是“字母。”然后对您的FULLTEXT
索引使用给定的字符集。有关<ctype><map>
数组格式的信息,请参阅第 12.13.1 节“字符定义数组”。为索引列使用的字符集添加新的排序规则,并将列更改为使用该排序规则。有关添加排序规则的一般信息,请参阅第 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
索引,请使用带有 DROP INDEX
和 ADD INDEX
选项的 ALTER 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)
为了避免大型表上全文索引的重建时间过长,可以使用 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
索引。
要重建 MyISAM
表的 FULLTEXT
索引,只需执行 QUICK
修复操作即可。
mysql> REPAIR TABLE tbl_name QUICK;
或者,也可以像上面描述的那样使用 ALTER TABLE
。在某些情况下,这可能比修复操作更快。
每个包含任何 FULLTEXT
索引的表都必须按照上面显示的方式进行修复。否则,对该表的查询可能会产生错误的结果,并且对该表的修改会导致服务器将该表视为已损坏且需要修复。
如果您使用 myisamchk 执行修改 MyISAM
表索引的操作(例如修复或分析),则将使用最小单词长度、最大单词长度和停用词文件的 默认 全文参数值重建 FULLTEXT
索引,除非您另行指定。这可能会导致查询失败。
出现此问题的原因是,这些参数只有服务器知道。它们没有存储在 MyISAM
索引文件中。为了避免此问题,如果您修改了服务器使用的最小或最大单词长度或停用词文件值,请为 myisamchk 指定与 mysqld 相同的 ft_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 TABLE
、ANALYZE TABLE
、OPTIMIZE TABLE
或 ALTER TABLE
语句。这些语句由服务器执行,服务器知道要使用的正确全文参数值。