mysql使用全文索引+ngram全文解析器进行全文检索

表结构:表名  gamedb   主键  id   问题类型  type  问题  issue  答案 answer

需求

现在有个游戏资料库储存在mysql中,客户端进行搜索,需要对三个字段进行匹配,得到三个字段的相关性,选出三个字段中相关性最大的值进行排序,以此获取相关性最高的数据。如以上表,用户搜索的问题是 “如何获得更多游戏积分?”,然后我需要在(type,issue,answer)三个字段里面进行匹配,找到和这个问题相关性最高的数据。

思路

使用MySQL全文检索进行关键词搜索并按相关性得分排序的查询语句。本人mysql版本5.7.24

mysql全文检索,对mysql版本有什么要求?
  1. 从MySQL 5.6版本开始,InnoDB存储引擎开始支持全文索引。而在MySQL 5.7版本之后,通过使用ngram插件开始支持中文全文索引。在MySQL 5.7.6之前,全文索引只支持英文全文索引,不支持中文全文索引。
  2. 对于MySQL 5.6版本之前,只有MyISAM存储引擎支持全文索引,而从MySQL 5.6版本开始,InnoDB和MyISAM均支持全文索引。
  3. 需要注意的是,MySQL的全文索引对中文的支持存在一定限制,因此在实际应用中可能需要采用其它方案去替代。
ngram全文分析器
  • 什么是ngram?

ngram是全文解析器能够对文本进行分词,中文分词用 ngram_token_size 设定分词的大小,ngram_token_size 的值就是连续n个字的序列
示例:使用ngram对于全文索引进行分词

ngram_token_size =1,分词为 ‘全‘,’文‘,’索‘,’引‘
ngram_token_size =2,分词为 ‘全文‘,’文索‘,’索引‘
ngram_token_size =3,分词为 ‘全文索‘,’文索引‘
ngram_token_size =4,分词为 ‘全文索引‘

  • 如何查看配置ngram_token_size?
#查看默认分词大小 ngram_token_size=2
show variables like '%token%';

查询结果

        

innodb_ft_min_token_size
默认3,表示最小3个字符作为一个关键词,增大该值可减少全文索引的大小
innodb_ft_max_token_size
默认84,表示最大84个字符作为一个关键词,限制该值可减少全文索引的大小
ngram_token_size
默认2,表示2个字符作为内置分词解析器的一个关键词,如对“abcd”建立全文索引,关键词为’ab’,‘bc’,‘cd’
当使用ngram分词解析器时,innodb_ft_min_token_size和innodb_ft_max_token_size 无效

  • 怎么配置ngram?

1、ngram可以作为启动字符串的一部分或者在配置文件中设置
启动字符串:

mysqld --ngram_token_size=2

2、配置文件(my.ini):
以windos系统为例,首先找到my.ini文件(默认安装路径:C:\ProgramData\MySQL\MySQL Server 5.7\my.ini),编辑该文件,在文件后加上如下配置:

# 设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
#设置3306端口
port = 3306server_id=100
# 设置mysql的安装目录
basedir=D:\mysql-5.7.24-winx64
# 设置mysql数据库的数据的存放目录
datadir=D:\mysql-5.7.24-winx64\data
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB# 全文检索分词数
ngram_token_size=2

配置完成后重启服务

  • 如何创建全文索引并且使用ngram

1、通过建表语句建立
 

