mysql fulltext_干货!从零开始学习MySQL

2023-11-05

关注我们吧,查看更多干货文章,视频。回复“数据”还有数据分析相关资料领取,每周更有免费直播课,有问题也可私信咨询小编哦!

一、为什么要用全文索引

我们在用一个东西前,得知道为什么要用它,使用全文索引无非有以下原因

  1. like查询太慢、json字段查询太慢(车太慢了)
  2. 没时间引入ElasticSearch、Solr或者Sphinx这样的软件,或者根本就不会用(无法将五菱宏光换成兰博基尼,即使有兰博基尼也不会开)
  3. 加索引、联合索引啥的都已经慢得不行了(限速80,车顶盖都卸了也只能开到30)
  4. 为了提升一下自己的逼格(人家问你有没有开过法拉利,你说开过肯定更有气质一点)

二、什么是全文索引

简单的说,全文索引就相当于大词典中的目录,通过查询目录可以快速定位到想看的内容。全文索引通过建立倒排索引来快速匹配文档(仅在mysql5.6版本以上支持)全文索引将连续的字母、数字和下划线当做一个单词,分割单词一般用空格/逗号/句号MySQL的全文索引支持以下3种查询模式:

  1. 自然语言模式(IN NATURAL LANGUAGE MODE)
    通过MATCH AGAINST 传递某个特定的字符串来进行检索
  2. 布尔模式(IN BOOLEAN MODE)
    支持操作符,例如+表示包含,-表示不包含
  3. 扩展模式(WITH QUERY EXPANSION)
    相当于自然语言模式下的一个扩展,执行两次检索,第一次使用给定短语检索,第二次是结合第一次相关性比较高的行进行检索.

更多请看:官方文档

下面教大家如何创建全文索引,并创建测试数据演示三种查询模式的使用

三、如何创建全文索引

  • 方式一:建表时指定
CREATE TABLE light_weight_baby (     id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,     title VARCHAR(200),     content TEXT,     FULLTEXT(title, content) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; 
  • 方式二:ALTER添加
 ALTER TABLE table_name ADD FULLTEXT INDEX index_name (column1,column2,...);
  • 方式三:CRATE INDEX添加
CREATE FULLTEXT INDEX index_name ON table_name (column1,column2,...);

四、创建测试数据

创建一个数据库用来演示这三种模式下的检索

CREATE DATABASE chenqionghe DEFAULT CHARSET utf8;

创建一个文章表并插入测试数据

CREATE TABLE articles (    id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,    title VARCHAR(200),    body TEXT,    FULLTEXT (title,body)) ENGINE=InnoDB;

插入测试数据

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 will 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 ...');

执行结果如下

五、查询-使用自然语言模式

这是MySQL的默认查询模式,简单示例如下

SELECT * FROM articles    WHERE MATCH (title,body)    AGAINST ('database' IN NATURAL LANGUAGE MODE);

可以看到,不区分大小写,title或body包含database的都返回了,另外,返回的结果将以相关性进行排序。

相关性:根据行中的字段、唯一单词的数量、集合中单词总数和包含特定单词的行数计算。

下面通过两种方式统计数量

# 第一种方式 SELECT COUNT(*) FROM articles    WHERE MATCH (title,body)    AGAINST ('database' IN NATURAL LANGUAGE MODE);# 第二种方式SELECT   COUNT(IF(MATCH (title,body) AGAINST ('database' IN NATURAL LANGUAGE MODE), 1, NULL))    AS count    FROM articles;

第一种做了一些额外的工作(按相关性对结果进行排序),但也能使用索引进行查询。第二种执行了全表扫描,如果搜索项出现在大多数行中,可能比索引查询更快匹配少数行,第一种快,匹配大多数行,第二种快

下面演示如何检索相关性,但不会进行排序(因为不包含WHERE和ORDER BY)

SELECT id, MATCH (title,body)     AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE) AS score    FROM articles;

下面的示例更复杂,返回倒序后的相关性值,分别在SELECT和WHERE语句中使用了MATCH,但是不会导致额外的开销,因为mysql优化器注意到两次MATCH是相同的,只会使用一次全文搜索

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

