4.7 全文本搜索

news2024/10/3 8:27:31

文章目录

  • 1.概述
  • 2.使用全文本搜索
    • 2.1 启用全文本搜索支持
    • 2.2 进行全文本搜索
    • 2.3 使用查询拓展
    • 2.4 布尔文本搜索
  • 3.全文本搜索使用说明


1.概述

首先我们要知道,不是所有搜索引擎都支持全文本搜索,前边我们介绍过MySql支持多种数据类型,而其默认的是支持事物的INNODB,但是只有MyISAM而支持全文搜索,如果我们想使用全文搜索的功能,那么在创建数据表的时候,一定要指定搜索引擎为MyISAM;

前边我们学习了使用LIKE关键字结合通配符和正则表达式查找相匹配的列的值,但是这俩种方式存在几个限制:

  1. 性能:通配符和正则表达式查找通常要求MySql尝试匹配表中所有的行,而且这种搜索极少使用表索引,因此被搜索行数不断增加时,会十分耗时;
  2. 明确控制:使用通配符和正则表达式匹配很难明确的控制匹配什么和不匹配什么,例如指定一个词必须不匹配,而一个词仅在第一个词确实匹配的情况下才可以匹配或者才可以不匹配的情况;
  3. 智能化结果:虽然基于通配符和正则表达式的搜索提供了非常灵活的查找方式,但它们都不提供智能化的选择结果的方法。例如一个特殊词的搜索将会返回包含该词的所有行,而不区分包含单个匹配的行和包含多个匹配的行。类似的,一个特殊词的搜索将不会找出不包含该词但包含其他相关词的行。

这些类似的限制情况,我们都可以使用全文本搜索来解决。

在使用全文本搜索时,MySql不需要查找每个行,不需要分别分析和处理每个词,MySql创建指定列中各词的一个索引,查找可以针对这些词进行。这样,MySql可以快速有效的决定哪些词匹配,哪些词不匹配,匹配的频率等等;

2.使用全文本搜索

为了进行全文本搜索,必须索引被搜索的列,而且要随着数据的改动不断地重新索引。在对表列进行适当地设计之后,MySql会自动的进行所有的所有和重新索引;

在索引之后,SELECT 可以与 Match( ) 和 Against( ) 一起使用以便于执行查找任务;

2.1 启用全文本搜索支持

一般在创建表时启用全文本搜索。

CREATE TABLE 语句接受 FULLTEXT 子句,它给出被索引列的一个逗号分隔的列表;如:

CREATE TABLE productnotes
(
  note_id    int           NOT NULL AUTO_INCREMENT comment '注释ID',
  prod_id    char(10)      NOT NULL comment '产品ID',
  note_date datetime       NOT NULL comment '增加注释的日期',
  note_text  text          NULL comment '注释文本信息',
  PRIMARY KEY(note_id),
  FULLTEXT(note_text)
) ENGINE=MyISAM;

MySql根据FULLTEXT的指定对note_text进行索引,这里索引了单个列,如果有需要也可以索引多个列,使用逗号分隔即可;

在定义之后,MySql自定维护该索引。在增加、更新、删除行数据时,索引随之自定更新;

当然,指定FULLTEXT可以在创建表时,也可以在创建表之后使用 ALTER 语句指定,但是在创建表之后指定时,所有已有数据必须立即被索引;

而且要注意,不要在导入数据时使用 FULLTEXT ,更新索引是需要时间的,如果正在导入数据到一个新表,此时不应该立即启用 FULLTEXT 索引,应该先导入全部数据,然后再修改表,定义 FULLTEXT 。这样可以更快的导入数据。

2.2 进行全文本搜索

在索引之后,使用俩个函数 Match( ) 和 Against( ) 执行全文本搜索,其中 Match( ) 指定被搜索的列,Against( ) 指定要使用的查找表达式,如:

输入:

SELECT note_text
FROM productnotes
WHERE MATCH(note_text) AGAINST('rabbit');

输出:
在这里插入图片描述

