概念:

一般查询都是根据数值范围或者精准的字符串进行数据过滤查询,而全文索引则通过关键字的匹配来进行查询过滤,那么就需要基于相似度的查询,而不是原来的精确数值或字符串比较。

版本支持:

  • 在MySQL 5.7.6之前,全文索引只支持英文全文索引,不支持中文全文索引,需要利用分词器把中文段落预处理拆分成单词,然后存入数据库。
  • 从MySQL 5.7.6开始,MySQL内置了ngram全文解析器,用来支持中文、日文、韩文分词。
  • 只有字段的数据类型为 char、varchar、text 及其系列才可以建全文索引。

ngram全文解析器配置:

MySQL 中使用全局变量ngram_token_size来配置ngram中分词的大小,它的取值范围是1到10,默认值是2。如果需要搜索单字,就要把ngram_token_size设置为1。在默认值是2的情况下,搜索单字是得不到任何结果的。

全局变量ngram_token_size的两种设置方法:
1、启动mysqld命令时

mysqld --ngram_token_size=2

2、修改MySQL配置文件

[mysqld] 
ngram_token_size=2

全文检索模式(两种):

/*
创建表  
‘INT(10)、VARCHAR(20)’指数据类型(长度)   
‘NOT NULL、ZEROFILL、AUTO_INCREMENT、DEFAULT、COMMENT’分别指属性非空、补零、自增、添加默认值、添加备注
‘PRIMARY KEY’指设置主键
‘ENGINE=INNODB’指数据库引擎为INNODB
‘CHARSET=UTF8’指字符集为UTF8
*/ 
CREATE TABLE `goods`( 
`id` INT(10) NOT NULL AUTO_INCREMENT COMMENT '商品表id',
`good_name` VARCHAR(20) NOT NULL DEFAULT 'NULL' COMMENT '商品名',
`good_num` INT(10) NOT NULL DEFAULT 0 COMMENT '商品数量',
`good_barcode` INT(20) ZEROFILL NOT NULL  COMMENT '商品编码',
`add_time` INT(11) COMMENT '添加时间',
PRIMARY KEY (`id`)
) ENGINE=INNODB CHARSET=UTF8;

#插入多条数据
INSERT INTO `goods` (`good_name`,`good_num`,`good_barcode`,`add_time`) VALUES ('手机','6','888','0'),('鞋子','7','999','0'),
('美版手机iphone','3','555','0'),('大陆手机华为','2','666','0'),('袜子','3','777','0');

-- 添加FULLTEXT(全文索引) 
ALTER TABLE `goods` ADD FULLTEXT (`good_name`) WITH PARSER ngram;

1、自然语言模式(NATURAL LANGUAGE MODE)
自然语言模式是MySQL 默认的全文检索模式。自然语言模式不能使用操作符,不能指定关键词必须出现或者必须不能出现等复杂查询。

#不指定模式,默认使用自然语言模式
SELECT * FROM `goods` WHERE MATCH (`good_name`) AGAINST ('手机') ORDER BY id;

结果:

mysql 检索分秒 mysql全文检索 分词_经验分享


2、BOOLEAN模式(BOOLEAN MODE)

BOOLEAN模式可以使用操作符,可以支持指定关键词必须出现或者必须不能出现或者关键词的权重高还是低等复杂查询。

#使用BOOLEAN MODE模式,需要指定 IN BOOLEAN MODE 
SELECT * FROM `goods` WHERE MATCH (`good_name`) AGAINST ('+手机 -美版' IN BOOLEAN MODE);

'apple banana' :无操作符,表示或,要么包含apple,要么包含banana

'+apple +juice':必须同时包含两个词

'+apple macintosh':必须包含apple,但是如果也包含macintosh的话,相关性会更高。

'+apple -macintosh':必须包含apple,同时不能包含macintosh。

'+apple ~macintosh':必须包含apple,但是如果也包含macintosh的话,相关性要比不包含macintosh的记录低。

'+apple +(>juice <pie)':查询必须包含apple和juice或者apple和pie的记录,但是apple juice的相关性要比apple pie高。

'apple*':查询包含以apple开头的单词的记录,如apple、apples、applet。

'"some words"':使用双引号把要搜素的词括起来,效果类似于like '%some words%',例如“some words of wisdom”会被匹配到,而“some noise words”就不会被匹配。