暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL的函数和运算符 - 全文搜索 - MySQL 全文搜索微调

数据库杂货铺 2021-07-04
268
MySQL 全文搜索微调
 
MySQL 的全文搜索功能只有一些用户可调整参数。如果有 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 没有类似的设置。)这个变量可以在服务器运行时更改,但是必须有足够的权限来设置全局系统变量。在这种情况下,不需要重新构建索引。
         
        字符集的修改
         
        对于内置的全文解析器,可以用几种方式更改单词字符的字符集合,如下面的列表所示。修改后,为包含任何 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 索引。
         
        ● 为索引列使用的字符集合添加新的排序规则,并更改列以使用该排序规则。
         
        重建 InnoDB 全文索引
         
        要使修改生效,必须在修改以下全文索引变量后重新构建 FULLTEXT 索引:innodb_ft_min_token_sizeinnodb_ft_max_token_sizeinnodb_ft_server_stopword_tableinnodb_ft_user_stopword_tableinnodb_ft_enable_stopwordngram_token_size。修改 innodb_ft_min_token_sizeinnodb_ft_max_token_sizengram_token_size 需要重启服务器。
         
        要为 InnoDB 表重建 FULLTEXT 索引,请使用带有 DROP INDEX ADD INDEX 选项的 ALTER TABLE 语句删除并重新创建每个索引。
         
        优化 InnoDB 全文索引
         
        在具有全文索引的表上运行 OPTIMIZE TABLE 将重新构建全文索引,删除已删除的 Document IDs,并尽可能合并同一个单词的多个条目。
         
        要优化全文索引,请启用 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 个单词。后续的优化表操作从前面的优化表操作结束的地方继续。
           
          重建 MyISAM 全文索引
           
          如果修改影响索引的全文变量(ft_min_word_lenft_max_word_len ft_stopword_file),或者更改终止词文件本身,则必须在进行更改并重新启动服务器后重新构建 FULLTEXT 索引。
           
          要重建 MyISAM 表的 FULLTEXT 索引,只需做一个快速修复操作:
           
            mysql> REPAIR TABLE tbl_name QUICK;
            复制
             
            或者,使用刚才描述的 ALTER TABLE。在某些情况下,这可能比修复操作更快。
             
            必须如所示修复包含 FULLTEXT 索引的每个表。否则,对表的查询可能会产生不正确的结果,对表的修改会导致服务器认为表已损坏,需要进行修复。
             
            如果使用 myisamchk 来执行修改 MyISAM 表索引(例如 repair analyze)的操作,则会使用默认的全文参数值重建 FULLTEXT 索引,包括最小单词长度、最大单词长度和终止词文件,除非指定了其他参数。这可能导致查询失败。
             
            出现问题是因为这些参数只有服务器知道。它们不存储在 MyISAM 索引文件中。如果修改了服务器使用的最小或最大单词长度或终止词文件值,为了避免这个问题,请在 mysqld 中为 myisamchk 指定相同的 ft_min_word_lenft_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 TABLEANALYZE TABLEOPTIMIZE TABLE ALTER TABLE 语句。这些语句由服务器执行,服务器知道要使用的正确全文参数值。
                 
                 
                官方网址:
                https://dev.mysql.com/doc/refman/8.0/en/fulltext-fine-tuning.html
                文章转载自数据库杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论