MySQL全文检索使用过程记录

 


 

一、全文检索语法规则

MATCH (col1,col2,...) AGAINST (expr [search_modifier])

search_modifier: { IN BOOLEAN MODE | WITH QUERY EXPANSION }

 

例子

 

SELECT * FROM tab_name WHERE MATCH ('列名1, 列名2, ..., 列名n') AGAINST('词1 词2 词3 ... 词n' IN BOOLEAN MODE);

 

具体语法可以参看这篇文章:http://muxucao.cn/news-81.html

 

二、MySQL全文检索的条件限制

1、在MySQL5.6以下,只有MyISAM表支持全文检索。在MySQL5.6以上Innodb引擎表也提供支持全文检索。 
2、相应字段建立FULLTEXT索引
3、5.6以上版本请使用Innodb引擎

 

三、表的建立

创建表

 

CREATE TABLE school_index (
  id int(10) unsigned NOT NULL DEFAULT '0',
  region varchar(30) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  segment varchar(256) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

创建索引

 

ALTER TABLE 表名 add FULLTEXT INDEX 索引名(clumn1,clumn2,...) WITH parser ngram;

ALTER TABLE school_index add FULLTEXT INDEX region_segment(region,segment) WITH parser ngram;

 

数据

 

id      region         segment
100     四川 成都       四川师范大学
101     北京 北京       北京师范大学 国家重点大学 958 211

 

四、与全文检索相关的系统变量:

ft_min_word_len = 全文检索的最小许可字符(默认4,通过 SHOW VARIABLES LIKE 'ft_min_word_len' 可查看),中文通常是两个字就是一个词,所以做中文的话需要修改这个值为2最好。
方法:将ft_min_word_len = 2加到mysql配置文件my.cnf(windows是my.ini)的[mysqld]下面,重启MySQL即可

 

全文检索例子

默认搜索

 

SELECT * FROM school_index WHERE MATCH (region,segment) AGAINST ('师范' IN BOOLEAN MODE);

 

按相关性排序

 

SELECT id, MATCH (region,segment) AGAINST ('北京' IN BOOLEAN MODE) as score FROM school_index WHERE MATCH (region,segment) AGAINST ('北京' IN BOOLEAN MODE) ORDER BY score DESC;

 

参考文档

https://www.2cto.com/database/201704/622275.html