MySQL必知必会 学习笔记 第十八章 全文本搜索

2023-11-13

并非所有引擎都支持全文本搜索,MyISAM支持。

更新:
1.MySQL 5.6 以前的版本,只有 MyISAM 存储引擎支持全文索引;
2.MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存储引擎均支持全文索引;
3.只有字段的数据类型为char、varchar、text的列才可以建全文索引。

LIKE和REGEXP都能搜索一个文本,但存在以下限制:
1.性能:它们会匹配表中所有行且这些搜索极少使用索引。
2.明确控制:它们很难明确匹配什么和不匹配什么,如指定一个词必须匹配、一个词必须不匹配、而一个词仅在第一个词确实匹配的情况下才能匹配或才能不匹配。
3.智能化的结果:如一个特殊词搜索会返回所有包含该词的行,而不区分包含单次匹配的行和包含多次匹配的行。

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

为使用全文本搜索,必须索引被搜索的列,且随着数据的改变不断地重新索引,对表适当设计后,MySQL会自动进行重新索引。

一般在创建表时启用全文本搜索,CREATE TABLE语句接受FULLTEXT子句,它给出一个逗号分隔的被索引列的列表:

CREATE TABLE productnotes
(
    note_id       int          NOT NULL AUTO_INCREMENT,
    prod_id       char(10)     NOT NULL,
    note_data     datetime     NOT NULL,
    note_text     text         NULL,                         # 接受NULL值
    PRIMARY KEY(note_id),
    FULLTEXT(note_text)
) ENGINE = MyISAM;

上表中FULLTEXT索引单个列,也可以指定多个列。定义后MySQL自动维护该索引,增删改时索引随之更新。

更新索引需要的时间不多,但毕竟花时间,如果正在导入数据到一个新表,此时不应启用FULLTEXT,应在导完数据后再定义FULLSET,从而更快地导入数据(这样也可以使索引数据的总时间小于在导入每行时分别进行索引所需的总时间)。

进行全文本搜索:

SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('rabbit');

以上SQL语句从note_text列中搜索表达式'rabbit'

传递给Match函数的值必须与FULLTEXT定义中的相同,如果指定多个列,必须全部列出它们(而且次序正确)。

除非使用BINARY方式,否则全文本搜索不区分大小写。

全文本搜索的结果是以匹配的良好程序排序的,一个规则是匹配的串在整个文本的位置(即作为第几个词出现的),越靠前优先级越高。排序优先级查看:

SELECT note_text, Match(note_text) Against('rabbit') AS rank
FROM productnotes;

运行它:
在这里插入图片描述
以上rank列由词数、位置等因素计算,不包含词rabbit的行值为0,不会被WHERE子句选出来,而选出来的行以rank降序排序。

查询扩展可放宽返回的全本文搜索的范围,如除了想找出含anvils的行,还想找出可能与搜索有关的行,即使它不包含anvils。

使用查询扩展时,会对数据和索引进行两遍扫描完成搜索:
1.进行基本的全文本搜索,找出与搜索条件匹配的所有行。
2.检查这些匹配行,并选择所有有用的词。
3.再次进行全文本搜索,不仅用原来的条件,还使用所有有用的词。

查询扩展在MySQL 4.1.1中引入。

使用查询扩展前的SQL:

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);

使用查询扩展的输出:
在这里插入图片描述
返回了七行,第一行包含词anvils,等级最高。第二行含第一行中的两个词(customer和recommend),也被检索出来。第三行也包含这两个词,但它们在文本中的位置更靠后,且分开地更远。

表中行越多,使用查询扩展返回的结果越好。

布尔文本搜索可提供以下内容的细节:
1.要匹配的词。
2.要排斥的词(如果某行包含这个词,不返回该行,即使它包含其他指定的词)。
3.排序提示(指定词的优先级)。
4.表达式分组。
5.另外一些内容。

布尔文本搜索没有FULLTEXT索引也能使用,此操作非常缓慢。

使用布尔文本搜索:

SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('heavy' IN BOOLEAN MODE);

运行它,得到两行:
在这里插入图片描述

以上SQL搜索包含词heavy的所有行,虽然它使用了IN BOOLEAN MODE,但没有使用布尔操作符,因此其结果与没有指定布尔方式的结果相同。

匹配包含heavy但不包含以rope开始的词的行:

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

运行它:
在这里插入图片描述
可见结果中只剩一行了,因为另一行包含以rope开头的词ropes。

MySQL 4.x中上例SQL可能不返回任何行,这是*操作符处理时的一个错误。

在这里插入图片描述
匹配包含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而不是这两个词:

SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('"rabbit bait"' IN BOOLEAN MODE);

匹配含rabbit或carrot的行,且增加前者的等级,降低后者的等级,等级用来以降序排序结果:

SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('>rabbit <carrot' IN BOOLEAN MODE);

匹配含safe和combination行,降低后者等级:

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

排列而不排序指布尔方式中,不按等级值降序排序返回的行。

关于全文本搜索的说明:
1.索引全文本数据时,三个及以下字符的短词行被忽略且从索引中删除。三个字符的限制可更改。
2.MySQL内建一个非用词列表,这些词在索引全文本数据时总被忽略,非用词列表可被覆盖。
3.许多词出现频率很高,搜索它们没有用处,如果一个词出现在50%以上的行中,则将它作为一个非用词忽略。50%规则不适用于IN BOOLEAN MODE。
4.如果表中行数小于三行,则全文本搜索不返回结果(每个词或者不出现,或者至少出现在50%的行中)。
5.忽略词中的单引号,如don’t索引为dont。
6.不具有词分隔符的语言(中文、日文等)不能恰当地返回全文本搜索结果。

MySQL还不支持邻近操作符,邻近搜索是许多全文本搜索支持的一个特性,能用于规定命中的检索词在记录中的间隔距离(或是否在相同句子中、相同段落中等)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL必知必会 学习笔记 第十八章 全文本搜索 的相关文章

  • MYSQL必知必会:格式化导入导出数据集

    在mysql中 我们可以把查询到的结果集通过自定义的格式打印到指定文件内 指定文件不存在 如果指定文件存在 则失败 下面是表结构合表数据 1 格式化导出数据 把表order info的所有记录的所有字段导入到 d 1 sql 文件内 sel
  • MySQL必知必会 学习笔记 第三章 使用MySQL

    为连接到MySQL 需要 1 主机名 如连接到本地MySQL服务器 为localhost 2 端口 如使用默认的3306以外的端口 3 用户名 4 用户口令 连接到MySQL时 没有任何数据库打开供你使用 打开数据库 use databas
  • MySQL必知必会 学习笔记 第十九章 插入数据

    插入可用以下方式进行 1 插入完整行 2 插入行的一部分 3 插入多行 4 插入某些查询的结果 可针对每个表或每个用户 利用MySQL的安全机制禁止使用INSERT语句 插入语句没有输出 插入完整的行 INSERT INTO tableNa
  • MySQL必知必会 学习笔记 第二十六章 管理事务处理

    并非所有引擎都支持事务处理 MyISAM不支持 InnoDB支持 事务处理可用来维护数据库的完整性 它保证成批的MySQL操作要么完全执行 要么完全不执行 如果没有错误发生 整组语句写到数据库表 如果发生错误 将已经执行的部分语句进行回退
  • MySQL必知必会——第十四章使用子查询

    使用子查询 本章介绍什么是子查询以及如何使用它们 子查询 SELECT语句是SQL的查询 目前我们用的所有SELECT语句都是从单个数据库表中检索数据的单条简单语句 查询 query 任何SQL语句都是查询 但此术语一般指SELECT语句
  • MySQL必知必会 学习笔记 第一章 了解SQL

    数据库是保存有组织的数据的容器 通常是一个或一组文件 数据库软件称为DBMS 数据库管理系统 数据库是被DBMS创建和操纵的容器 数据库究竟是文件或其他东西并不重要 因为你不会直接访问数据库 而是间接通过DBMS替你访问数据库 表是某种特定
  • MySQL必知必会 学习笔记 第二十七章 全球化和本地化

    不同的语言和字符集需要以不同的方式存储和检索 MySQL需要适应不同的字符集 以及排序和检索这些数据的方法 术语 1 字符集 字母和符号的集合 2 编码 某个字符集成员的内部表示 3 校对 规定字符如何比较 查看MySQL支持的字符集列表
  • MySQL必知必会 学习笔记 第十四章 使用子查询

    MySQL 4 1引入了子查询 任何SQL语句都是查询 但此术语一般指SELECT语句 有两张表 一张是语言表 一张是电影表 选出语言是英语的电影 SELECT title FROM film WHERE language id IN SE
  • MySQL必知必会——第十章创建计算字段

    创建计算字段 本章介绍什么是计算字段 如何创建计算字段以及怎样从应用程序中使用别名引用它们 计算字段 存储在数据库表中的数据一般不是应用程序所需要的格式 例如 想在一个字段中显示公司名和地址 但公司名和地址在不同的列中等等 我们需要直接从数
  • MySQL必知必会 学习笔记 第九章 用正则表达式进行搜索

    正则表达式是用来匹配文本的特殊的串 它用正则表达式语言来建立 MySQL支持的正则表达式仅为正则表达式的一个很小的子集 可通过WHERE子句使用正则表达式过滤SELECT检索出的数据 检索条件列包含字符100的所有行 SELECT colu
  • MySQL必知必会——第十六章创建高级联结

    创建高级联结 本章将讲解另外一些联结类型 包括它们的含义和使用方法 介绍如何对被联结的表使用表别名和聚集函数 使用表别名 第十章 MySQL必知必会 第十章创建计算字段 介绍了如何使用别名引用表列 mysql gt SELECT Conca
  • MySQL必知必会——第十七章组合查询

    组合查询 本章讲述如何利用UNION操作符将多条SELECT语句组合成一个结果集 组合查询 多数SQL查询都只包含从一个或多个表中返回数据的单条SELECT语句 MySQL也允许执行多个查询 并将结果作为单个查询结果返回 这些组合查询通常称
  • MySQL必知必会——第二十章更新和删除数据

    更新和删除数据 本章介绍如何利用UPDATE和DELETE语句进一步操纵表数据 更新数据 为了更新 修改 表中的数据 可以使用UPDATE语句 UPDATE的两种用法 更新表中特定行 更新表中所有行 不要省略WHERE子句 缺少WHERE子
  • MySQL必知必会 学习笔记 第二十八章 安全管理

    用户应该具有适当的访问权 既不能多也不能少 MySQL Administrator提供了图形界面 可用来管理用户和账号权限 MySQL创建一个名为root的用户账号 它对整个MySQL服务器有完全的控制 在日常工作中 决不能使用root 而
  • MySQL必知必会 学习笔记 第七章 数据过滤

    可用AND操作符给WHERE子句附加条件 SELECT columnName FROM tableName WHERE columnName1 1 AND columnName2 2 OR操作符指示MySQL匹配符合操作符任一端条件的行 S
  • MySQL必知必会 学习笔记 第二十三章 使用存储过程

    MySQL 5中增加了存储过程的支持 一个操作需要多条SQL语句才能完成时 可以创建存储过程 其中保存一条或多条SQL语句 使用存储过程的理由 1 通过把处理封装在容易使用的单元中 简化复杂的操作 2 所有人都使用同一存储过程代替某复杂操作
  • MySQL必知必会 学习笔记 第二十二章 使用视图

    MySQL 5添加了对视图的支持 视图是虚拟的表 它包含的是一个查询的结果 它本身不含数据 只是用来查看存储在别处的数据的一种设施 视图返回的数据是从其他表中检索出来的 在添加或更改这些表中的数据时 视图将返回改变过的数据 视图的应用 1
  • MySQL必知必会 学习笔记 第十二章 汇总数据

    聚集函数是运行在行组上 计算和返回单个值的函数 对表中数据而非实际数据本身进行汇总 如获取行数 获取某列最值等 除上述函数外 MySQL还支持标准偏差聚集函数 返回某列平均值 SELECT AVG columnName AS avgVal
  • MySQL必知必会——第四章检索数据

    检索数据 本章将介绍如何使用SELECT语句从表中检索一个或多个数据列 SELECT语句 SQL语句是由简单的英语单词关键字构成的 每个SQL语句都由一个或多个关键字构成 最常用的SQL语句就是SELECT语句 它的用途是从一个或多个表中检
  • MySQL必知必会 学习笔记 第二十五章 使用触发器

    触发器在MySQL 5中增加 触发器可以在MySQL响应DELETE INSERT UPDATE语句时自动执行一条SQL语句 MySQL 5中触发器名在每个表中唯一而不是在一个数据库中唯一 其他DBMS有的重名限制是数据库范围 以后MySQ

