mysql全文索引简介

工具安装

本文所介绍的全文索引是基于mysql5.7版本的,官方相关文档在这里,本文也只是在文档和网上其他资料的基础上进行翻译整理。

语法:

1
2
3
4
5
6
7
8
9
match (col1,col2,...) against (expr [search_modifier])
search_modifier:
{
in natural language mode
| in natural language mode with query expansion
| in boolean mode
| with query expansion
}

MySQL 已经支持全文索引搜索:

  • mysql中的全文检索使用的是FULLTEXT类型的索引;
  • Full-Text索引只能被用在InnoDB和MyISAm引擎的表上面,并且只能在CHAR ,VARCHAR和TEXT字段类型的列上;
  • 在MySQL 5.7.6 中提供了内置的支持中日韩全文的NGRAM分析器,同时提供了针对日语的可安装的全文解析插件;
  • FULLTEXT索引的定义可以在表用CREATE TABLE被创建时,或者ALTER TABLE 和 ALTER INDEX;
  • 对于大数据集合,把数据插入一个有FULLTEXT索引的表要比把数据插入一个没有FULLTEXT表然后在表上机上FULLTEXT索引要慢(建议对于大数据量的表做全文索引时,先建立表然后把表上加上FULLTEXT索引)

有三种全文检索类型:

  • 自然语言模式IN NATURAL LANGUAGE MODE,即通过MATCH AGAINST 传递某个特定的字符串来进行检索。
  • 布尔模式IN BOOLEAN MODE,可以为检索的字符串增加操作符,例如“+”表示必须包含,“-”表示不包含,“*”表示通配符(这种情况, 即使传递的字符串较小或出现在停词中,也不会被过滤掉),其他还有很多特殊的布尔操作符,可以通过如下参数控制:
1
2
3
4
5
6
7
mysql> show variables like '%ft_boolean_syntax%';
+-------------------+----------------+
| Variable_name | Value |
+-------------------+----------------+
| ft_boolean_syntax | + -><()~*:""&| |
+-------------------+----------------+
1 row in set (0.00 sec)
  • 查询扩展模式WITH QUERY EXPANSION, 这种模式是自然语言模式下的一个变种,会执行两次检索,第一次使用给定的短语进行检索,第二次是结合第一次相关性比较高的行进行检索。

创建全文索引:

1
2
3
4
5
6
CREATE TABLE test_article (
int id auto_increment primary key,
varchar(45) title not null,
text text_info not null,
fulltext(`title`,`text_info`)
) ENGINE= InnoDB;

或者

1
create table ft_test(id int, content text, fulltext (content) with parser ngram);

修改配置文件

全局变量ngram_token_size指定了ngram分词法的词语长度,默认为2。ngram_token_size 是一个只读变量,每次修改它的值时都需要重建ngram算法的全文索引,否则改变不会生效;

在配置文件的 mysqld 标签下修改 ngram_token_size 即可;

daodaoliang wechat
点击上面图片后用微信扫描,你就能认识一个有趣的灵魂了呀。
Fork me on GitHub