【MySQL精通之路】全文搜索-自然语言全文搜索

1.使用方法

默认情况下,或者使用IN NATURAL LANGUAGE MODE修饰符,MATCH()函数文本集合字符串执行自然语言搜索

1.1 集合

集合是FULLTEXT索引中包含的一个多个列的集合。

1.2 搜索字符串

搜索字符串作为AGINST()的参数提供。

1.3 相关性值

对于表中的每一行,MATCH()返回一个相关性值

搜索字符串MATCH()列表中命名的列中该行中的文本之间的相似性度量

mysql> CREATE TABLE articles (->   id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,->   title VARCHAR(200),->   body TEXT,->   FULLTEXT (title,body)-> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.08 sec)mysql> INSERT INTO articles (title,body) VALUES->   ('MySQL Tutorial','DBMS stands for DataBase ...'),->   ('How To Use MySQL Well','After you went through a ...'),->   ('Optimizing MySQL','In this tutorial, we show ...'),->   ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),->   ('MySQL vs. YourSQL','In the following database comparison ...'),->   ('MySQL Security','When configured properly, MySQL ...');
Query OK, 6 rows affected (0.01 sec)
Records: 6  Duplicates: 0  Warnings: 0mysql> SELECT * FROM articles-> WHERE MATCH (title,body)-> AGAINST ('database' IN NATURAL LANGUAGE MODE);
+----+-------------------+------------------------------------------+
| id | title             | body                                     |
+----+-------------------+------------------------------------------+
|  1 | MySQL Tutorial    | DBMS stands for DataBase ...             |
|  5 | MySQL vs. YourSQL | In the following database comparison ... |
+----+-------------------+------------------------------------------+
2 rows in set (0.00 sec)

1.4 大小写

默认情况下,搜索是以不区分大小写的方式执行的。若要执行区分大小写全文搜索,请对索引列使用区分大小写二进制排序规则

例如,可以为使用的utf8mb4字符集的列分配utf8mb4_0900_as_csutf8mb4 _bin排序规则,使其对全文搜索区分大小写

1.5 MATCH()

当在WHERE子句中使用MATCH()时,如前所示,只要满足以下条件,返回的行将首先自动以最高相关性进行排序:

  • 不能有显式ORDER BY子句。

  • 必须使用全文索引扫描而不是表扫描来执行搜索。

  • 如果查询联接表,则全文索引扫描必须是联接中最左边的非常量表

考虑到刚刚列出的条件的必要性,通常不需要使用ORDER BY来指定显式排序顺序

1.6 相关性值计算

相关值非负浮点数零相关性意味着没有相似性相关性是根据行(文档)中的单词数、行中唯一单词数、集合中的单词总数以及包含特定单词的行数来计算的。

提示:

“文档”项可以与“行”项互换使用,并且这两个项都指的是行的索引部分。“集合”项指的是索引列,包括所有行。

要简单地计算匹配项,可以使用以下查询:

mysql> SELECT COUNT(*) FROM articles-> WHERE MATCH (title,body)-> AGAINST ('database' IN NATURAL LANGUAGE MODE);
+----------+
| COUNT(*) |
+----------+
|        2 |
+----------+
1 row in set (0.00 sec)

 您可能会发现按照以下方式重写查询会更快:

mysql> SELECT-> COUNT(IF(MATCH (title,body) AGAINST ('database' IN NATURAL LANGUAGE MODE), 1, NULL))-> AS count-> FROM articles;
+-------+
| count |
+-------+
|     2 |
+-------+
1 row in set (0.03 sec)

 

第一个查询做了一些额外的工作(根据相关性对结果进行排序),但也可以使用基于WHERE子句的索引查找。

如果搜索只匹配几行,则索引查找可能会使第一个查询更快。

第二个查询执行全表扫描,如果搜索词出现在大多数行中,则扫描速度可能比索引查找快

对于自然语言全文搜索,MATCH()函数中列名必须与表中某个FULLTEXT索引中包含的列相同。对于前面的查询,请注意,MATCH()函数中命名的列(标题和正文)与文章表的FULLTEXT索引定义中命名的那些列相同。要分别搜索标题正文,需要为每列创建单独的FULLTEXT索引

您还可以执行布尔搜索或带有查询扩展的搜索。这些搜索类型在第14.9.2节“布尔全文搜索”和第14.9.3节“带查询扩展的全文搜索”中进行了描述。

使用索引的全文搜索只能命名MATCH()子句单个表中的列,因为索引不能跨越多个表对于MyISAM表可以在没有索引的情况下进行布尔搜索(尽管速度较慢),在这种情况下,可以命名多个表中的列

