MySQL全文索引-fulltext

MySQL 5.6 之前的版本只有MyISAM存储引擎支持全文索引,5.6 及之后的版本,InnoDB 才开始支持。全文索引相对于like %这种模糊查询效率更高,查询方式更多样,查询结果也更准确。在全文检索领域,全文索引功能非常有用,比如博客类网站,可以对文章标题,文章内容创建全文索引,用户可以根据关键词搜索想要的文章。

1、创建全文索引

能够创建全文索引的字段类型必须是char,varchar,text等这类字符文本类型。

创建一个带有全文索引的表:
CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body)
) ENGINE=InnoDB;

通过ALTER TABLE创建、删除全文索引:

创建全文索引

ALTER TABLE articles ADD FULLTEXT KEY ft_title(title);

删除索引

ALTER TABLE articles DROP INDEX ft_title;

2、查询全文索引

MySQL使用MATCH AGAINST语法来查询全文索引,支持自然语言和布尔类型两种查询模式。

自然语言模式查询:

示例:
mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST (‘database’ IN NATURAL LANGUAGE MODE);
±—±------------------±-----------------------------------------+
| id | title | body |
±—±------------------±-----------------------------------------+
| 1 | MySQL Tutorial | DBMS stands for DataBase … |
| 5 | MySQL vs. YourSQL | In the following database comparison … |
±—±------------------±-----------------------------------------+
2 rows in set (0.01 sec)

布尔类型模式查询:

+表示AND
-表示NOT
没有符号的表示OR

示例:
mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST (’+MySQL -YourSQL’ IN BOOLEAN MODE);
±—±----------------------±------------------------------------+
| id | title | body |
±—±----------------------±------------------------------------+
| 6 | MySQL Security | When configured properly, MySQL … |
| 1 | MySQL Tutorial | DBMS stands for DataBase … |
| 2 | How To Use MySQL Well | After you went through a … |
| 3 | Optimizing MySQL | In this tutorial we will show … |
| 4 | 1001 MySQL Tricks | 1. Never run mysqld as root. 2. … |
±—±----------------------±------------------------------------+
5 rows in set (0.02 sec)

+MySQL表示必须包含MySQL
-YourSQL表示必须不包含YourSQL

3、相关性得分

查询结果的相关性得分,通过计算查询词与索引匹配的相似度,计算得分,全文索引查询结果默认按相关性得分倒序排序。
mysql> SELECT title,MATCH (title,body) AGAINST (’+MySQL -YourSQL’ IN BOOLEAN MODE) as score FROM articles WHERE MATCH (title,body) AGAINST (’+MySQL -YourSQL’ IN BOOLEAN MODE);
±----------------------±---------------------------+
| title | score |
±----------------------±---------------------------+
| MySQL Security | 0.000000003771856604828372 |
| MySQL Tutorial | 0.000000001885928302414186 |
| How To Use MySQL Well | 0.000000001885928302414186 |
| Optimizing MySQL | 0.000000001885928302414186 |
| 1001 MySQL Tricks | 0.000000001885928302414186 |
±----------------------±---------------------------+
5 rows in set (0.00 sec)

4、大小写敏感

如果字段的字符集校验规则是大小写敏感的,那么全文索引匹配时也是大小写敏感,否则就是大小写不敏感。通常校验规则名称带bin的都是大小写敏感的,比如utf8mb4_bin。名称带cs一般也是大小写敏感的,比如latin1_general_cs。名称带ci一般是大小写不敏感的,比如utf8mb4_general_ci。

5、支持中文

从MySQL 5.7.6开始,MySQL内置了ngram全文解析器,用来支持中文分词。设置全局变量 ngram_token_size=1,以支持单个字检索。创建全文索引时,加上WITH PARSER ngram,如下:

alter table blog add fulltext ft_title(title) WITH PARSER ngram;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值