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)
上一篇: Lucene/Solr开发经验
下一篇: 抖音商品橱窗功能怎么开通