前面的例子是一个基本的说明,显示了如何使用MATCH()函数,其中按相关性递减的顺序返回行。下一个示例显示了如何显式地检索相关性值。返回的行没有排序,因为SELECT语句既不包括WHERE子句也不包括ORDER BY子句:

mysql> SELECT id, MATCH (title,body)-> AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE) AS score-> FROM articles;
+----+---------------------+
| id | score               |
+----+---------------------+
|  1 | 0.22764469683170319 |
|  2 |                   0 |
|  3 | 0.22764469683170319 |
|  4 |                   0 |
|  5 |                   0 |
|  6 |                   0 |
+----+---------------------+
6 rows in set (0.00 sec)

下面的例子比较复杂。查询返回相关性值,并按相关性递减的顺序对行进行排序。要实现此结果,请指定两次MATCH():一次在SELECT列表中,一次在WHERE子句中。这不会导致额外的开销,因为MySQL优化器注意到两个MATCH()调用是相同的,并且只调用一次全文搜索代码。

 

mysql> SELECT id, body, MATCH (title,body)->   AGAINST ('Security implications of running MySQL as root'->   IN NATURAL LANGUAGE MODE) AS score-> FROM articles->   WHERE MATCH (title,body) ->   AGAINST('Security implications of running MySQL as root'->   IN NATURAL LANGUAGE MODE);
+----+-------------------------------------+-----------------+
| id | body                                | score           |
+----+-------------------------------------+-----------------+
|  4 | 1. Never run mysqld as root. 2. ... | 1.5219271183014 |
|  6 | When configured properly, MySQL ... | 1.3114095926285 |
+----+-------------------------------------+-----------------+
2 rows in set (0.00 sec)

1.7 匹配规则

包含在双引号(“)字符中的短语只与键入时包含该短语的行匹配。

全文引擎该短语拆分为多个单词,并在FULLTEXT索引中搜索这些单词。

非单词字符不必完全匹配:

短语搜索只要求匹配项中包含与该短语完全相同的单词,且顺序相同

  例如,“测试短语”与“测试,短语”匹配。

如果该短语不包含索引中的单词,则结果为空。

  例如,如果所有单词都是停止词或短于索引单词的最小长度,则结果是空的。

MySQL FULLTEXT实现将任何真实单词字符序列(字母、数字和下划线)视为一个单词。

