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:, & # 39;生& # 39;,& # 39;日& # 39;,& # 39;快& # 39;,& # 39;乐& # 39;,
  n=2:, & # 39;生日& # 39;,,& # 39;日快& # 39;,,& # 39;快乐& # 39;,
  n=3: & # 39;生日快& # 39;,,& # 39;日快乐& # 39;,
  n=4:, & # 39;生日快乐& # 39;

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 键,
  ,,,title  VARCHAR  (200),
  ,,,body 文本,
  ,,,FULLTEXT (标题、,正文),WITH  PARSER  ngram
  ),ENGINE =, INNODB。

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

 ALTER  TABLE  articles  ADD  FULLTEXT  INDEX  ft_index (标题、主体),WITH  PARSER  ngram; 

3,直接通过创建索引的方式

 CREATE  FULLTEXT  INDEX  ft_index 提醒articles (标题、主体),WITH  PARSER  ngram; 
全文检索模式

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

示例
 SELECT  *,得到的文章
  WHERE  MATCH (标题、身体)
  AGAINST (& # 39;一路,一带& # 39;,拷贝NATURAL  LANGUAGE 模式);//,不指定模式,默认使用自然语言模式
  SELECT  *,得到的文章
  WHERE  MATCH (标题、身体)
  AGAINST (& # 39;一路,一带& # 39;);

示例

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

//,获取相关性的值
  SELECT  id、标题
  MATCH (标题、身体),AGAINST (& # 39;手机& # 39;,拷贝NATURAL  LANGUAGE 模式),AS 分数
  得到的文章
  ORDER  BY  score  DESC; 

示例

//,获取匹配结果记录数
  SELECT  COUNT(*),得到的文章
  WHERE  MATCH (标题、身体)
  AGAINST (& # 39;一路,一带& # 39;,拷贝NATURAL  LANGUAGE 模式),

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

//,必须包含“腾讯“;
  SELECT  *,得到的文章
  WHERE  MATCH (标题、身体)
  AGAINST (& # 39; +腾讯& # 39;,拷贝BOOLEAN 模式),

示例

//,必须包含“腾讯“,但是不能包含“通讯工具“;
  SELECT  *,得到的文章
  WHERE  MATCH (标题、身体)
  AGAINST (& # 39; +腾讯,——通讯工具& # 39;,拷贝BOOLEAN 模式),

示例

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

 & # 39; apple 香蕉,,
  无操作符,表示,或要么包含苹果,要么包含香蕉
  
  & # 39;+ apple  +果汁# 39;
  必须同时包含两个词
  
  & # 39;+ apple  macintosh # 39;
  必须包含苹果,但是如果也包含macintosh的话,相关性会更高。
  
  & # 39;+ apple  -macintosh& # 39;
  必须包含苹果,同时不能包含麦金塔电脑。
  
  & # 39;+ apple  ~ macintosh # 39;
  必须包含苹果,但是如果也包含macintosh的话,相关性要比不包含macintosh的记录低。
  
  & # 39;+ apple  +(在juice  & lt;派)& # 39;
  查询必须包含苹果和果汁或者苹果和蛋糕的记录,但是apple 果汁的相关性要比apple 派高。
  
  & # 39;苹果* & # 39;
  查询包含以苹果开头的单词的记录,如苹果,苹果,applet。
  
  & # 39;“some  words" & # 39;
  使用双引号把要搜素的词括起来,效果类似于like  & # 39; % some 词汇% & # 39;
  例如“some  words  of 智慧”会被匹配到,而“some  noise 词”就不会被匹配。

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