随机推荐

  • the resource is not on the build path of a java project错误

    在eclipse中 使用mavenimport了一个工程 但是在对某一个类进行F3 F4 ctrl alt H操作的时候报错 the resource is not on the build path of a java project 这
  • Windows下libcurl的配置(笔记)

    第一步 下载curl源代码 在官网就能下到 第二部 解压文件 进入文件新建一个名为build的目录 在build目录中新建一个install目录用于存放安装文件 第三部 用CMAKE配置 没有可以去下载 第四部 点击Configure之后
  • 前端搭建猜数字游戏(内附源码)

    The sand accumulates to form a pagoda 写在前面 功能介绍 页面搭建 样式设置 逻辑部分 完整代码 写在前面 上周我们实通过前端基础实现了打字通 当然很多伙伴再评论区提出了想法 后续我们会考虑实现的 今天
  • 传值、传址、引用的介绍及各自的优缺点

    1 传值 1 1 概念 void Swap int left int right int temp left left right right temp int main int a 10 int b 20 cout lt lt a lt
  • Angular8 环境搭建

    Angular 环境搭建 无论使用什么前端框架 都必然使用到NodeJS工具 Angular也不例外 Angular采用的是 全家桶 式的设计思路 因此 angular cli脚手架工具集成了日常开发需要使用到的所有NodeJS模块 使用
  • Java实现压缩解压文件

    关键词 ZipOutputStream ZipInoutStream 最近在工作中有需求需要在浏览器中一次性下载多个文件 于是想到了使用压缩的功能 百度了一下 发现很多博客的内容都大致相同 不太方便使用 于是自己写了这么一个工具类 使用JD
  • 什么是视图,视图的创建、删除、使用?

    什么是视图 视图是一张虚拟的表 视图与数据库中存在的表不太相同 之前我们创建的表都是包含数据的 如用户信息订单信息 然而视图是不包含数据的 举例 查询王五的所有订单的情况 王五本身要从用户表user进行查找 王五有很多订单要用订单表中进行查
  • git文件存放结构

    该思维导图是自己在整理笔记的时候 发现内容不全 但属于有略微用处的 上传csdn作为笔记存档 主要包括git的几种数据类型blob tree commit 以及git中常用到的合并策略 pdf地址 https download csdn n
  • 算法与数据结构_链表

    链表 一 理解指针或引用的含义 含义 将某个变量 对象 赋值给指针 引用 实际上就是就是将这个变量 对象 的地址赋值给指针 引用 示例 p gt next q 表示p节点的后继指针存储了q节点的内存地址 p gt next p gt nex
  • 基本数据类型:浮点型、指针

    浮点数家族包括float double和long double类型 通常 这些类型分别提供单精度 双精度以及在某些支持扩展精度的机器上提供扩展精度 ANSI标准仅仅规定long double至少和double 一样长 而double至少和f
  • 如何创建Spring项目以及如何使用?

    目录 1 创建Spring项目 2 将对象存储在Spring中 3 从Spring中取出对象 4 使用对象 5 总结 Spring 就是 个包含了众多 具 法的 IoC 容器 它具备两个最基本的功能 将对象存储到容器 Spring 中 从容
  • 三层交换机 单臂路由 trunk access接口

    交换机 单独使用时条件比较苛刻 通信双方同一网段 同一网关 单臂路由和三层交换机可以实现跨网段通信 三层交换机 交换机和路由器兼并 可以设置VLAN 概念 分隔广播域 广播 一对多 人为进行切割 互不相干 逻辑分隔 属于代码 交换机 为了提
  • 简历中不写年龄、毕业院校、预期薪资会怎样?

    第五 自我评价 这一项与文凭一样 作者可能传达的意思是不要写在个人信息栏中 但很容易让人误解为不要写 这块真的需要看情况 如果你的自我评价非常好 那一定要提前曝光 展现 比如我的自我评价中会写到 全网博客访问量过千万 CSDN排名前100
  • C语言九九乘法表

    C语言编程实现九九乘法表 样式要求长方形 右三角形 左三角形 解题思路 这个问题的算法很简单 就是两个for循环的嵌套 三角形的样式就是多了一些空格 长方形源代码演示 include
  • 国内企业CAE仿真的作用和特点

    在知乎上看到某前辈所写的国内CAE仿真的现状的回答 觉得其将国内企业CAE仿真的作用和特点分析的很到位 询问可以转发之后 就转发到自己的博客中 希望也能给刚从事CAE仿真的同行一点帮助 知乎原文链接聊一聊国内CAE领域的现状吧 知乎 zhi
  • jar包中的文件找不到对应的地址的解决方法

    对于本地的地址 测试时可以 一上到服务环境 就报错 xml的文件地址找不到 于是也找了好多网上的方式解决 但始终解决不了 于是在一次偶然机会 找到了一种方式 反射流的方式 解决 InputStream inputStream ClassUt
  • Qt Install FrameWork——Qt打包工具

    主要介绍三部分内容 Qt Install FrameWork安装 打包程序 程序安装 环境配置 一 Qt Install FrameWork安装 两种方式 编译源码 安装预编译好的Installer 推荐安装预编译好的Installer 下
  • FreeRTOS的学习(二)——队列的介绍和操作

    目录 队列的简介 任务对队列的操作 读取队列中的消息 向队列中发送消息 队列结构体 队列创建 1 函数 xQueueCreate 动态创建队列 函数原型 参数 返回值 2 函数 xQueueCreateStatic 静态创建队列 函数原型
  • C++ cout << “\n“与 cout << endl的一个区别

    一句话概括 n 不会终止setw的计算 endl会 实际场景 代码1 include
  • MySQL必知必会 学习笔记 第十八章 全文本搜索

    并非所有引擎都支持全文本搜索 MyISAM支持 更新 1 MySQL 5 6 以前的版本 只有 MyISAM 存储引擎支持全文索引 2 MySQL 5 6 及以后的版本 MyISAM 和 InnoDB 存储引擎均支持全文索引 3 只有字段的