龙空技术网

MySQL全文索引:中文语义分词检索

风后奇门柳坤生 276

前言:

如今姐妹们对“mysql汉化版”大致比较关怀,你们都需要分析一些“mysql汉化版”的相关文章。那么小编也在网络上搜集了一些关于“mysql汉化版””的相关知识,希望小伙伴们能喜欢,你们快快来学习一下吧!

  前言

  通常情况下,全文检索引擎我们一般会用ES组件(传送门:SpringBoot系列——ElasticSearch),但不是所有业务都有那么大的数据量、那么大的并发要求,MySQL5.7之后内置了ngram分词器,支持中文分词,使用全文索引,即可实现对中文语义分词检索

  MySQL支持全文索引和搜索:  MySQL中的全文索引是FULLTEXT类型的索引。  全文索引只能用于InnoDB或MyISAM表,并且只能为CHAR、VARCHAR或TEXT列创建。  MySQL5.7提供了一个内置的全文ngram解析器,支持中文,日文和韩文(CJK),以及一个可安装的MeCab日文全文解析器插件。  FULLTEXT索引定义可以在创建表时在CREATE TABLE语句中给出,也可以稍后使用ALTER TABLE或CREATE INDEX添加。  对于大型数据集,将数据加载到一个没有FULLTEXT索引的表中,然后在此之后创建索引,比将数据加载到一个已有FULLTEXT索引的表中要快得多。

  MySQL全文检索官方文档介绍:

  查看MySQL版本

-- 查看mysql版本select VERSION()

  创建game游戏表,并插入数据

CREATE TABLE `game`  (  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '游戏名') ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

PS:insert into插入数据sql语句略,可以前往原文查看

  全文索引

  可以在mysql的配置文件my.ini中修改ngram的分词数(默认2)

ngram_token_size=2

  需要重启服务器并重新构建FULLTEXT索引

  创建

  示例:为game表的name字段创建全文索引

-- 创建全文索引CREATE FULLTEXT INDEX ft_index ON game (name) WITH PARSER ngram
  使用

  语法

MATCH (col1,col2,...) AGAINST (expr [search_modifier])search_modifier:  {       IN NATURAL LANGUAGE MODE     | IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION     | IN BOOLEAN MODE     | WITH QUERY EXPANSION  }

  示例:

-- 默认使用自然语言模式:IN NATURAL LANGUAGE MODE-- '刀剑危机',分词结果:'刀剑'、'危机'select name from game WHERE MATCH (name) AGAINST ('刀剑危机')
-- 使用布尔模式:IN BOOLEAN MODE,+和-操作符分别指示一个单词必须存在或不存在,才能进行匹配,'危机*',则表示匹配危机开头的记录select name from game WHERE MATCH (name) AGAINST ('+危机 -孤岛' IN BOOLEAN MODE)
  删除
-- 查询某个表中的索引show index from game-- 删除索引drop index ft_index on game
  后记

  通过全文索引、配合ngram全文解析器,可以实现对中文语义分词检索,在数据量不大、并发要求不高的情况下足够满足我们业务需要,无需上ES全文检索引擎

版权声明

作者:huanzi-qch

出处:

若标题中有“转载”字样,则本文版权归原作者所有。若无转载字样,本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.

标签: #mysql汉化版