MATCH(note_text)表明针对指定的列进行查找,AGAINST(‘rabbit’)表明在指定的列中指定词进行查找,要注意传递给MATCH( ) 的值必须与FULLTEXT( ) 中定义的相同,如果指定了多个列,则必须列出他们而且顺序要保持一致;

在查找时,除非使用BINARY方式,默认是不区分字母大小写的;

当然上面的例子我们也可以使用LIKE关键字来实现,如:

输入:

SELECT note_text
FROM productnotes
WHERE note_text LIKE '%rabbit%';;

输出:
在这里插入图片描述

虽然使用LIKE关键字得到的结果与使用全文本搜索得到的结果一致,但是其返回结果的顺序不一样,俩种查询方式都没有对结果进行特殊的排序,都是按照默认排序规则进行的;

使用全文本搜索返回的结果以文本匹配的良好程度进行排序,俩行数据都包含词rabbit,但包含词rabbit作为第3个词的等级比作为第20个词的等级的行高,所以才会呈现出这样的结果;

为了更好的查看排序的结果,我们可以执行下列例子:

输入:

SELECT note_text,
MATCH(note_text) AGAINST('rabbit') AS ranks
FROM productnotes;

输出:
在这里插入图片描述

这里在SELECT中使用 Match( ) 和 Against( ) ,而不是WHERE子句中,所以返回所有的行, Match( ) 和 Against( ) 用来建立一个计算列-rank,此列包含全文本搜索计算出的等级值。

等级值由MySql根据行中词的数目,唯一词的数目,整个索引中词的总数以及包含该词的行的数目计算出来,像展示的查询结果一样,不包含词rabbit的行等级为0,所以不被前一个例子中的WHERE子句选择。确实包含词rabbit的俩个行,每行都有一个等级值,文本中词靠前的行的等级值比词靠后的行的等级值高;

同样的,如果指定多个搜索项,则包含多数匹配词的行要比包含少数词的行等级值高;

2.3 使用查询拓展

查询拓展用来设法放宽所返回的全文搜索结果的范围。

假如需要查找所有涉及anvils的注释,只有一个注释包含这个词,但我们想返回可能与这个词有关的所有其他行,即使他们不包含词anvils。

这也是查询拓展的一项任务。在使用查询拓展时,MySql对数据和索引进行俩遍扫描来完成搜索:

  • 首先,进行一个基本的全文本搜索,找出与搜索条件匹配的所有行;
  • 其次,MySql检查这些匹配行并选择所有有用的词;
  • 最后,MySql再次进行全文本搜索,这次不仅使用原来的条件,而且还使用所有有用的词;

利用查询拓展,能找出可能的相关结果,即使它们并不精确包含所有查找的词,如:

SELECT note_text
FROM productnotes
WHERE MATCH(note_text) AGAINST('anvils');

输出:
在这里插入图片描述

因为只有一行数据包含 anvils ,所以只返回一行数据,但是如果使用拓展查询:

输入:

SELECT note_text
FROM productnotes
WHERE MATCH(note_text) AGAINST('anvils' WITH QUERY EXPANSION);

输出:

在这里插入图片描述

这里返回了7行数据,第一行因为包含anvils,所以其等级最高;

第二行虽然不包含anvils,但是它包含第一行中的俩个词cusyomer与recommend,所以也被查询了出来;

第三行也包含这俩个词,但是因为其在文本中的位置更靠后,且分开的更远,所以等级较低;

查询拓展极大的增加了返回的行数,但是这样也增加了查询负担,并且返回了可能不是你想要的结果;

2.4 布尔文本搜索

MySql支持的另一种方式称为布尔方式。以布尔方式查询,可以提供关于下列内容的细节:

  • 要匹配的词;
  • 要排斥的词(如果某行包含这个词,则不返回该行,即便它包含其他指定的词)
  • 排列提示(指定某些词比其他词更重要,更重要的词等级更高)
  • 表达式分组
  • 其他内容

