Mysql INNODB和MyIsAM实现全文检索

Posted boonya

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql INNODB和MyIsAM实现全文检索相关的知识,希望对你有一定的参考价值。

目录

SQL整个流程

参考文章


全文搜索引擎实现数据库级别的一直没有测试,今天有空试了一把做下记录。注意INNODB和MyIsAM 对中文的支持力度不一样。

SQL整个流程

-- *****************************mysql 从 5.7.6 版本开始,MySQL就内置了ngram全文解析器,用来支持中文、日文、韩文分词*********************
-- 参考地址:https://www.cnblogs.com/jstarseven/p/13558612.html
-- 当前数据库版本号
select version();
-- INNODB
DROP TABLE IF EXISTS article_plus;

CREATE TABLE `article_plus` (
  `id` varchar(255) DEFAULT NULL,
  `title` varchar(255) DEFAULT NULL,
  `body` longtext,
  FULLTEXT KEY `content_index`(`title`,`body`) WITH PARSER `ngram`
) ENGINE=INNODB DEFAULT CHARSET=utf8;

-- MyIsAM
DROP TABLE IF EXISTS article_plus;

CREATE TABLE `article_plus` (
  `id` varchar(255) DEFAULT NULL,
  `title` varchar(255) DEFAULT NULL,
  `body` longtext,
  FULLTEXT KEY `content_index`(`title`,`body`) WITH PARSER `ngram`
) ENGINE=MyisAM DEFAULT CHARSET=utf8;

-- 查看全文搜索的变量 ft_max_word_len  ft_min_word_len  关键词的最大最小取值范围
show VARIABLES like 'ft%';


 -- 插入内容
INSERT INTO `dbsearch`.`article_plus`(`id`, `title`, `body`) VALUES (1, '中国女队斩获首金', '杨倩为中国女队斩获2020东京奥运会首金。');
INSERT INTO `dbsearch`.`article_plus`(`id`, `title`, `body`) VALUES (2, '中国男子73公斤举重冠军打破世界纪录', '中国(China)男子73公斤举重冠军石智勇,打破世界纪录。');
INSERT INTO `dbsearch`.`article_plus`(`id`, `title`, `body`) VALUES (3, 'Apple', 'Apple');
INSERT INTO `dbsearch`.`article_plus`(`id`, `title`, `body`) VALUES (4, 'Huawei', 'Huawei');
INSERT INTO `dbsearch`.`article_plus`(`id`, `title`, `body`) VALUES (5, 'Huawei 抢占Apple中国市场', 'Huawei 抢占Apple中国市场');

-- 通过 alter table 方式
ALTER TABLE article_plus ADD FULLTEXT INDEX content_index(title,body) WITH PARSER ngram;

-- 通过 create index 方式
CREATE FULLTEXT INDEX content_index ON article_plus(title,body) WITH PARSER ngram;

 -- 删除全文索引
 DROP INDEX content_index ON article_plus;
 
 -- 重建索引
 repair table article_plus quick;

-- 全文搜索中国--MYISAM查不出来
select id,title, MATCH(title,body) AGAINST ('中国') as score 
from article_plus where MATCH(title,body) AGAINST ('中国' IN NATURAL LANGUAGE MODE);

-- 全文搜索中国--MYISAM可以查出来
select id,title, MATCH(title,body) AGAINST ('中国') as score 
from article_plus where MATCH(title,body) AGAINST ('中国' IN BOOLEAN MODE);

-- 全文搜索Apple
select id,title, MATCH(title,body) AGAINST ('Apple') as score 
from article_plus where MATCH(title,body) AGAINST ('Apple' IN NATURAL LANGUAGE MODE);


-- 使用全文索引
SELECT * FROM article_plus WHERE MATCH(title,body) AGAINST('2020');
SELECT * FROM article_plus WHERE MATCH(title,body) AGAINST('中国'  IN BOOLEAN MODE );
SELECT * FROM article_plus WHERE MATCH(title,body) AGAINST('+China');
SELECT * FROM article_plus WHERE MATCH(title,body) AGAINST('-China');
-- 至少包含一个
SELECT * FROM article_plus WHERE MATCH(title,body) AGAINST('Apple');
SELECT * FROM article_plus WHERE MATCH(title,body) AGAINST('Apple Huawei');
-- 两词均在包含
SELECT * FROM article_plus WHERE MATCH(title,body) AGAINST('+Apple+Huawei');
-- 包含Apple但如果包含Huawei它的排名会更高
SELECT * FROM article_plus WHERE MATCH(title,body) AGAINST('+Apple Huawei');
-- 包含Apple但不包含Huawei
SELECT * FROM article_plus WHERE MATCH(title,body) AGAINST('+Apple -Huawei');

参考文章

Mysql 如何实现全文检索,关键词跑分

Mysql使用全文索引(FullText index)

MySQL 5.7 中文全文检索使用教程

以上是关于Mysql INNODB和MyIsAM实现全文检索的主要内容,如果未能解决你的问题,请参考以下文章

mysql 何时使用myisam,何时使用innodb?

mysql中myisam,innodb和memory三个存储引擎的区别

Mysql Search - 用于全文搜索的 InnoDB 和事务与 MyISAM

MySql两大引擎InnoDB和MyISAM

重新学习MySQL数据库7:详解MyIsam与InnoDB引擎的锁实现

Mysql中innodb和myisam