千家信息网

mysql5.7 全文索引不支持中文分词怎么办

发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,本篇文章为大家展示了mysql5.7 全文索引不支持中文分词怎么办,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在MySQL 5.7.6之前,全文索引只支持英
千家信息网最后更新 2024年09月22日mysql5.7 全文索引不支持中文分词怎么办

本篇文章为大家展示了mysql5.7 全文索引不支持中文分词怎么办,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

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

ngram全文解析器

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。

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

mysqld --ngram_token_size=2

2、修改MySQL配置文件

[mysqld] ngram_token_size=2
创建全文索引

1、创建表的同时创建全文索引

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;

2、通过 alter table 的方式来添加

ALTER TABLE articles ADD FULLTEXT INDEX ft_index (title,body) WITH PARSER ngram;

3、直接通过create index的方式

CREATE FULLTEXT INDEX ft_index ON articles (title,body) WITH PARSER ngram;
全文检索模式

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

示例
SELECT * FROM articlesWHERE MATCH (title,body)AGAINST ('一路 一带' IN NATURAL LANGUAGE MODE);// 不指定模式,默认使用自然语言模式SELECT * FROM articlesWHERE MATCH (title,body)AGAINST ('一路 一带');

示例

上面的示例返回结果会自动按照相关性排序,相关性高的在前面。相关性的值是一个非负浮点数,0表示无相关性。

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

示例

// 获取匹配结果记录数SELECT COUNT(*) FROM articlesWHERE MATCH (title,body)AGAINST ('一路 一带' IN NATURAL LANGUAGE MODE);

可以使用BOOLEAN模式执行高级查询。

// 必须包含"腾讯"SELECT * FROM articlesWHERE MATCH (title,body)AGAINST ('+腾讯' IN BOOLEAN MODE);

示例

// 必须包含"腾讯",但是不能包含"通讯工具"SELECT * FROM articlesWHERE 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 
注意
  • 只能在类型为CHAR、VARCHAR或者TEXT的字段上创建全文索引。

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

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

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

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

上述内容就是mysql5.7 全文索引不支持中文分词怎么办,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

0