布尔方式不同于其他全文本搜素方式,即使没有定义 FULLTEXT索引也可以使用,但这是一种非常慢的操作;

下面是使用 IN BOOLEAN MODE 例子:

输入:

SELECT note_text
FROM productnotes
WHERE MATCH(note_text) AGAINST('heavy' IN BOOLEAN MODE);

输出:

在这里插入图片描述

此次全文搜素查找包含词 heavy 的所有行。其中使用了关键字 IN BOOLEAN MODE,但实际上没有指定布尔操作符,因此其结果与没有指定布尔方式相同;

为了匹配包含heavy但不包含任意以rope开始的词,可以使用下列的例子:

输入:

SELECT note_text
FROM productnotes
WHERE MATCH(note_text) AGAINST('heavy -rope*' IN BOOLEAN MODE);

输出:
在这里插入图片描述

这次查询仍然查找匹配heavy的词,但-rope明确的指示MySql排除包含rope(任何以rope开始的词,包括ropes)的行,这里我们使用了俩个布尔操作符-和*,下列是所有支持的布尔操作符:

布尔操作符说明
+包含,词必须存在
-排除,词必须不出现
>包含,而且增加等级值
<包含,而且减少等级值
( )把词组成子表达式(允许这些子表达式作为一个组被包含,排除,排列等)
~取消一个词的排序值
*词尾的通配符
" "定义一个短语(与单个词的列表不同,它匹配整个短语以便包含或排除这个短语)

下面是我们针对这些操作符的示例:

SELECT note_text
FROM productnotes
WHERE MATCH(note_text) AGAINST('+rabbit +bait' IN BOOLEAN MODE);

说明:查找匹配包含词rabbit与bait的行;

SELECT note_text
FROM productnotes
WHERE MATCH(note_text) AGAINST('rabbit bait' IN BOOLEAN MODE);

说明:没有指定操作符,这个查找匹配包含词rabbit与bait中的至少一个词的行;

SELECT note_text
FROM productnotes
WHERE MATCH(note_text) AGAINST('"rabbit bait"' IN BOOLEAN MODE);

说明:这个查找匹配短语 “rabbit bait” ,而不是匹配俩个词rabbit与bait;

SELECT note_text
FROM productnotes
WHERE MATCH(note_text) AGAINST('>rabbit <bait' IN BOOLEAN MODE);

说明:匹配rabbit与bait,增加前者的等级,降低后者的等级;

SELECT note_text
FROM productnotes
WHERE MATCH(note_text) AGAINST('+safe +(<combination)' IN BOOLEAN MODE);

说明:这个查找匹配词safe 和 combination ,并且降低后者的等级;

3.全文本搜索使用说明

