MySql 中文文档

5.7Download

12.9.6 Fine-Tuning MySQL Full-Text 搜索

MySQL 的 full-text 搜索功能几乎没有 user-tunable 参数。如果您有 MySQL 源代码分发,则可以对 full-text 搜索行为施加更多控制,因为某些更改需要 source code 修改。见第 2.9 节,“从源安装 MySQL”

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

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

某些变量更改要求您重建表中的FULLTEXT索引。有关这样做的说明将在本节后面给出。

配置最小和最大字长

要编制索引的单词的最小和最大长度由InnoDBinnodb_ft_max_token_size用于InnoDB搜索索引定义,ft_min_word_lenft_max_word_len用于MyISAM索引。

注意
最小和最大字长 full-text 参数不适用于使用 ngram 解析器创建的FULLTEXT索引。 ngram 标记大小由ngram_token_size选项定义。
更改任何这些选项后,重建FULLTEXT索引以使更改生效。对于 example,要使 two-character 单词可搜索,您可以将以下 lines 放在选项文件中:

[mysqld]
innodb_ft_min_token_size=2
ft_min_word_len=2

然后重新启动服务器并重建FULLTEXT索引。对于MyISAM表,请注意有关重建MyISAM full-text 索引的说明中有关myisamchk的注释。

配置自然语言搜索阈值

对于MyISAM搜索索引,自然语言搜索的 50%阈值由所选的特定权重 scheme 确定。要禁用它,请在storage/myisam/ftdefs.h中查找以下 line:

#define GWS_IN_USE GWS_PROB

将 line 更改为:

#define GWS_IN_USE GWS_FREQ

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

注意
通过进行此更改,会严重降低 MySQL 为MATCH() function 提供足够相关值的能力。如果你真的需要搜索这样的 common 单词,那么最好使用IN BOOLEAN MODE代替搜索,这不会达到 50%的阈值。

修改 Boolean Full-Text 搜索 Operators

要更改MyISAM表上用于 boolean full-text 搜索的 operators,请设置ftboolean_syntax系统变量。 (InnoDB没有等效的 setting.)当服务器运行时,可以更改此变量,但是您必须具有足以设置 global 系统变量的权限(请参阅第 5.1.8.1 节,“系统变量权限”)。在这种情况下,不需要重建索引。

字符集修改

对于 built-in full-text 解析器,您可以通过多种方式更改被视为单词字符的字符集,如以下列表中所述。进行修改后,重建包含任何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 来区分字母和 numbers 与其他字符。 。您可以在其中一个字符集 XML files 中编辑<ctype><map> array 的内容,以指定'-'是“字母”。然后使用给定的FULLTEXT索引字符集。有关<ctype><map> array 格式的信息,请参阅第 10.13.1 节,“字符定义数组”

  • 为索引列使用的字符集添加新的排序规则,并更改列以使用该排序规则。有关添加归类的一般信息,请参阅第 10.14 节,“将字符集添加到字符集”。有关特定于 full-text 索引的 example,请参阅第 12.9.7 节,“为 Full-Text 索引添加排序规则”

重建 InnoDB Full-Text 索引

要使更改生效,必须在修改以下任何 full-text 索引变量后重建FULLTEXT索引:innodb_ft_min_token_size; innodb_ft_max_token_size; innodb_ft_server_stopwordtable; innodb_ft_user_stopwordtable; innodb_ft_enable_stopword; ngram_token_size。修改innodb_ft_min_token_sizeinnodb_ft_max_token_sizengram_token_size需要重新启动服务器。

要为InnoDB table 重建FULLTEXT索引,请使用ALTER TABLEDROP INDEXADD INDEX选项删除和 re-create 每个索引。

优化 InnoDB Full-Text 索引

_在带有 full-text 索引的 table 上运行OPTIMIZE TABLE会重建 full-text 索引,删除已删除的文档 ID 并尽可能合并同一个单词的多个条目。

要优化 full-text 索引,请启用innodb_optimize_fulltext_only和 run 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)

为避免大型表上 full-text 索引的冗长重建时间,可以使用innodb_ft_num_word_optimize选项分阶段执行优化。 innodb_ft_num_word_optimize选项定义每个 time OPTIMIZE TABLE是 run 时优化的单词数。默认设置为 2000,这意味着每个 time OPTIMIZE TABLE是 run 时优化 2000 个单词。后续的OPTIMIZE TABLE操作从前面的OPTIMIZE TABLE操作结束的地方继续。

重建 MyISAM Full-Text 索引

如果修改影响索引的 full-text 变量(ft_min_word_lenft_max_word_lenft_stopword_file),或者更改了停用词文件本身,则必须在进行更改并重新启动服务器后重建FULLTEXT索引。

要重建MyISAM table 的FULLTEXT索引,只需执行QUICK修复操作即可:

mysql> REPAIR TABLE tbl_name QUICK;

或者,如上所述使用ALTER TABLE。在某些情况下,这可能比修复操作更快。

必须修复包含任何FULLTEXT索引的每个 table。否则,对 table 的查询可能会 yield 不正确的结果,并且对 table 的修改将导致服务器将 table 视为已损坏且需要修复。

如果使用myisamchk执行修改MyISAM table 索引(例如修复或分析)的操作,则使用默认 full-text 参数值重建FULLTEXT索引,以获得最小字长,最大字长和停用文件,除非另行指定。这可能导致查询失败。

出现此问题的原因是这些参数仅由服务器知道。它们不存储在MyISAM index files 中。如果已修改服务器使用的最小或最大字长或停用词文件值,请避免此问题,请为mysqld指定myisamchk的相同ft_min_word_lenft_max_word_lenft_stopword_file值。对于 example,如果您将最小字长设置为 3,则可以使用myisamchk修复 table,如下所示:

myisamchk --recover --ft_min_word_len=3 tbl_name.MYI

要确保myisamchk和服务器对 full-text 参数使用相同的值,请将每个值放在选项文件的[mysqld][myisamchk]部分中:

[mysqld]
ft_min_word_len=3

[myisamchk]
ft_min_word_len=3

使用myisamchk进行MyISAM table 索引修改的替代方法是使用维修表分析 TABLEOPTIMIZE TABLEALTER TABLE statements。这些 statements 由服务器执行,服务器知道要使用的正确 full-text 参数值。

Updated at: 6 months ago
Full-Text 限制Table of content为 Full-Text 索引添加排序规则