【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,一经查实,立即删除!

相关文章

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

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

BCD编码(8421)介绍

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

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

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

微服务中的鉴权怎么做?

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

图论-最短路算法

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

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

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

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

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

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

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

数据链路层简单介绍

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

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

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

Spring6笔记(五):国际化、数据校验、提前编译

九、国际化:i18n 9.1 i18n概述 9.2 Java国际化 9.3 Spring6国际化 十、数据校验:Validation 10.1 Spring Validation 概述 10.2 实验一:通过 validator 接口实现 10.3 实验三:Bean Validation 注解 10.4 实验四:实现…

鸿蒙 DevEcoStudio:通知栏通知实现

【使用notificationManager实现通知栏功能】 【普通通知、长文本通知、多行通知、图片通知】 import notificationManager from ohos.notificationManager import image from ohos.multimedia.image Entry Component struct Index {State message: string Hello World// 将图…

html5 笔记01

01 表单类型和属性 input的type属性 单行文本框: typetext 电子邮箱 : typeemail 地址路径 : type url 定义用于输入数字的字段: typenumber 手机号码: typetel 搜索框 : typesearch 定义颜色选择器 : typecolor 滑块控件 : typerange 定义日期 :typedate 定义输入时间的控件…

04-Json/Ajax/Vue的知识

1. Json结构 1.1 Json概述 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,实现数据前后端交互。 它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。 JSON采用完全独立于程序语言的文本格式。这些特性使JSON成为理想的数据交换…

英码科技算能系列边缘计算盒子再添新成员!搭载TPU处理器BM1688CV186AH,功耗更低、接口更丰富

在数据呈现指数级增长的今天,越来越多的领域和细分场景对实时、高效的数据处理和分析的需求日益增长,对智能算力的需求也不断增强。为应对新的市场趋势,英码科技凭借自身的硬件研发优势,携手算能相继推出了基于BM1684的边缘计算盒…

5.23.1 深度学习在乳腺癌成像中的应用

乳腺成像在早期发现乳腺癌以及在治疗期间监测和评估乳腺癌方面发挥着重要作用。最常用的乳腺成像方式是数字乳房X线摄影、数字乳腺断层合成、超声和磁共振成像。 传统的 CAD 系统基于传统的机器学习 (ML) 技术;预定义(手工制作)的特征是系统…

【堡垒机小知识】堡垒机和接口机的重要区别分析

在企业IT架构管理中,接口机和堡垒机各自扮演着不可或缺的角色。但不少IT小伙伴对于两者不是很了解,不知道两者之间有什么区别,今天我们就来一起分析一下。 堡垒机和接口机的重要区别分析 1、功能区别 接口机主要用于数据库层面的数据交换和…

Linux多线程系列2: 模拟封装简易语言级线程库,线程互斥和锁,线程同步和条件变量,线程其他知识点

Linux多线程系列2: 模拟封装简易语言级线程库,线程互斥和互斥锁,线程同步和条件变量,线程其他知识点 1.前言 一.模拟C11线程库自己封装简易语言级线程库1.实现框架2.迅速把构造等等函数写完3.start和work1.尝试一2.尝试二3.最终版本4.给出代码 二.模拟实现多线程(为编写线程池做…

Unity数据持久化2——XML

简介: 基础知识 XML文件格式 XML基本语法 XML属性 练习: C#读取存储XML XML文件存放位置 读取XML文件 练习: 存储修改XML文件 练习: 总结 实践小项目 必备知识点 必备知识点——C#中XML序列化 必备知识点——C#中XML反序列化 必备…

第八课,分支语句嵌套、随机数函数、初识while循环

一,分支结构的嵌套语法 在 Python 中,分支结构可以嵌套,这意味着你可以在一个条件语句中包含另一个条件语句。嵌套的分支结构可以让你更灵活地控制程序的逻辑流程。 怎么理解呢?打个比方:放学后,请三年级…