mysql安装完成后如何配置全文索引_mysql全文检索配置

4次阅读

mysql 5.6+ 全文索引仅支持 innodb 和 myisam;非此两类引擎(如 memory、archive)执行 add fulltext 会报错 Error 1214;innodb 必须用 alter table … add fulltext 或建表时定义,不支持 create index 单独添加;全文检索必须用 match … against,like/regexp 不走索引;中文需 ngram 插件或应用层分词。

mysql安装完成后如何配置全文索引_mysql全文检索配置

MySQL 5.6+ 全文索引只支持 InnoDB 和 MyISAM 表

全文索引不是所有存储引擎都支持。如果你建表时用的是 ENGINE=MEMORYARCHIVECSV,执行 ALTER TABLE ... ADD FULLTEXT 会直接报错:ERROR 1214 (HY000): The used table type doesn't support FULLTEXT indexes。必须先确认表引擎:

SHOW CREATE TABLE your_table_name;

如果不是 InnoDBMyISAM,需先转换:

ALTER TABLE your_table_name ENGINE = InnoDB;

创建全文索引的三种方式要分清场景

全文索引不能通过 CREATE INDEX 单独添加(除非是 MyISAM),InnoDB 必须在 CREATE TABLE 时声明,或用 ALTER TABLE ... ADD FULLTEXT —— 但后者有隐含限制:

  • 单列全文索引:直接 ADD FULLTEXT(column_name)
  • 多列联合全文索引:必须一次性指定所有列,比如 ADD FULLTEXT(title, content);之后不能再单独给 content 加一个新全文索引
  • 已存在数据的表加全文索引,InnoDB 会重建索引,期间写入阻塞,大表慎操作

推荐做法:建表时就定义好,避免后期迁移成本。

全文检索语句写法和默认行为容易出错

MATCH ... AGAINST 是唯一合法方式,LIKE '%xxx%'REGEXP 不走全文索引。常见错误包括:

  • 漏写 IN NATURAL LANGUAGE MODEIN Boolean MODE,MySQL 8.0+ 默认是自然语言模式,但低版本可能因 SQL mode 影响解析
  • 搜索词少于 ft_min_word_len(默认 4)会被忽略,比如搜 “php” 返回空 —— 需改配置并重启 MySQL,再重建索引
  • AGAINST('word1 word2') 在自然语言模式下是“相关性排序”,不是“同时包含”,想精确 AND 要用布尔模式:AGAINST('+word1 +word2' IN BOOLEAN MODE)

中文全文检索必须额外处理分词

MySQL 原生不支持中文分词,ft_min_word_len=1 也无效,因为它是按空白和标点切词,中文无空格就整个字段当一个“词”。结果就是:

  • 建了全文索引,MATCH ... AGAINST 永远返回空或极低相关性
  • 即使把字段全转成拼音或加空格,也不符合实际业务分词逻辑

真正可用的方案只有两个:

  • ngram 插件(MySQL 5.7.6+ 内置):设置 ft_parser=ngram,建索引时指定,且 ngram_token_size 控制字元长度(中文一般设 2)
  • 应用层分词(如结巴分词)+ 倒排索引维护,绕开 MySQL 全文能力

ngram 示例:

SET GLOBAL ngram_token_size = 2;<br>ALTER TABLE article ADD FULLTEXT INDEX ft_title_content (title, content) WITH PARSER ngram;

注意:ngram 索引对短词(如单字)仍不友好,且无法支持同义词、拼音容错等高级需求。

text=ZqhQzanResources