# 12.10.6 微调 MySQL 全文搜索

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

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

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

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

# 配置最小和最大字长

要索引的单词的最小和最大长度由innodb_ft_min_token_sizeinnodb_ft_max_token_size为了InnoDB搜索索引,以及ft_min_word_lenft_max_word_len为了MyISAM那些。

笔记

最小和最大字长全文参数不适用于全文使用 ngram 解析器创建的索引。ngram 标记大小由ngram_token_size选项。

更改任何这些选项后,重建您的全文使更改生效的索引。例如,要使两个字符的单词可搜索,您可以将以下行放入选项文件中:

[mysqld]
innodb_ft_min_token_size=2
ft_min_word_len=2

然后重新启动服务器并重建您的全文索引。为了MyISAM表,请注意关于迈萨姆奇克在随后的重建说明中MyISAM全文索引。

# 配置自然语言搜索阈值

为了MyISAM在搜索索引中,自然语言搜索的 50% 阈值由所选的特定加权方案决定。要禁用它,请在中查找以下行存储/myisam/ftdefs.h

#define GWS_IN_USE GWS_PROB

将该行更改为:

#define GWS_IN_USE GWS_FREQ

然后重新编译 MySQL。在这种情况下不需要重建索引。

笔记

通过进行此更改,您严重降低 MySQL 为匹配()功能。如果你真的需要搜索这样的常用词,最好使用搜索在布尔模式下相反,它没有遵守 50% 的阈值。

# 修改布尔全文搜索运算符

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

# 字符集修改

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

  • 修改MySQL源:在存储/innobase/handler/ha_innodb.cc(为了InnoDB),或在存储/myisam/ftdefs.h(为了MyISAM),见true_word_char()杂项单词字符()宏。添加'-'到其中一个宏并重新编译MySQL。

  • 修改字符集文件:这不需要重新编译。这个真的宏使用“字符类型”表将字母和数字与其他字符区分开来。您可以编辑文档的内容<ctype><map>数组,以指定'-'是一封“信”然后将给定的字符集用于全文索引。有关<ctype><map>数组格式,请参见第10.13.1节,“字符定义数组”.

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

# 重建InnoDB全文索引

为了使这些变化生效,全文修改以下任何全文索引变量后,必须重新生成索引:innodb_ft_min_令牌_大小;innodb_ft_max_token_size; innodb_ft_服务器_stopword_表; innodb_ft_user_stopword_表; innodb_ft_enable_stopword; ngram_令牌_大小.修改innodb_ft_min_令牌_大小, innodb_ft_max_token_sizengram_令牌_大小需要重新启动服务器。

重建全文索引InnoDB桌子,用改变桌子下降指数添加索引删除和重新创建每个索引的选项。

# 优化InnoDB全文索引

跑步优化表格在具有全文索引的表上重建全文索引,删除已删除的文档ID,并在可能的情况下合并同一单词的多个条目。

要优化全文索引,请启用innodb_优化_全文_然后跑优化表格.

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_优化选择分阶段执行优化。这个innodb_ft_num_word_优化选项定义每次优化的字数优化表格他跑了。默认设置为2000,这意味着每次优化2000个单词优化表格他跑了。后来的优化表格操作从前面的位置继续优化表格手术结束了。

# 重建MyISAM全文索引

如果修改影响索引的全文变量(ft_min_word_len, ft_max_word_lenft_stopword_文件),或者如果更改了stopword文件本身,则必须重新生成全文在进行更改并重新启动服务器后进行索引。

重建全文a的索引米萨姆表中,只需做一个快的维修操作:

mysql> REPAIR TABLE tbl_name QUICK;

或者,使用改变桌子如前所述。在某些情况下,这可能比维修操作更快。

每个包含全文索引必须如图所示进行修复。否则,对该表的查询可能会产生不正确的结果,对该表的修改会导致服务器认为该表已损坏,需要修复。

如果你使用myisamchk执行一个修改米萨姆表索引(如修复或分析)全文索引是使用违约除非另有指定,否则最小字长、最大字长和stopword文件的全文参数值。这可能会导致查询失败。

出现问题是因为这些参数只有服务器知道。它们不储存在米萨姆索引文件。如果修改了服务器使用的最小或最大字长或stopword文件值,为了避免出现问题,请指定相同的值ft_min_word_len, ft_max_word_lenft_stopword_文件价值观myisamchk你用来mysqld。例如,如果已将最小字长设置为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对于米萨姆表索引修改是使用修理台, 分析表, 优化表格改变桌子声明。这些语句由服务器执行,服务器知道要使用的正确全文参数值。