1.该序列也可能包含撇号('),但一行中不能超过一个。

这意味着aaa'bbb被视为一个词,但aaa''bb被视为两个词。

2.单词开头或结尾的撇号会被FULLTEXT语法分析器剥离;'aaa'bb'将被解析为aaa'bb。

内置的FULLTEXT解析器通过查找某些分隔符来确定单词的起始结束位置

例如,(空格)、、(逗号)和。时期如果单词没有用分隔符分隔(例如,在中文中),则内置的FULLTEXT解析器无法确定单词的开头或结尾。

为了能够将这些语言中的单词其他索引项添加到使用内置FULLTEXT语法分析器FULLTEXT索引中,必须对它们进行预处理,以便用任意分隔符将它们分隔开。或者,您可以使用ngram解析器插件(适用于中文、日语或韩语)或MeCab解析器插件(用于日语)创建FULLTEXT索引

可以编写一个插件来替换内置的全文解析器。有关详细信息,请参阅MySQL插件API。例如,解析器插件源代码,请参阅MySQL源发行版的plugin/fulltext目录。


在全文搜索中会忽略某些单词:

任何太短的单词都会被忽略

通过全文搜索找到的默认最小单词长度:

InnoDB中:为三个字符

MyISAM中:则为四个字符

您可以通过在创建索引之前设置一个配置选项来控制截止:

Innodb:innodb_ft_min_token_size

MyISAM:ft_min_word_len

 注意:

此行为不适用于使用ngram语法分析器的FULLTEXT索引。对于ngram解析器,标记长度由ngram_token_size选项定义。

停止字“stopword”列表中的单词将被忽略。

停止语是一个单词,如“the”或“some”,它非常常见,以至于被认为没有语义价值。

有一个内置的停止语列表,但它可以被用户定义的列表覆盖

InnoDB搜索索引和MyISAM搜索索引的停止词列表和相关配置选项不同。

停止字处理由配置选项:

innodb_ft_enable_stopword, innodb_ft_server_stopword_table和innodb_ft_user_stopword_table控制(对于innodb搜索索引)

以及ft_Stopword_file控制(对于MyISAM索引)

请参阅“全文停止字”,查看默认停止语列表以及如何更改它们。

【MySQL精通之路】全文索引-全文停止字-CSDN博客

默认的最小单词长度可以更改,如第14.9.6节“微调MySQL全文搜索”所述。

1.8 加权

集合和查询中的每个正确单词都根据其在集合或查询中的重要性进行加权

因此,出现在许多文档中的单词的权重较低,因为它在这个特定集合中的语义值较低

相反,如果这个词很少见,它的权重会更高

将单词的权重组合起来计算行的相关性。这种技术最适用于大型数据集

1.9 MyISAM限制

对于非常小的表,单词分布不能充分反映语义值,并且该模型有时可能会对MyISAM表上的搜索索引产生奇怪的结果。

例如,尽管单词“MySQL”出现在前面显示的articles表的每一行中,但在MyISAM搜索索引中搜索该单词不会产生任何结果

mysql> SELECT * FROM articles-> WHERE MATCH (title,body)-> AGAINST ('MySQL' IN NATURAL LANGUAGE MODE);
Empty set (0.00 sec)


搜索结果为空,因为单词“MySQL”至少出现在50%的行中,因此被有效地视为一个停止词

这种过滤技术更适用于大数据集,在大数据集中,您可能不希望结果集从1GB表中每隔一行返回一次,而对于小数据集,它可能会导致流行术语的结果不佳

当您第一次尝试全文搜索以了解其工作原理时,50%的阈值可能会让您感到惊讶,并使InnoDB表更适合进行全文搜索实验。

如果创建一个MyISAM表,并且只在其中插入一行或两行文本,则文本中的每个单词都会出现在至少50%的行中。因此,在表中包含更多行之前,不会返回任何搜索结果。

需要绕过50%限制的用户可以在InnoDB表上构建搜索索引,或者使用“布尔全文搜索”中提到的布尔搜索模式。

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

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

相关文章

高效定时器设计方案——层级时间轮

层级时间轮实现高性能定时器 此篇介绍时间轮,它的时间复杂度是最优的,插入、查找(最小)、删除都是O(1),很恐怖的性能 这里示例一个三层时间轮,模拟时钟表盘的运作方式,…

力扣爆刷第142天之二叉树五连刷(构造树、搜索树)

力扣爆刷第142天之二叉树五连刷(构造树、搜索树) 文章目录 力扣爆刷第142天之二叉树五连刷(构造树、搜索树)一、106. 从中序与后序遍历序列构造二叉树二、654. 最大二叉树三、617. 合并二叉树四、700. 二叉搜索树中的搜索五、98. …

卷积神经网络(CNN)详细介绍及其原理详解

卷积神经网络(Convolutional Neural Networks,简称CNN)是深度学习中非常重要的一类神经网络,主要用于图像识别、图像分类、物体检测等计算机视觉任务。本文将详细介绍卷积神经网络的基本概念、结构组成及其工作原理,并…

每日一题Reverse Card (Easy Version)

文章目录 题名&#xff1a;题意&#xff1a;题解&#xff1a;代码&#xff1a; 题名&#xff1a; Reverse Card (Easy Version) 题意&#xff1a; 给定 n n n&#xff0c; m m m&#xff0c;存在 1 < a < n 1<a<n 1<a<n&#xff0c; 1 < b < m …

什么是网关鉴权及其在Spring Cloud Gateway中的实现

在现代微服务架构中&#xff0c;网关扮演着非常重要的角色&#xff0c;它是系统和外部世界之间的入口&#xff0c;负责路由请求、流量控制以及安全保护等任务。其中&#xff0c;网关鉴权是保障系统安全的重要环节之一。本文将深入介绍什么是网关鉴权&#xff0c;以及如何通过过…

BCD编码(8421)介绍

概念 BCD (Binary-Coded Decimal) 是一种二进制的数字编码形式&#xff0c;其特点每个十进制数位用4个二进制位来表示。 在网络IO中&#xff0c;你传输一个数字类型最少需要一字节&#xff0c;传输两个数字类型最少需要两字节&#xff0c;但是当你使用BCD编码后传输&#xff…

防静电液的这些用处你知道多少

防静电液又叫抗静电剂&#xff0c;是工业上常用来消除静电的化学用品&#xff0c;一般是液体状态&#xff0c;它的用途很广泛。 防静电液适用于对静电有控制要求的电器、仪器桌面、台面、塑料制品、包装品、存储盒、托盘、毛毯、织物等任何物品表面。 应用举例如消除各种塑胶材…

微服务中的鉴权怎么做?

大家好&#xff0c;我是苍何呀。 现在出去找工作&#xff0c;简历上不写上微服务的技术&#xff0c;仿佛自己跟不上时代了&#xff0c;面试官更是喜欢盯着微服务项目来提问。 但其实虽说微服务是主流&#xff0c;随着云原生架构的发展&#xff0c;微服务也是趋势&#xff0c;…

图论-最短路算法

1. Floyd算法 作用&#xff1a;用于求解多源最短路&#xff0c;可以求解出任意两点的最短路 利用动态规划只需三重循环即可&#xff08;动态规划可以把问题求解分为多个阶段&#xff09;定义dp[k][i][j]表示点i到点j的路径&#xff08;除去起点终点&#xff09;中最大编号不超…

算法题【面试准备】

算法题【面试准备】 前言推荐算法题NC72二叉树的镜像NC8:二叉树根节点到叶子节点和为指定值的路径NC9二叉树中是否存在节点和为指定值的路径NC14二叉树的之字形层序遍历[NC15 求二叉树的层序遍历](https://www.nowcoder.com/study/live/689/2/69)NC37:合并区间[NC111 最大数](h…

AI模型发展之路:开源还是闭源?

AI模型发展之路&#xff1a;开源还是闭源&#xff1f; 开源路径优势&#xff1a;发展前景&#xff1a; 闭源路径优势&#xff1a;发展前景&#xff1a; 一、自动化内容生成文章生成技术原理应用场景 视频生成技术原理应用场景 音频生成技术原理应用场景 二、内容分发与推广智能…

leetcode725-Split Linked List in Parts

题目 给你一个头结点为 head 的单链表和一个整数 k &#xff0c;请你设计一个算法将链表分隔为 k 个连续的部分。 每部分的长度应该尽可能的相等&#xff1a;任意两部分的长度差距不能超过 1 。这可能会导致有些部分为 null 。 这 k 个部分应该按照在链表中出现的顺序排列&…

数据库的约束 not null, unique, default, primary key, foreign key, check

约束可以理解成 数据库提供的一种针对数据的合法性进行验证的机制, 在创建表的时候使用 1. 约束类型 NOT NULL - 指示某列不能存储 NULL 值, 表里的这个内容是必填项UNIQUE - 保证某列的每行必须有唯一的值, 不能重复 每次插入/修改时, 都要先触发查询, 如果当前插入/修改的…

原来Rstudio还可以这么使用,又方便了一些

在别人的电子书&#xff0c;你的电子书&#xff0c;都在bookdown中我们讲述了bookdown用于自动化文档生成。里面涉及到一个文件Rproj用于项目管理。 本身是一个很简单的文件&#xff0c;里面的内容一般不需要修改&#xff0c;只是放置在每个项目目录下即可。 比如我们有个内容…

C语言-牛客-实现四舍五入

欢迎来到Harper.Lee的学习小世界&#xff01; 博主主页传送门&#xff1a;Harper.Lee的博客主页 想要一起进步的uu欢迎来后台找我哦&#xff01; 本篇博客总结C语言刷题的相关笔记~~~~ #牛客–实现四舍五入 题目描述&#xff1a;随机输入浮点数&#xff0c;输出四舍五入后的整数…

数据链路层简单介绍

mac地址&#xff08;物理地址&#xff09; mac地址和ip地址&#xff0c;目的都是为了区分网络上的不同设备的&#xff0c;在最开始的时候&#xff0c;mac地址和ip地址是两伙人&#xff0c;独立各自提出的&#xff0c;ip地址是4个字节&#xff08;早都不够用了&#xff09;&…

OFDM 802.11a的FPGA实现(二十一)发射主控模块MCU(含代码)

目录 1.前言 2.主控逻辑 3.Matlab 4.verilog 5.ModelSim 6.ModelSim仿真结构与Matlab自动化对比 完整工程链接&#xff08;含verilog和Matlab代码&#xff09;&#xff1a; https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzkxNjM0NDk2Nw&actiongetalbum&album…

【sass嵌套规则 (Nested Rules)】

Sass的嵌套规则&#xff08;Nested Rules&#xff09;是一个非常重要的功能&#xff0c;它允许你在Sass文件中嵌套CSS规则集&#xff0c;从而以更直观、更结构化的方式编写样式。下面我将详细解释Sass嵌套规则的概念、作用、使用场景以及示例代码。 定义和用途 Sass嵌套规则允…

Qt 模态 非模态的使用

Qt 模态 非模态的使用 在Qt中&#xff0c;模态&#xff08;modal&#xff09;和非模态&#xff08;modeless&#xff09;对话框之间有几个重要区别&#xff1a; 模态对话框&#xff1a; 模态对话框会阻止用户与其它应用程序窗口进行交互&#xff0c;直到对话框被关闭为止&#…

FastAPI+Nuxt单域名部署实践:无需子域名的前后端分离解决方案

FastAPINuxt单域名部署实践&#xff1a;无需子域名的前后端分离解决方案 注&#xff1a;此博客写于2024年5月23日。FastAPI已经到0.111.0 版本了。 背景历史 上一个接手网站的人不管了&#xff1a;Wordpress —重写–> Vue 发现Vue做SEO优化很麻烦&#xff1a;Vue —重构…