MySQL中文全文索引

mysql FULLTEXT
创建于:2019年09月04日 更新于:2019年09月04日

Mysql在5.7之后已经支持全文索引中文检索
但是只能在InnoDB、MyISAM的CHAR、VARCHAR或者TEXT的字段上创建全文索引支持。

#创建
mysql> CREATE TABLE article (
    id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    title VARCHAR(200),
    body TEXT,
    FULLTEXT (title,body) WITH PARSER ngram
) ENGINE=InnoDB;

# 修改
mysql> ALTER TABLE `article`
ADD FULLTEXT INDEX `ft_title_body` (`title`, `body`) WITH PARSER ngram;

# WITH PARSER ngram :使用中文索引一定要带上中文索引插件,不然查出来的数据可能不会是你想要的。之前使用Navicat工具直接创建的全文索引,查询后数据总是不对。后来才找到是少了中文索引插件

使用全文索引的格式: MATCH (column1,column2,…) AGAINST (‘string’)

mysql> select title from article where match(title, content) against('英语');
+-----------------------------------------+
| title                                   |
+-----------------------------------------+
| 学习英语的捷径                          |
| 主谓宾的哲学原理                        |
| 分清英语名词的可数和不可数              |
| 蛋模型                                  |
| 公式运行的微调                          |
| 真的有就近原则吗?                      |
| 定状的定位与分层                        |
| 定语、状语的汉化                        |
+-----------------------------------------+
8 rows in set (0.00 sec)

常用的全文检索模式有两种:
1、自然语言模式(NATURAL LANGUAGE MODE) ,
自然语言模式是MySQL 默认的全文检索模式。自然语言模式不能使用操作符,不能指定关键词必须出现或者必须不能出现等复杂查询。
2、BOOLEAN模式(BOOLEAN MODE)
BOOLEAN模式可以使用操作符,可以支持指定关键词必须出现或者必须不能出现或者关键词的权重高还是低等复杂查询。

#使用 * 查询单个汉字
mysql> SELECT title FROM article where match(title, content) against('*英*' IN BOOLEAN MODE);
+-----------------------------------------+
| title                                   |
+-----------------------------------------+
| 学习英语的捷径                          |
| 主谓宾的哲学原理                        |
| 定状的定位与分层                        |
| 蛋模型                                  |
| 公式运行的微调                          |
| 分清英语名词的可数和不可数              |
| 真的有就近原则吗?                      |
| python AES加密解密                      |
| 定语、状语的汉化                        |
+-----------------------------------------+
9 rows in set (0.01 sec)