MySQL 中文全文检索教程

在MySQL 5.7.6之前,全文索引只支持英文全文索引,不支持中文全文索引,需要利用分词器把中文段落预处理拆分成单词,然后存入数据库。
从MySQL 5.7.6开始,MySQL内置了ngram全文解析器,用来支持中文、日文、韩文分词。

ngram全文解析器

MySQL 中使用全局变量ngram_token_size来配置ngram中n的大小,它的取值范围是1到10,默认值是2。通常ngram_token_size设置为要查询的单词的最小字数。如果需要搜索单字,就要把ngram_token_size设置为1。在默认值是2的情况下,搜索单字是得不到任何结果的。因为中文单词最少是两个汉字,推荐使用默认值2。

全局变量ngram_token_size的两种设置方法:

  1. 启动mysqld命令时
mysqld --ngram_token_size=2
  1. 修改MySQL配置文件
[mysqld] 
ngram_token_size=2

创建全文索引

  1. 创建表的时候创建全文索引
CREATE TABLE personal (
    id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    name VARCHAR (20),
    undergo TEXT,
    FULLTEXT (name, undergo) WITH PARSER ngram
) ENGINE = INNODB;
  1. 直接通过create index的方式
CREATE FULLTEXT INDEX ft_index ON personal (name,undergo) WITH PARSER ngram;
  1. 通过 alter table 的方式来添加
ALTER TABLE personal ADD FULLTEXT INDEX ft_index (name,undergo) WITH PARSER ngram;

全文检索模式

常用的全文检索模式有两种:

  1. 自然语言模式(NATURAL LANGUAGE MODE)

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

  2. BOOLEAN模式(BOOLEAN MODE)

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

SELECT * FROM personal
WHERE MATCH (name,undergo)
AGAINST ('张三 PHP' IN NATURAL LANGUAGE MODE);

// 不指定模式,默认使用自然语言模式
SELECT * FROM personal
WHERE MATCH (name,undergo)
AGAINST ('PHP 张三');

在使用过程中如果需要满足多个检索字符,可以采用and连接多个MATCH进行查询。

注意:
使用过程中的50%的门坎限制,当查询结果很多,几乎所有记录都有,或者极少的数据,都有可能会返回非所期望的结果,但是可用IN BOOLEAN MODE即可以避开50%的限制,至于要使用的时候在后面加上即可,例如:

SELECT * FROM 表名称 WHERE MATCH(字段名1) AGAINST(‘条件字符串1IN BOOLEAN MODE)

实例:
如果我要查询人才简历表中的带有 互联网、框架 两个字符的检索结果,我需要这样写,需要注意50%限制的问题,查询出来的数据更准确:

select * from personal where MATCH('undergo') AGAINST('互联网*' IN BOOLEAN MODE) and MATCH('undergo') AGAINST('框架*' IN BOOLEAN MODE)

搜索语法规则

+ 一定要有(不含有该关键词的数据条均被忽略)。
- 不可以有(排除指定关键词,含有该关键词的均被忽略)。
> 提高该条匹配数据的权重值。
< 降低该条匹配数据的权重值。
~ 将其相关性由正转负,表示拥有该字会降低相关性(但不像 - 将之排除),只是排在较后面权重值降低。
* 万用字,不像其他语法放在前面,这个要接在字符串后面。
" " 用双引号将一段句子包起来表示要完全相符,不可拆字。

下面的例子演示了BOOLEAN模式下运算符的使用方式:

'互联网 框架' 
无操作符,表示或,要么包含互联网,要么包含框架

'+互联网 +框架'
必须同时包含两个词

'+互联网 框架'
必须包含互联网,但是如果也包含框架的话,相关性会更高。

'+互联网 -框架'
必须包含互联网,同时不能包含框架。

'+互联网 ~框架'
必须包含互联网,但是如果也包含框架的话,相关性要比不包含框架的记录低。

'+互联网 +(>框架 <数据库)'
查询必须包含互联网和框架或者互联网和数据库的记录,但是互联网 框架的相关性要比互联网 数据库高。

'互联网*'
查询包含以互联网开头的单词的记录,如互联网、互联网公司。

'"some words"'
使用双引号把要搜素的词括起来,效果类似于like '%some words%',
例如“some words of wisdom”会被匹配到,而“some noise words”就不会被匹配。
  • 只能在类型为CHAR、VARCHAR或者TEXT的字段上创建全文索引。

  • 全文索引只支持InnoDB和MyISAM引擎。

  • MATCH (columnName) AGAINST (‘keywords’)。MATCH()函数使用的字段名,必须要与创建全文索引时指定的字段名一致。如上面的示例,MATCH (title,body)使用的字段名与全文索引ft_articles(title,body)定义的字段名一致。如果要对title或者body字段分别进行查询,就需要在title和body字段上分别创建新的全文索引。

  • MATCH()函数使用的字段名只能是同一个表的字段,因为全文索引不能够跨多个表进行检索。

  • 如果要导入大数据集,使用先导入数据再在表上创建全文索引的方式要比先在表上创建全文索引再导入数据的方式快很多,所以全文索引是很影响TPS的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值