12.7.5. 微调MySQL全文搜索

MySQL的全文搜索容量几乎不具有用户调节参数。假如你拥有一个 MySQL源分布,你就能对全文搜索性能行使更多控制,原因是一些变化需要源代码修改。请参见2.8节,“使用源码分发版安装MySQL”

注意,为了更加有效,需要对全文搜索谨慎调节。实际上,在大多数情况下修改默认性能只能降低其性能。 除非你知道自己在做什么,否则不要改变 MySQL源。 

下述的大多数全文变量必须在服务器启动时被设置。为了改变它们,还要重新启动服务器;在服务器正在运行期间,他们不会被改变。 

一些变量的改变需要你重建表中的 FULLTEXT 索引。本章结尾部分给出了其有关操作说明。

  • ft_min_word_len and ft_max_word_len系统自变量规定了被编入索引单词的最小长度和最大长度。(5.3.3节,“服务器系统变量”.) 默认的最小值为四个字符;默认的最大值取决于使用的 MySQL 版本。假如你改变任意一个值,那么你必须重建你的 FULLTEXT索引。 例如,若你希望一个3字符的单词变为可查找项,则可以通过将以下行移动到一个供选择文件里,从而设置 ft_min_word_len 变量:

·                [mysqld]

·                ft_min_word_len=3

然后重新启动服务器,重建你的 FULLTEXT索引。同时还要特别注意该表后面的说明中的关于myisamchk的注释。

  • 若要覆盖默认停止字,则可设置 ft_stopword_file 系统变量。 (5.3.3节,“服务器系统变量”变量值应为包含停止字的文件路径名, 或是用来截止禁用词过滤的空字符串。在改变了这个变量的值或禁用词文件的内容后, 重建你的 FULLTEXT索引。

停止字是自由形态的,换言之,你可使用任何诸如newline spacecomma这样的非字母数字字符来分隔禁用词。 下划线字符(_) 和被视为单词的一部分的单引号 (')例外。停止字字符集为服务器默认字符集;见10.3.1节,“服务器字符集和校对”.

  •  自然语言查询的50%阈值由所选择的特别权衡方案所决定。若要阻止它,myisam/ftdefs.h 中寻找以下行:

·                #define GWS_IN_USE GWS_PROB

将该行改为:

#define GWS_IN_USE GWS_FREQ

然后重新编译 MySQL。此时不需要重建索引。注释这样做你会严重的By 降低 MySQLMATCH()函数提供合适的相关值得能力。假如你争得需要搜索这样的普通词,而使用IN BOOLEAN MODE代替的效果更好,因为它不遵循 50% 阈值。

  • 要改变用于布尔全文搜索的操作符,设置 ft_boolean_syntax 系统变量。 这个变量也可以在服务器运行时被改变,但你必须有SUPER 特权才能这么做。在这种情况下不需要重建索引。 见5.3.3节,“服务器系统变量”, 它向我们说明了怎样使用这个变量的规则。

假如你改变了影响索引的全文变量 (ft_min_word_len ft_max_word_lenft_stopword_file),或假如你改变了禁用词文件本身,则你必须在改变和重新启动服务器后重建你的 FULLTEXT索引。这时,要重建索引, 只需进行一个 QUICK 修理操作: 

mysql> REPAIR TABLE tbl_name QUICK;

注意,假如你使用  myisamchk 来执行一项修改表索引的操作 (诸如修理或分析 ), 则使用最小单词长度和最大单词长度以及停止字的默认全文参数值重建FULLTEXT索引,除非你已另外指定。这会导致问询失败。

发生这个问题的原因是只有服务器认识这些参数。它们的存储位置不在  MyISAM 索引文件中。若你已经修改了最小单词长度或最大单词长度或服务器中的停止字,为避免这个问题,为你对mysqld所使用的myisamchk 指定同样的 ft_min_word_len ft_max_word_lenft_stopword_file值。例如,假如你已经将最小单词长度设置为 3, 则你可以这样修改一个带有myisamchk的表:

shell> 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

使用 REPAIR TABLE ANALYZE TABLEOPTIMIZE TABLEALTER TABLE来代替使用 myisamchk 。这些语句通过服务器来执行,服务器知道使用哪个全文参数值更加合适。

关注编程学问公众号