mysql5.7以下如何支持中文全文索引

mysql5.7以下如何支持中文全文索引


在MySQL 5.7.6之前,全文索引只支持英文全文索引,不支持中文全文索引,需要利用分词器把中文段落预处理拆分成单词,然后存入数据库

从MySQL 5.7.6开始,MySQL内置了ngram全文解析器,用来支持中文、日文、韩文分词。

那我们先看5.7怎么进行中文全文索引,

本文的MySQL 版本是5.7.22,InnoDB数据库引擎。

ngram就是一段文字里面连续的n个字的序列。ngram全文解析器能够对文本进行分词,每个单词是连续的n个字的序列。例如,用ngram全文解析器对“生日快乐”进行分词:

n=1: '生', '日', '快', '乐' 
n=2: '生日', '日快', '快乐' 
n=3: '生日快', '日快乐' 
n=4: '生日快乐'

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

那么怎么修改这个变量值呢,打开mysql配置文件

ngram_token_size=2

好,现在我们用5.7来创建一个索引

CREATE TABLE articles (
    id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    title VARCHAR (200),
    body TEXT,
    FULLTEXT (title, body) WITH PARSER ngram
) ENGINE = INNODB;

当然也可以通过下面的方式进行添加全文索引
ALTER TABLE articles ADD FULLTEXT INDEX ft_index (title,body) WITH PARSER ngram;
或者
CREATE FULLTEXT INDEX ft_index ON articles (title,body) WITH PARSER ngram;

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

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

SELECT * FROM articles
WHERE MATCH (title,body)
AGAINST ('一路 一带' IN NATURAL LANGUAGE MODE);

// 不指定模式,默认使用自然语言模式
SELECT * FROM articles
WHERE MATCH (title,body)
AGAINST ('一路 一带');

还可以对相关性进行排序

// 获取相关性的值
SELECT id,title,
MATCH (title,body) AGAINST ('手机' IN NATURAL LANGUAGE MODE) AS score
FROM articles
ORDER BY score DESC;

使用boolean模式进行匹配

// 必须包含"社区"
SELECT * FROM articles
WHERE MATCH (title,body)
AGAINST ('+社区' IN BOOLEAN MODE);

// 必须包含"社区",但是不能包含"通讯工具"
SELECT * FROM articles
WHERE MATCH (title,body)
AGAINST ('+社区 -通讯工具' IN BOOLEAN MODE);

下面几种演示一下Boolean模式的操作

'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”就不会被匹配。

mysql全文索引注意事项

1、只能在类型为CHAR、VARCHAR或者TEXT的字段上创建全文索引。

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

3、MATCH (columnName) AGAINST ('keywords')。MATCH()函数使用的字段名,必须要与创建全文索引时指定的字段名一致。如上面的示例,MATCH (title,body)使用的字段名与全文索引ft_articles(title,body)

4、定义的字段名一致。如果要对title或者body字段分别进行查询,就需要在title和body字段上分别创建新的全文索引。

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

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

那么对于低于5.7版本的mysql怎么进行中文索引?

可以对中文进行转码变成base64或者全拼音,然后进行匹配

对于5.7以下mysql全文索引创建方式为

ALTER TABLE `article`
ADD FULLTEXT INDEX ft_body (`body`)

或者

CREATE FULLTEXT INDEX ft_body ON `article` (`body`)

那么怎么删除全文索引呢

DROP INDEX ft_body ON article.body ;

或者

ALTER TABLE article.body DROP INDEX ft_body

那么下一步可以使用bfwsoa框架自带的汉字转拼音存储到这个字段中

$key="BFW 中文索引 字段实例";
echo StringUtil::ToPinyin($key,"all");

输出

BFW zhongwensuoyin ziduanshili

ok,存入全文索引的字段中,以后就将搜素字段拼音话,然后再执行全文搜查



{{collectdata}}

网友评论0