使用全文本搜索时,要了解这些重要的使用说明:

  • 在索引全文本数据时,短词被忽略且从索引中排除。短词被定义为那些具有3个或3个以下字符的词(这个数目可以更改);
  • MySql带有一个内键的非用词(stopword)列表,这些词在索引全文本数据时总是被忽略,如果需要可以覆盖这个列表;
  • 许多次出现的频率很高,搜索它们并没有用处,因此MySql规定了一个50%规则,如果一个词出现在50%的行中,则将它作为一个非用词忽略,50%规则不用于IN BOOLEAN MODE;
  • 如果表中的行数少于3行,则全文本搜索不返回结果
  • 忽略词中的单引号,例如don`t索引为dont
  • 不具有词分隔符的语言不能恰当的返回全文本搜索结果(包括汉语)
  • 仅在MyISAM数据库引擎中支持全文本搜索

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

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

相关文章

【微服务】-微服务环境搭建

目录 2.1 技术选型 2.2 模块设计 2.3 微服务调用 2.4 创建⽗⼯程 2.5 创建商品微服务 2.6 创建订单微服务 2.1 技术选型 持久层: SpingData Jpa 数据库: MySQL5.7 其他: SpringCloud Alibaba 技术栈 2.2 模块设计 --- shop-parent ⽗⼯程 --- shop-product-api 商品微服…

go提高升阶(四) I/O流学习

I/O 官网课程 购买课程找博主推荐 文章目录I/O文件信息创建文件、目录IO读IO写(权限)文件复制Seeker接口断点续传遍历文件夹bufio电脑中一切&#xff0c;都是以 二进制流的形式存在的。jpg&#xff1a;010100000010010101001010101010010101010 编码格式&#xff0c;还原为一个…

(02)Unity HDRP Volume 详解

1.概述这篇文章主要针对HDRP中的Volume和Volume Post-processing进行解释&#xff0c;针对于各个组件只能进行部分参数的解释&#xff0c;具体的信息可参考官方资料&#xff0c;这里只是对官方文档的图片效果补充以及笔者自己的理解。看到这里进入正文&#xff0c;请确保你的Un…

企业IT信息化,BI 能做什么?

随着数字化相关技术、应用的发展&#xff0c;社会总体的数字化发展进入了加速阶段&#xff0c;各行各业都开始有了数字化的身影&#xff0c;在这种情况下&#xff0c;数据已经成为了越来越多企业的重要资产&#xff0c;所以如何处理数据&#xff0c;让数据从资产转化为实际的价…

【Linux】理解文件系统

文章目录理解文件系统了解磁盘结构inode理解文件系统 了解磁盘结构 磁盘是计算机中的一个 机械设备 这个磁盘的盘片就像光盘一样,数据就在盘片上放着, 但是光盘是只读的,磁盘是可读可写的 机械硬盘的寻址的工作方式: 盘片不断旋转,磁头不断摆动,定位到特定的位置 我们可以把…

代码随想录算法训练营day46 | 动态规划之背包问题 139.单词拆分

day46139.单词拆分1.确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp[i]139.单词拆分 题目链接 解题思路&#xff1a;单词就是物品&#xff0c;字符串s就是背包&#xff0c;单词能否组成字符串s&#xff0c;就是问物品能不能把背包装满。…

NJ+SCU42做Modbus RTU从站

NJSCU42做Modbus RTU从站实验时间&#xff1a;2023.2.28 硬件设备&#xff1a;NJ501-1300&#xff0c;CJ1W-SCU42 软件&#xff1a;Sysmac Studio&#xff0c;Commix串口调试助手 案例简介&#xff1a;发送Modbus RTU命令读取NJ里的数据 1. 系统概述 264 ​ 本次实验使用C…

「TCG 规范解读」PC 平台相关规范(4)

可信计算组织&#xff08;Ttrusted Computing Group,TCG&#xff09;是一个非盈利的工业标准组织&#xff0c;它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立&#xff0c;并采纳了由可信计算平台联盟&#xff08;the Trusted Computing Platform Alli…

3种方法找回命令提示符删除的文件

“电脑D盘有个文件没有权限删除&#xff0c;后面我使用cmd命令去强制删除&#xff0c;结果确认删除后盘中的其他文件没了&#xff0c;其中有我重要word文档&#xff0c;有什么办法恢复吗&#xff1f;求助大神&#xff01;”——来自某某小伙伴的咨询文件丢失是一个不可预测但又…

RK3288-android8-es7210-阵列麦克风

ES7210驱动包 应需求调试一个ES7210的阵列麦克风 首先移植 From 234647c69a57c32198c65836e7fc521dc22e444b Mon Sep 17 00:00:00 2001 From: LuoXiaoTan <lxt@rock-chips.com> Date: Tue, 10 Jul 2018 18:08:50 -0700 Subject: [PATCH] ASoC: codecs: add es7210 adc …

linux下多线程调试,以及一些常用工具总结(pstack/pstree/stress/perf)

一、多线程调试使用gdb查看线程信息。&#xff08;1&#xff09;获取主线程id&#xff1a;ps -aux | grep 进程名称&#xff0c;例如&#xff1a;&#xff08;2&#xff09;查看线程信息&#xff1a;gdb attach 线程id&#xff0c;例如1和3表示进程启动运行依赖的库的信息&…

2023王道考研数据结构笔记第二章线性表

第二章 线性表 2.1 线性表的定义 2.1.1 线性表的基本概念 线性表是具有相同数据类型的n(n>0)个数据元素的有限序列&#xff0c;其中n为表长&#xff0c;当n0时线性表是一个空表。若用L命名线性表&#xff0c;则其一般表示为&#xff1a; L(a1,a2,...,ai,ai1,...,an)L(a_1…

泛微e-cology9 <0.56 存在sql注入漏洞

漏洞描述 泛微e-cology9 是一个 OA 系统。 泛微e-cology9 10.56 之前版本存在 sql 注入漏洞&#xff0c;攻击者可利用该漏洞读取或修改数据库中的敏感信息&#xff0c;进而操控管理系统。 漏洞名称泛微e-cology9 <0.56 存在sql注入漏洞漏洞类型SQL注入发现时间2023/2/23漏…

论文阅读-DISTILLING KNOWLEDGE FROM READER TORETRIEVER FOR QUESTION ANSWERING

论文链接&#xff1a;https://arxiv.org/pdf/2012.04584.pdf 目录 方法 交叉注意机制 交叉注意力得分作为段落检索的相关性度量 用于段落检索的密集双编码器 将交叉注意力分数提取到双编码器 数据集 方法 我们的系统由两个模块组成&#xff0c;即检索器和阅读器&#xf…

文献阅读 Image-to-Image Translation with Conditional Adversarial Networks

前言 本文中所使用的cGAN模型为上篇论文的main idea&#xff0c;这里再进行一下相关介绍。 题目 Image-to-Image Translation with Conditional Adversarial Networks 使用条件对抗网络实现图片到图片的翻译 摘要 我们研究了条件对抗网络作为图像到图像翻译问题的通用方案。…

【C++】inline 内联函数

文章目录&#x1f4d5; 概念&#x1f4d5; 使用前的准备&#x1f4d5; 使用&#x1f4d5; 特性&#x1f4d5; 概念 在 C 中&#xff0c;为了解决一些频繁调用的小函数大量消耗栈空间&#xff08;栈内存&#xff09;的问题&#xff0c;特别的引入了 inline 修饰符&#xff0c;表…

你需要同款“Unreal项目自动化编译、打包和部署”方案吗?

在过往几期的UWA Pipeline最佳实践案例中&#xff0c;我们分享了如何通过Pipeline实现性能优化、性能管理、游戏内容验收和云真机系统的应用&#xff08;实现批量真机设备的自动化测试&#xff0c;以及针对特效性能优化的方式&#xff09;&#xff0c;其实这些高效的方法并不局…

改进 YOLO V5 的密集行人检测算法研究(论文研读)——目标检测

改进 YOLO V5 的密集行人检测算法研究&#xff08;2021.08&#xff09;摘 要&#xff1a;1 YOLO V52 SENet 通道注意力机制3 改进的 YOLO V5 模型3.1 训练数据处理改进3.2 YOLO V5 网络改进3.3 损失函数改进3.3.1 使用 CIoU3.3.2 非极大值抑制改进4 研究方案与结果分析4.1 实验…

碰撞高校智慧,凝聚青春力量 | 因“AI”而“深”-高校开源专场顺利举办!

为聚焦AI新发展&#xff0c;探寻开源新环境&#xff0c;聆听高校声音&#xff0c;2月25日上午&#xff0c;第四届OpenI/O启智开发者大会以“因AI而深”为主题在深圳人才研修院举办高校开源专场&#xff0c;共同交流高校优质开源项目的发展经验、社区优秀开发者的心路历程及高校…

ROS2功能包Hello world(python)

文章目录环境准备Python创建工作空间、功能包及节点方法编译使用环境准备 为了便于日后复现&#xff0c;相关环境已经打包到docker中。 拉取docker镜像 docker pull 1224425503/ros2_foxy_full:latest新建容器 docker run -dit --rm --privilegedtrue --network host -e NV…