0%

MySql使用全文索引FullText

文章字数:371,阅读全文大约需要1分钟

全文索引,通过建立倒排索引,可以极大的提升索引效率,用于判断字段是否包含关键词的问题,以替代like %xx%

创建表时指定全文索引

1
2
3
4
5
6
CREATE TABLE test (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT(title, body) WITH PARSER ngram ## 全文索引,使用ngram分词模型
) ENGINE = INNODB DEFAULT CHARSET=utf8mb4 COMMENT='test表';

表中添加全文索引

1
ALTER TABLE article ADD FULLTEXT INDEX title_body_index (title,body) WITH PARSER ngram;

使用

  1. 默认模式
1
2
3
SELECT * FROM article WHERE MATCH (title,body) AGAINST ('精神' IN NATURAL LANGUAGE MODE);
## LANGUAGE 模式是默认的,所以也可以不指定
SELECT * FROM article WHERE MATCH (title,body) AGAINST ('精神');
  1. 带操作符模式
1
2
## +代表必须出现 -代表必须不出现 无符号代表可有可无,有的话排列更靠前
SELECT * FROM article WHERE MATCH (title,body) AGAINST ('+精神 -关键词 关键词2' IN BOOLEAN MODE);

自然语言的全文索引

  • LANGUAGE MODE
  • 用于匹配文章和关键字的匹配程度
  • 当一个次在超过50%的文章中都出现过,就不会被查询
  • 所以数据数需要超过4条

布尔全文索引

  • show variables like '%ft%';查看相应参数
1
2
3
4
5
6
7
8
// 默认的搜索最小单词长度和最大单词长度,中文最小应该改成1
// MyISAM
ft_min_word_len = 4;
ft_max_word_len = 84;

// InnoDB
innodb_ft_min_token_size = 3;
innodb_ft_max_token_size = 84;
  1. + 必须包含该词
  2. - 必须不包含该词
  3. > 提高该词的相关性,查询的结果靠前
  4. < 降低该词的相关性,查询的结果靠后
  5. * 星号 通配符,只能接在词后面