• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 微调MySQL全文搜索

    MySQL的全文本搜索功能几乎没有用户可调参数。如果您拥有MySQL源代码发行版,则可以对全文搜索行为进行更多控制,因为某些更改需要修改源代码。请参见“从源代码安装MySQL”。

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

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

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

    • 配置最小和最大字长
    • 配置自然语言搜索阈值
    • 修改布尔型全文本搜索运算符
    • 字符集修改
    • 重建InnoDB全文索引
    • 优化InnoDB全文索引
    • 重建MyISAM全文索引

    配置最小和最大字长

    要搜索的单词的最小和最大长度由innodb_ft_min_token_size和定义,innodb_ft_max_token_size用于InnoDB搜索索引,ft_min_word_len以及ft_max_word_len用于MyISAM

    注意

    最小和最大字长全文参数不适用于FULLTEXT使用ngram解析器创建的索引。ngram令牌大小由该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没有等效设置。)在服务器运行时可以更改此变量,但是您必须具有足以设置全局系统变量的特权(请参见“系统变量特权”)。在这种情况下,无需重建索引。

    字符集修改

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

    • 修改MySQL源:在中storage/innobase/handler/ha_innodb.cc(代表InnoDB)或在中storage/myisam/ftdefs.h(代表MyISAM),请参见true_word_char()misc_word_char()宏。添加'-'到这些宏之一,然后重新编译MySQL。
    • 修改字符集文件:不需要重新编译。的true_word_char()宏使用“字符类型”表来从其他字符区分字母和数字。。您可以编辑的内容<ctype><map>数组中的字符集XML文件中指定'-'一个“字母。”,然后将给定的字符集用于FULLTEXT索引。有关<ctype><map>数组格式的信息,请参见“字符定义数组”。
    • 为索引列使用的字符集添加新的校验规则,并更改列以使用该校验规则。有关添加归类的一般信息,请参见“向字符集添加校验规则”。有关全文索引的示例,请参见“为全文索引添加校验规则”。

    重建InnoDB全文索引

    为使更改生效,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_sizeinnodb_ft_max_token_sizengram_token_size需要重新启动服务器。

    要重建表的FULLTEXT索引InnoDB,请ALTER TABLEDROP INDEXADD INDEX选项一起使用以删除并重新创建每个索引。

    优化InnoDB全文索引

    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操作结束的地方继续。

    重建MyISAM全文索引

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

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

    mysql> REPAIR TABLE tbl_name QUICK;
    

    另外,也可以ALTER TABLE按照上述说明使用。在某些情况下,这可能比维修操作要快。

    包含任何FULLTEXT索引的每个表都必须修复,如图所示。否则,查询表可能会产生错误的结果,并且对该表进行修改将导致服务器将表视为已损坏且需要修复。

    如果使用myisamchk执行修改MyISAM 表索引的操作(例如修复或分析),则除非使用其他特殊说明,否则FULLTEXT将使用默认的全文参数值(最小字长,最大字长和停用词文件)来重建索引。这可能会导致查询失败。

    发生问题是因为这些参数仅由服务器知道。它们不存储在MyISAM索引文件中。为了避免这个问题,如果你已经修改服务器所使用的最小或最大字长或停止字文件值,指定相同的ft_min_word_lenft_max_word_len以及ft_stopword_file对价值观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的用于MyISAM表索引修改是使用REPAIR TABLEANALYZE TABLEOPTIMIZE TABLE,或ALTER TABLE语句。这些语句由服务器执行,服务器知道要使用的适当的全文参数值。