CREATE TABLE `full_search_test` (`id` int unsigned NOT NULL AUTO_INCREMENT,`author` varchar(200) COLLATE utf8mb4_general_ci DEFAULT NULL,`title` varchar(200) COLLATE utf8mb4_general_ci DEFAULT NULL,`content` text COLLATE utf8mb4_general_ci,PRIMARY KEY (`id`),FULLTEXT KEY `full_index_title` (`title`) WITH PARSER `ngram`  
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci

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

ALTER TABLE full_search_test ADD FULLTEXT INDEX full_index_title(title) WITH PARSER ngram;

3、直接通过create index的方式

#为title创建全文索引并且使用ngram全文解析器进行分词
CREATE FULLTEXT INDEX full_index_title ON full_search_test(title) WITH PARSER `ngram`;

实际案例

  • 创建表 
CREATE TABLE gamedb (id INT AUTO_INCREMENT PRIMARY KEY,type VARCHAR(255),issue VARCHAR(255),answer VARCHAR(255)
);
  • typeissueanswer字段创建全文索引 
    CREATE FULLTEXT INDEX gamedb_index_type ON gamedb(type);
    CREATE FULLTEXT INDEX gamedb_index_issue ON gamedb(issue);
    CREATE FULLTEXT INDEX gamedb_index_answer ON gamedb(answer);
    

检测这三个字段 

SELECT *,(MATCH(type) AGAINST('我喜欢扩展包包')) AS score_type,(MATCH(issue) AGAINST('我喜欢扩展包包')) AS score_issue,(MATCH(answer) AGAINST('我喜欢扩展包包')) AS score_answer
FROM gamedb
WHERE MATCH(type) AGAINST('我喜欢扩展包包') ORMATCH(issue) AGAINST('我喜欢扩展包包') ORMATCH(answer) AGAINST('我喜欢扩展包包');

缺点

n-gram分词是一种基于统计的分词方法,它将文本按照n个连续的词为单位进行切分。虽然n-gram分词在很多应用中表现良好,但也存在一些缺点:

  1. 歧义处理困难: n-gram分词无法处理词汇歧义,因为它只考虑了相邻词汇之间的关系,而没有考虑上下文的语境。在一些语境下,同一个词可能有不同的含义,而n-gram分词无法准确捕捉这种语境。

  2. 未考虑词序信息: n-gram分词方法忽略了词汇之间的具体顺序信息,只考虑了相邻词的组合。然而,在自然语言中,词汇的排列顺序对于理解文本意义非常重要,而n-gram分词无法很好地捕捉这种词序信息。

  3. 数据稀疏性: 随着n的增大,n-gram模型需要更多的训练数据来准确地估计参数,但在实际应用中,获得大规模标注数据并不总是容易。这会导致模型对于较长的n-gram组合的泛化能力下降。

  4. 词汇变化问题: 对于一些具有词形变化、时态变化等特性的语言,n-gram分词可能面临词汇变化导致的困扰。例如,动词的不同时态形式可能被认为是不同的n-gram,导致模型难以正确处理这种变化。

  5. 无法处理未知词汇: n-gram模型无法处理未在训练数据中出现的词汇,因为它们在统计信息中没有相应的记录。对于生僻词、新词或专业名词等,n-gram分词可能表现较差。

  6. 效率问题:n-gram分词需要构建和维护大规模的n-gram模型,这可能导致内存消耗较大,并且在处理大量文本时可能会导致较慢的分词速度。

最后没有采纳这种方法,由于ngram分词不怎么灵活,不同的分词大小可能会在分词结果和性能方面有所差异。较小的n值(如2-gram)可能更适合处理短语和常见词语,而较大的n值(如4-gram)可能更适合处理长词和特定领域的术语。这里只是记录一下使用方法.........

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/231448.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MYSQL】-库的操作

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

前端框架如何帮助开发者构建应用程序?

目录 前言 1.项目简介 2. 平台特性 2.1 构架特性 2.2 功能特性 3. 整体架构 4. 技术栈 平台的开放性: 平台高拓展性: 5. 基础功能及搭建 5.1 代码生成器 5.2 工作流程 5.3 门户设计 5.4 大屏设计 5.5 报表设计 5.6 第三方登录 5.7 多租…

vscode 同步插件

vscode 扩展商店链接 https://marketplace.visualstudio.com/vscode settings sync 插件

apache shiro 反序列化漏洞解决方案

apache shiro 反序列化漏洞解决方案 反序列化漏洞解决方案产生原因解决方案1:1.升级shiro至最新版本1.7.1解决方案2:修改rememberMe默认密钥,生成随机密钥。 反序列化漏洞解决方案 反序列化漏洞介绍 序列化:把对象转换为字符串或…

opencv、pillow和matplotlib的区别

参考文章:Python学习小技巧——opencv、pillow和matplotlib的区别_pillow和opencv区别-CSDN博客 1 概念的比较: opencv (1)默认不支持中文文件名 (2)数据为numpy,维度:高&#xff…

图片速览 PoseGPT:基于量化的 3D 人体运动生成和预测(VQVAE)

papercodehttps://arxiv.org/pdf/2210.10542.pdfhttps://europe.naverlabs.com/research/computer-vision/posegpt/ 方法 将动作压缩到离散空间。使用GPT类的模型预测未来动作的离散索引。使用解码器解码动作得到输出。 效果 提出的方法在HumanAct12(一个标准但小规…

AWS-WAF-CDN基于速率rate的永久黑名单方案(基于lambda实现)

参考方案(有坑), 所以产生了这篇博客: 点击跳转 1. 部署waf (有则跳过) 必须存在一个rate速率规则,后面的方案堆栈要用 新建rate速率规则 关联cdn资源 2.部署堆栈 (美国东部 (弗吉尼亚北部 …

短视频账号剪辑矩阵系统源码技术3年自研开发框架

短视频账号剪辑矩阵系统源码技术3年自研开发框架,这个市场截至到现在基本上违规开发的,没有正规接口开发的,基本上都已经筛选完了,目前各位技术者公司想要考察的话,只需要甄别3方面即可 1.剪辑是不是自己核心研发的&a…

正则表达式:简化模式匹配的利器

正则表达式:简化模式匹配的利器 一、正则表达式简介1.1 正则表达式介绍1.2 正则表达式使用场景 二、正则表达式语法2.1 正则表达式元字符和特性2.2 正则表达式常用匹配 三、正则表达式实战3.1 常见的正则表达式用法3.2 正则表达式的过滤用法3.3 正则表达式的代码用法…

Hadoop Single Node Cluster的安装

Hadoop Single Node Cluster的安装 安装JDK查看java -version更新本地软件包安装JDK查看java安装位置 设置SSH无密码登录安装hadoop下载安装设置hadoop环境变量修改hadoop配置设置文件设置core-site.xml设置YARN-site.xml设置mapred-site.xml设置HDFS分布式文件系统创建并格式化…

华为配置OSPF与BFD联动示例

组网需求 如图1所示,SwitchA、SwitchB和SwitchC之间运行OSPF,SwitchA和SwitchB之间的交换机仅作透传功能。现在需要SwitchA和SwitchB能快速感应它们之间的链路状态,当链路SwitchA-SwitchB发生故障时,业务能快速切换到备份链路Swi…

HTML---CSS美化网页元素

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.div 标签&#xff1a; <div>是HTML中的一个常用标签&#xff0c;用于定义HTML文档中的一个区块&#xff08;或一个容器&#xff09;。它可以包含其他HTML元素&#xff0c;如文本、图像…

3.2 内容管理模块 - 课程分类、新增课程、修改课程

内容管理模块-课程分类、新增课程、修改课程 文章目录 内容管理模块-课程分类、新增课程、修改课程一、课程分类1.1 课程分类表1.2 查询树形结构1.2.1 表自连接1.2.2 SQL递归 1.3 Mapper1.4 Service1.5 Controller1.6 效果图 二、添加课程2.1 需求分析2.2 数据表2.2.1 课程基础…

嵌入式科普(5)ARM GNU Toolchain相关概念和逻辑

一、目的/概述 二、资料来源 三、逻辑和包含关系 四、Arm GNU Toolchain最常用的命令 嵌入式科普(5)ARM GNU Toolchain相关概念和逻辑 一、目的/概述 对比高集成度的IDE(MDK、IAR等)&#xff0c;Linux开发需要自己写Makefile等多种脚本。eclipse、Visual Studio等需要了解预处…

Selenium框架的使用心得(一)

最近使用selenium框架实现业务前端的UI自动化&#xff0c;在使用selenium时&#xff0c;有一些心得想要和大家分享一下~ Selenium是一款用于web应用程序测试的工具&#xff0c;常用来实现稳定业务的UI自动化。这里&#xff0c;不想对其发展历史做介绍&#xff0c;也不想用官方…

vscode 文件目录栏缩进

一个好的开发IDE&#xff0c;一定是让人赏心悦目的&#xff0c;这个赏心悦目也一定是包含层级目录的清晰明了&#xff01;不能像感冒的鼻涕一样一擤一摊子&#xff01;就像。。。。嗯&#xff0c;算了&#xff0c;断子还是不讲了&#xff0c;怕有些妹子投诉 或发消息批评我。。…

【ppt密码】ppt的密码忘了,怎么破解

PPT文件设置了保护密码&#xff0c;但是密码忘记了&#xff0c;无法打开PPT文件、无法编辑PPT文件了该怎么办&#xff1f;PPT文件的两种保护密码该如何解密&#xff1f; 首先是打开密码 网上有一种解决方法&#xff1a; 1、重新命名PPT文件&#xff0c;将其后缀改为zip格式&…

Shell编程基础 – C语言风格的Bash for循环

Shell编程基础 – C语言风格的Bash for循环 Shell Programming Essentials - C Style For Loop in Bash By JacksonML 循环是编程语言的基本概念之一&#xff0c;同样也是Bash编程的核心。当用户需要一遍又一遍地运行一系列命令直到达到特定条件时&#xff0c;例如&#xff1…

优点和缺点(以及在求职过程中如何处理它们)

你知道你会感到紧张&#xff0c;因为你真的很想要这份工作。当人力资源人员提出这个普遍存在的问题“你的优势和劣势是什么&#xff1f;”时&#xff0c;他们在寻找什么&#xff1f; 有哪些突出的优点和缺点示例&#xff1f;您如何将这些示例个性化&#xff0c;以免听起来像人…

leecode题解Golang版本-3-无重复字符最长子串

题目 无重复字符最长子串 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 题解 func lengthOfLongestSubstring(s string) int {m : make(map[uint8]int)res : 0for l, r : 0, 0; r < len(s); r {m[s[r]]if v, ok : m[s[r]]; !ok || v 1…