欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mysql全文索引的使用

程序员文章站 2022-07-01 09:19:12
...
  • 在5.6版本之前只有MyISAM存储引擎支持全文索引
  • 在5.6版本InnoDB加入的对全文索引的支持, 但不支持中文全文索引
  • 在5.7.6版本, MySQL内置了ngram全文解析器, 用来支持亚洲语种的分词
  • 当前测试时数据库相关配置
    • ngram_token_size: 2 ngram全文解析器单词粒度
    • ft_min_word_len: 1 默认4
    • ft_max_word_len: 84
    • innodb_ft_min_token_size: 1 默认3
    • innodb_ft_max_token_size: 84

1. 建表

CREATE TABLE `test` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `text` text,
  `ints` text,
  PRIMARY KEY (`id`),
  FULLTEXT KEY `ints` (`ints`),
  FULLTEXT KEY `text` (`text`) with parser ngram #需要支持中文全文索引必须指定ngram全文解析器
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2. 测试数据

INSERT INTO `csws_pro_copy`.`test` (`id`, `text`, `ints`) VALUES (1, '中文全文索引测试', '1,2,3,4,5,10,111,222');
INSERT INTO `csws_pro_copy`.`test` (`id`, `text`, `ints`) VALUES (2, '中国人使用中文', '111');

3. 中文搜索

SELECT * FROM test WHERE match(`text`) against('全文')

1 中文全文索引测试 1,2,3,4,5,10,111,222

ngram分词规则是根据ngram_token_size长度将连续字符组成索引, 比如上述搜索使用 “中文”, “文全”, “全文”, “文索” 等都可搜到结果, 这里的分词不会按照中文语义进行分词

4. 英文或数字搜索

搜索包含数字1的数据, 并不会搜索到10和111

SELECT * FROM test WHERE match(`ints`) against('1')

1 中文全文索引测试 1,2,3,4,5,10,111,222

5. 搜索模式

自然语言模式, 也是默认模式

SELECT * FROM test WHERE match(`text`) against('全文' IN NATURAL LANGUAGE MODE)

布尔模式

# 查询包含中文且不包含全文的数据
SELECT * FROM test WHERE match(`text`) against('中文 -全文' IN BOOLEAN MODE)