包含在("")中字符中的会被分解为单词,然后在全文索引中进行搜索,简单的说,就是进行OR查询。

六、查询-使用布尔模式(强大的语法)

使用布尔模式需要指定IN BOOLEAN MODE,不会自动根据相关性排序,一些字符具有特殊的含义,例如可以通过+或-表示一个单词必须存在或不存在。下面的sql语句代表查询必须 包含MySQL但不包含YourSQL

SELECT * FROM articles WHERE MATCH (title,body)    AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);

语法

  • +
    必须出现
  • -
    必须不出现。
    注意:这个操作符是用来排除其他操作符的结果,如果只指定这个,将什么都不返回
  • 无符号
    默认情况,代表或,自动分词搜索。和没有指定IN BOOLEAN MODE的结果一样
  • @distance
    用来测试两个或两个以上的单词是否都在一个指定的距离内,在@距离前指定双引号中的搜索词,例如MATCH(col1) AGAINST('"word1 word2 word3" @8' IN BOOLEAN MODE
  • >
    提高该条匹配数据的权重值
  • <
    降低该条匹配数据的权重值
  • ()
    相当于表达式分组,和我们数学中的表达式一个道理
  • ~
    将其相关性由正转负,表示拥有该字会降低相关性,例如+apple ~macintosh 先匹配apple,但如果同时包含macintosh,排名会靠后
  • *
    通配符,只能在字符串后面使用
  • "
    完全匹配,被双引号包起来的单词必须整个被匹配

示例

  • apple banana
    包含apple或banana其中一个
  • +apple +juice
    必须同时包含apple和juice
  • +apple macintosh
    包含apple,但是如果同时包含macintosh会给更高的排序
  • +apple -macintosh
    包信apple但是不包含macintosh
  • +apple ~macintosh
    包含apple,如果同时包含macintosh降低权重
  • +apple +(>turnover 1.包含apple和turnover,或,包含apple和strudel
    2.包含apple和turnover权重高于包含apple和strudel的记录
  • apple*
    包含apple单词的行, “apple”, “apples”, “applesauce”, “applet”都会被匹配到
  • "some words"
    完全匹配some words的行,例如 “some words of wisdom”能匹配但“some noise words”匹配不到

七、查询-使用扩展模式

当搜索短语很短时非常有用,例如搜索database可能意味着MySQL、Oracle、DB2、RDBMS都要被匹配到,这就是这个模式能做的。添加WITH QUERY EXPANSION或 IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION启用,它会执行两次检索,第一次使用给定短语检索,第二次是结合第一次相关性比较高的行进行检索。例如下面的例子

# 自然语言模式SELECT * FROM articles     WHERE MATCH (title,body)    AGAINST ('database' IN NATURAL LANGUAGE MODE);# 扩展模式SELECT * FROM articles    WHERE MATCH (title,body)    AGAINST ('database' WITH QUERY EXPANSION);

可以看到第二条语句找到了包含MySQL的行,即使该行不包含database,但是因为在第一次的搜索中搜索引擎判断MySQL和database的相关性比较高,所以在执第二次搜索的时候返回了。

八、注意事项

  1. 只能在类型为CHAR、VARCHAR或者TEXT的字段上创建全文索引
  2. MATCH (字段) AGAINST (关键词),必须和创建时的字段一起,例如MATCH (light,weight,baby)使用的字段名与全文索引muscle(light,weight,baby)定义的字段名一致。如果只对单个字段查询,需要分别创建全文索引
  3. 全文索引是以词为基础的,innodb_ft_min_token_size和innodb_ft_max_token_size用来设置单词的最大和最小长度,不在这个长度区间的将忽略。
  4. 在停用词stopwords中的将被忽略
  5. 如果要导入大量数据,先导入数据再建全文索引,比先建全文索引再导入数据的方式快很多。
  6. 在MySQL 5.7.6之前,全文索引只支持英文全文索引,不支持中文全文索引,MySQL 5.7.6后内置了ngram全文解析器,支持中文、日文、韩文分词。

end.

来源:博客园.

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

mysql fulltext_干货!从零开始学习MySQL 的相关文章

  • 解决XML中符号解析问题

    当在xml中使用大于号 gt 小于号 lt 等字符时 会影响xml的解析 1 使用转义字符 lt lt 小于号 gt gt 大于号 amp 和 apos 单引号 quot 双引号 2 使用 被这个标记所包含的内容将表示为纯文本 比如表示文本
  • LeetCode 第7天 动态规划 (子序列问题 二)编辑距离 python

    以下题目来来源 力扣 LeetCode 链接 https leetcode cn problems uncrossed lines 著作权归领扣网络所有 商业转载请联系官方授权 非商业转载请注明出处 1035 不相交的线 在两条独立的水平线
  • redis主从同步 主机down

    redis主机设置了密码 将master和slave的密码配置相同 然后将slave的配置文件中的masterauth属性进行填写 将master的密码写上去即可使用命令slaveof或者在配置文件中 replicaof对master进行指
  • 一步一步教你Pycharm的配置Python环境

    1 点开你的pycharm 创建一个python文件 很多人学习python 不知道从何学起 很多人学习python 掌握了基本语法过后 不知道在哪里寻找案例上手 很多已经做案例的人 却不知道如何去学习更加高深的知识 那么针对这三类人 我给
  • LSTM与Bi-LSTM的时间序列预测(负荷预测)——附代码

    目录 摘要 1 电力负荷预测 2 滑动窗输入结构的构建 3 LSTM 4 Bi LSTM 5 程序运行结果 6 本文Matlab代码实现 摘要 本文使用LSTM和Bi LSTM 以电力负荷预测为例对比了两者的预测性能 其中将电力负荷构造为滑
  • Ubuntu下系统CPU/内存/GPU/硬盘监控查看指令

    1 实时监控CPU及内存的 Htop监控 安装 sudo apt get install htop 启动htop htop Ubuntu默认监控器 Win A打开所有APP 搜索System Monitor System Monitor如下
  • STM32 第18讲 基本定时器(简介/计数模式/寄存器/溢出时间计算方法/实验)

    文章目录 基本定时器简介 基本定时器框图 计数模式及溢出条件 递增计数模式 递减计数模式 中间对齐计数模式 相关寄存器 控制寄存器1 TIMx CR1 DMA 中断使能寄存器 TIMx DIER 状态寄存器 TIMx SR 计数器寄存器 T
  • 【中文分词系列】 8. 更好的新词发现算法

    如果依次阅读该系列文章的读者 就会发现这个系列共提供了两种从0到1的无监督分词方案 第一种就是 中文分词系列 2 基于切分的新词发现 利用相邻字凝固度 互信息 来做构建词库 有了词库 就可以用词典法分词 另外一种是 中文分词系列 5 基于语
  • 一行代码去掉Devexpress弹窗

    使用的是 net hook方法 使用代码 using System using System Windows Forms namespace AlexDevexpressToolTest static class Program
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • 用隐私换便利还是花钱护隐私?个人信息安全问题再度引发关注

    随着互联网的快速发展和大数据时代的到来 个人信息安全问题日益成为社会关注的焦点 最近一则关于某高校毕业生窃取学校内网数据并收集学生个人隐私信息的新闻再度引起了人们对于个人信息泄露的担忧 在享受便捷和高效的互联网生活的同时 我们是否需要用隐私
  • C# IEnumerator/IEnumerable

    迭代器模式 与 C IEnumerator IEnumerable Jul 21 2018 编程 阅读 迭代器模式 与 C IEnumerator IEnumerable Part1 迭代器模式 与 接口 IEnumerable IEnum
  • 从零部署halo博客

    centos docker halo搭建个人博客 从零部署halo博客 准备工作 安装宝塔面板 安装Docker管理器 下载并修改halo配置文件 直接使用本地数据库 利用容器间的关联使用容器中的数据库 以下为注意事项 配置域名访问 SSL
  • Python使用Selenium WebDriver的入门介绍及安装教程

    Selenium WebDriver 入门 一 什么是Selenium WebDriver 二 安装Selenium WebDriver 2 1 安装selenium类库 2 2 安装浏览器驱动 2 3 配置环境变量 三 编写第一个Sele
  • 【Tableau案例】神奇宝贝属性及实力强弱|数据可视化

    提前声明 神奇宝贝的数据分析仅供参考 不涉及对于神奇宝贝的各种评价 另外我是初学tableau 涉及到使用的tableau操作可能很简单 复杂的还掌握不熟练 之后会拿时间系统学习tabelau 数据预处理 该数据集有721个口袋妖怪 分别包
  • 挂载VMware esxi服务器文件夹到本地ubuntu

    概述 开发安卓项目 需要在公司服务器搭建的环境 VMware esxi 上编译代码 可以将服务器上的文件挂载到本地 在本地编辑好代码后再去服务器上编译 登录服务器 使用ssh user host方式登录 例如ssh rk3566 192 1
  • 深入理解Solidity——独立汇编

    独立汇编 Standalone Assembly 上面介绍的在Solidity中嵌入的内联汇编语言也可以单独使用 实际上 它是被计划用来作为编译器的一种中间语言 在这个目的下 它尝试达到下述的目标 使用它编写的代码要可读 即使代码是从Sol
  • 图像处理(1) : 图像增强

    图像增强就是指通过某种图像处理方法对退化的某些图像特征 如边缘 轮廓 对比度等进行处理 以改善图像的视觉效果 提高图像的清晰度 或是突出图像中的某些 有用 压缩其他 无用 信息 将图像转换为更适合人或计算机分析处理的形式 图像增强可以分为两
  • Apache Beam适时有状态计算

    在先前的Apache Beam中的有状态计算中 介绍了Apache Beam中有状态计算的基础知识 重点介绍了对每个元素的处理中添加的状态特性 所谓的适时处理 是有状态计算的补充 是通过设置定时器来 在将来某个时间点上的 有状态的 进行回调

随机推荐

  • 编写一个Vue插件,上传NPM官网开源使用

    插件开发及上传NPM流程 完成组件封装 组件完成统一封装成插件 插件入口文件配置 src main js 中引入口文件 安装插件 配置 package json 文件 npm run lib 打包 umd min js 配置到 packag
  • JavaFX与后台交互

    目前JavaFX相关的资料都是基本语法 以及界面相关 而JavaFX面向的是RIA RIA就肯定需要和后台交互 个人研究了一下 遇到了不少问题 共享给大家 D 首先先看看JavaFX的api 一眼就能看到javafx io http包 包里
  • unity踩坑日记

    花费了一天时间一直在找bug unity打包出来的程序 我勾选了调试模式 因为的确在调试 关闭时就会停止工作 因为涉及到线程一直怀疑自己写退出时候关闭线程的有问题 但是看来看去没找到问题 就去看错误日志 Mono path 0 E Proj
  • 服务器双机热备系统,双机热备

    1 集群技术 在了解双机热备之前 我们先了解什么是集群技术 集群 Cluster 技术是指一组相互独立的计算机 利用高速通信网络组成一个计算机系统 每个群集节点 即集群中的每台计算机 都是运行其自己进程的一个独立服务器 这些进程可以彼此通信
  • Keil 5使用ST-LINK调试STM32程序

    1 下载并安装STM32 ST LINK Utility 含有驱动 2 启动STM32 ST LINK Utility 点击菜单 ST LINK Firmware 更新固件 3 打开Keil工程 设置Debug 4 开始调试
  • C语言的可变参数

    C语言可变参数原理与使用 1 原理与实现 我们定义C语言的几个宏定义来表达这个想法 使用这几个宏定义来实现可变参数函数 2 调用库函数实现 3 可变参函数的封装 1 原理与实现 C语言可变参数 void func char fmt C语言的
  • 《C#入门到精通》学习笔记 -- Console类

    第1章 知识点扩展 1 Main必须是静态 static 方法 指定了程序的唯一入口 2 Console类是内建类 通过其方法 可以在屏幕上显示消息或者从键盘获取输入 表示控制台应用程序的标准输入流 输出流和错误流 Console类继承于S
  • 网络安全毕业设计选题推荐

    0 简介 毕业季马上就要开始了 不少同学询问学长网安专业选题以及开题相关的问题 今天跟大家分享信息安全毕设选题 最新的信息安全 网络安全 专业毕设选题 难度适中 适合作为毕业设计 大家参考 学长整理的题目标准 相对容易 工作量达标 题目新颖
  • ue4 unreal NDisplay插件 简易使用 三折幕 详细...

    仅支持4 27版本 NDisplay文档 https docs unrealengine com 4 27 en US WorkingWithMedia IntegratingMedia nDisplay Overview Switchbo
  • 2020-04-09

    每日书单 每日书单 1 There is only one time in a person s life when he can make a difference That is the moment 2 Can coral be ke
  • Tracy vue3 小笔记 2 - 和 Vue 2 的区别汇总

    1 可以有多个根元素 2 子传父的 emit 多了一步在default 里预定义
  • 什么是java句柄_JAVA中的术语:句柄是啥意思

    句柄的本质 一个唯一的整数 作为对象的身份id 区分不同的对象 和同类中的不同实例 程序可以通过句柄访问对象的部分信息 句柄不代表对象的内存地址 句柄和指针的区别 程序不能通过句柄直接阅读文件中的信息 指针是可以的 从所起的作用这点来说 句
  • IDEA整合Tomcat服务器(IDEA没有Application Server选项)

    IDEA整合Tomcat服务器 IDEA没有Application Server选项 我使用的IDEA创建Java Enterprise的界面如下 没有Application Server选项 不要慌 在Settings中设置Applica
  • LOAM误差函数、代价函数的雅克比矩阵详细推导,点到线和点到面误差函数求导

    LOAM误差函数的导数详细推导 前言 LOAM对于激光SLAM的发展起到了举足轻重的作用 他提出了点到线和点到面的误差函数 通过优化的方法 得到了非常不错的激光里程计效果 我猜测作者Zhang Ji很可能是从点到线和点到面的ICP算法中找到
  • HTML入门学习笔记

    我是目录 1 标题 段落标签 2 文本格式化标签 3 布局标签 div span 4 图像标签 5 相对路径 绝对路径 6 链接标签 锚点标签 7 表格标签 显示数据 8 列表标签 布局页面 9 表单标签 为了收集用户信息 1 标题 段落标
  • Box2D v2.3.0 用户指南(第四章)

    第四章 碰撞模块 Collision Module 4 1简介 碰撞模块包含形状 shape 以及操作它们的函数 此外 碰撞模块还包括dynamictree和broad phase来加快大型系统的碰撞处理速度 碰撞模块被设计为可独立于动态系
  • OrCAD进行DRC时报错的解决办法(持续添加中~~)

    1 WARNING ORCAP 1829 Possible pin type conflict 报错原因 器件的引脚类型和直接连接的信号类型冲突了解决方法 此类警告可直接忽略 或按如下方法处理 1 单击出现警告的器件 右键选择 Edit P
  • Python编程小知识-1-省略号运用

    默默无闻的省略号很好用 在Python中 一切皆对象 省略号也不例外 在Python 3中你可以直接写来得到它 gt gt gt Ellipsis gt gt gt type
  • 复习C语言指针---数组指针

    复习C语言指针 第二章 数组指针 数组指针 复习C语言指针 第二章 数组指针 数组指针定义 数组指针和二维数组 数组指针和指针数组 总结 数组指针定义 数组指针 其本质是指针 是指向一整个数组的指针 一 这里 要说明指向数组的指针和指向一整
  • mysql fulltext_干货!从零开始学习MySQL

    关注我们吧 查看更多干货文章 视频 回复 数据 还有数据分析相关资料领取 每周更有免费直播课 有问题也可私信咨询小编哦 一 为什么要用全文索引 我们在用一个东西前 得知道为什么要用它 使用全文索引无非有以下原因 like查询太慢 json字