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;

发表评论