mysql全文索引

2023-05-16

众所周知,使用like '%xxx%'进行模糊查询时,字段的索引就会失效。因此,在数据量大的情况下,通过此种方式查询的效率极低。这个时候,就可通过全文索引(Full-Text Search)来进行优化。

全文索引(Full-Text Search)是将存储于数据库中的整本书或整篇文章中的任意信息查找出来的技术。它可以根据需要获得全文中有关章、节、段、句、词等信息,也可以进行各种统计和分析。

全文索引一般是通过倒排索引实现的。

一、倒排索引

倒排索引同 B+Tree 一样,也是一种索引结构。它在辅助表中存储了单词与单词自身在一个或多个文档中所在位置之间的映射,这通常利用关联数组实现,拥有两种表现形式:

inverted file index:{单词,单词所在文档的id}

full inverted index:{单词,(单词所在文档的id,再具体文档中的位置)}

创建删除全文索引

若需对大量数据设置全文索引,建议先添加数据再创建索引。

1、创建表时创建全文索引

create table 表名(字段名1,字段名2,字段名3,字段名4,FULLTEXT full_index_name (字段名))ENGINE=InnoDB;

2、为已有表添加全文索引

create fulltext index 索引名称 on 表名(字段名)

3、删除全文索引

alter table 表名
    drop index 索引名;

二、使用全文索引

语法:

MATCH(col1,col2,...) AGAINST(expr[search_modifier])
search_modifier:
{
    IN NATURAL LANGUAGE MODE
    | IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION
    | IN BOOLEAN MODE
    | WITH QUERY EXPANSION
}

全文索引分为三种类型:自然语言的全文索引(NaturalLanguage)、布尔全文索引(Boolean)和查询扩展搜索。

在不使用in … mode的情况下,默认采用的是自然语言的全文索引。

1、自然语言的全文索引

自然语言的全文索引可以计算每个文档对象和查询的相关性。

SELECT
    *,
    MATCH (字段名) against ( '需要符合的内容' ) AS Relevance 
FROM
    表名;

相关性主要与以下条件有关:

  • word 是否在文档中出现

  • word 在文档中出现的次数

  • word 在索引列中的数量

  • 多少个文档包含该 word

2、布尔全文索引

布尔搜索使用特殊查询语言的规则来解释搜索字符串,该字符串包含要搜索的词,它还可以包含指定要求的运算符,例如匹配行中必须存在或不存在某个词,或者它的权重应高于或低于通常情况。

Boolean 全文检索支持的类型(可以通过ft_boolean_syntax变量来查看)包括:

  • +:表示该 word 必须存在

  • -:表示该 word 必须不存在

  • (no operator)表示该 word 是可选的,但是如果出现,其相关性会更高

  • @distance表示查询的多个单词之间的距离是否在 distance 之内,distance 的单位是字节,这种全文检索的查询也称为 Proximity Search,如 MATCH(context) AGAINST(‘“Pease hot”@30’ IN BOOLEAN MODE)语句表示字符串 Pease 和 hot 之间的距离需在30字节内

  • >:表示出现该单词时增加相关性

  • <:表示出现该单词时降低相关性

  • ~:表示允许出现该单词,但出现时相关性为负

  • * :表示以该单词开头的单词,如 lik*,表示可以是 lik,like,likes

  • " :表示短语

例子:

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

--no operator
SELECT
    * 
FROM
    `fts_articles` 
WHERE
    MATCH ( title, body ) AGAINST ( 'MySQL IBM' IN BOOLEAN MODE );

--@
SELECT
    * 
FROM
    `fts_articles` 
WHERE
    MATCH ( title, body ) AGAINST ( '"DB2 IBM"@3' IN BOOLEAN MODE );


--> <
SELECT
    * 
FROM
    `fts_articles` 
WHERE
    MATCH ( title, body ) AGAINST ( '+MySQL +(>database <DBMS)' IN BOOLEAN MODE );

--~

SELECT
    * 
FROM
    `fts_articles` 
WHERE
    MATCH ( title, body ) AGAINST ( 'MySQL ~database' IN BOOLEAN MODE );

--*
SELECT
    * 
FROM
    `fts_articles` 
WHERE
    MATCH ( title, body ) AGAINST ( 'My*' IN BOOLEAN MODE );

--"
SELECT
    * 
FROM
    `fts_articles` 
WHERE
    MATCH ( title, body ) AGAINST ( '"MySQL Security"' IN BOOLEAN MODE );

3、查询扩展搜索

查询扩展相当于在自然语言索引的结果上,基于结果的关键字再进行一次查询。也就是说分成两个阶段:

  • 第一阶段:根据搜索的单词进行全文索引查询

  • 第二阶段:根据第一阶段产生的分词再进行一次全文检索的查询

用法:

SELECT column1, column2
FROM table1
WHERE MATCH(column1,column2)
      AGAINST('keyword',WITH QUERY EXPANSION);

三、注意点

1、自然语言全文索引创建索引时的字段需与查询的字段保持一致,即MATCH里的字段必须和FULLTEXT里的一模一样;

2、自然语言检索时,检索的关键字在所有数据中不能超过50%(即常见词),则不会检索出结果。可以通过布尔检索查询;

3、在mysql的stopword中的单词检索不出结果。可通过SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD查询所有的stopword。遇到这种情况,有两种解决办法:

(1)stopword一般是mysql自建的,但可以通过设置ft_stopword_file变量为自定义文件,从而自己设置stopword,设置完成后需要重新创建索引。但不建议使用这种方法;

(2)使用布尔索引查询。

4、小于最短长度和大于最长长度的关键词无法查出结果。可以通过设置对应的变量来改变长度限制,修改后需要重新创建索引。

myisam引擎下对应的变量名为ft_min_word_len和ft_max_word_len

innodb引擎下对应的变量名为innodb_ft_min_token_size和innodb_ft_max_token_size

5、MySQL5.7.6之前的版本不支持中文,需使用第三方插件

6、全文索引只能在 InnoDB(MySQL 5.6以后) 或 MyISAM 的表上使用,并且只能用于创建 char,varchar,text 类型的列。

最后

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

小编已加密:aHR0cHM6Ly9kb2NzLnFxLmNvbS9kb2MvRFVrVm9aSGxQZUVsTlkwUnc==出于安全原因,我们把网站通过base64编码了,大家可以通过base64解码把网址获取下来。

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

mysql全文索引 的相关文章

  • rosserial简介

    rosserial是用于非ROS设备与ROS设备进行通信的一种协议 它为非ROS设备的应用程序提供了ROS节点和服务的发布 订阅功能 xff0c 使在非ROS环境中运行的应用能够通过串口或网络能够轻松地与ROS应用进行数据交互 rosser
  • ARM汇编编程基础(五) -- 其它常见寻址模式与常见指令

    本系列文章节选自本人所著 深入浅出嵌入式底层软件开发 现在我们已经掌握了所有知识 xff0c 可以编写简单的ARM汇编程序 xff0c 但如果要编写较为复杂的ARM程序 xff0c 就必须掌握更多的寻址模式和指令 xff0c 这就是本节的重
  • 为什么 Docker 和 Kubernetes 是用 Go 写的而不是 C# ?

    这是 Reddit 平台上面这几天一篇比较热门的帖子 非常有意思 xff0c 本文我列出了几个高赞的回答 x1f466 HahahahahaSoFunny 为什么 Docker 和 Kubernetes 工具是用 Go 写的而不是 C xf
  • BeanPropertyRowMapper使用注意事项

    query过程都可以进行数据类型自动转换 xff0c 而且不仅仅按标准命名 xff0c 还可以支持下划线分隔后拼接成驼峰式字符 完全轻量级 BeanPropertyRowMapper ParameterizedBeanPropertyRow
  • Hello Kubernetes快速交互实验手册

    K8S在线实验室提供了一个交互实验环境 xff0c 现将这部分文章精简并翻译为中文 xff0c 希望对那些不了解K8S的童鞋有帮助 xff0c 能够快速玩起来有个感性认识 原文 xff1a https kubernetes io docs
  • 嵌入式程序员的几年的小心得

    作为嵌入式研发工程师工作也几年了 xff0c 其实在大学时期11年那会儿在做的 xff0c 现在依然在是做 xff0c 现在接触的单片机 Arm Linux 安卓程序这三类 xff0c 其实和大学时候的时期做的东西并无区别 只不过当时除了学
  • 2.17.3-Python爬虫(requests登录)

    文章目录 1 环境与配置1 1 创建一个pure python项目1 2 集成configparser1 3 集成selenium1 3 1 pycharm安装selenium包1 3 2 下载自己chrome浏览器版本对应的驱动1 3 3
  • C++实现麻将基本听牌胡牌的算法

    include lt iostream gt include lt vector gt include lt algorithm gt include lt chrono gt enum MajiangType emMJType Wan 6
  • H3C交换机查看相关的命令

    1 dis cpu 查看CPU 2 dis memory 查看内存 3 dis device 查看硬件 4 dis power 查看电源 5 dis fan 查看风扇 6 dis env 查看温度 7 dis version 查看版本 8
  • 我的学习之路—5月1号开始,每周至少写5篇文章

    xfeff xfeff 爱拼才会赢 xff0c 这不仅仅是一句宣言 xff0c 而是一种态度 一种乐观向上的态度 一种端正的态度 请相信 xff0c 有什么样的态度 xff0c 就有什么样的结果 有什么样的态度 xff0c 就有什么样的人生
  • Serverlet生命周期

    xfeff xfeff Serverlet简介 xff1a Servlet Server Applet xff0c 全称Java Servlet xff0c 未有中文译文 是用Java编写的服务器端程序 其主要功能在于交互式地浏览和修改数据
  • CentOS下yum安装wine

    Linux下安装wine可以从源码编译安装 xff0c 但一般都觉得麻烦 xff0c 所以尽量利用yum进行安装 xff0c 解决很多包的依赖关系 首先安装一个epel rpm ivh http dl Fedoraproject org p
  • Maven使用教程

    一 Maven介绍 我们在开发项目的过程中 xff0c 会使用一些开源框架 第三方的工具等等 xff0c 这些都是以jar包的方式被项目所引用 xff0c 并且有些jar包还会依赖其他的jar包 xff0c 我们同样需要添加到项目中 xff
  • Linux下 文件类型不同颜色的含义

    linux 文件颜色的含义 蓝色 代表目录 绿色 代表可执行文件 红色 表示压缩文件 浅蓝色 表示链接文件 灰色 表示其他文件 红色闪烁 表示链接的文件有问题了 黄色 表示设备文件 蓝色文件 目录 白色文件 一般性文件 xff0c 如文本文
  • Jenkins在windows上详细安装(service的msi包安装)与构建部署使用教程

    注意 xff1a 这种安装方式 xff0c Jenkins将做为service在windows上安装 xff0c GUI测试build时将看不到浏览器 如需要GUI测试build 可新建一个windows slave来build Jenki
  • vim常用命令总结

    vim 选择文本 xff0c 删除 xff0c 复制 xff0c 粘贴 文本的选择 xff0c 对于编辑器来说 xff0c 是很基本的东西 xff0c 也经常被用到 xff0c 总结如下 xff1a v 从光标当前位置开始 xff0c 光标
  • Spring boot WebMvcConfigurerAdapte方法已经过时解决方法

    在spring boot 2 0以后 WebMvcConfigurerAdapter 这个方法已经过时 xff0c 通过百度网上的资料之后发现很多人说是改成继承WebMvcConfigurationSupport这个类 xff0c 这种方式
  • RTOS流和消息缓冲器

    RTOS流和消息缓冲器 任务间通信和同步 可从FreeRTOS V10 0 0获得 介绍 流缓冲区是 RTOS任务 的RTOS任务 xff0c 并且是任务通信原语的中断 与大多数其他FreeRTOS通信原语不同的是 xff0c 它们针对单读
  • 使用 Docker/LXC 迅速启动一个桌面系统

    原文出处 xff1a vpsee Docker是 dotCloud 的一个开源引擎 xff0c 旨在提供一种应用程序的自动化部署解决方案 xff0c 简单的说就是 xff0c 在 Linux 系统上迅速创建一个容器 xff08 类似虚拟机
  • [统计学笔记] 统计学计算题选讲(精华)

    统计学计算题选讲 第 1 题 某班级学生物理课程考试成绩分别为 68 89 88 84 86 87 75 73 72 68 75 82 97 58 81 54 79 76 95 76 71 60 90 65 76 72 76 85 89 9

随机推荐

  • Python爬取CSDN博客所有文章

    需求 Python爬取某个账号CSDN博客所有文章的标题 xff0c 类型 xff0c 创建时间 xff0c 阅读数量 xff0c 并将结果保存至Excel 分析 CSDN主页URL为 xff1a https blog csdn net s
  • 乐鑫ESP32-C3项目(8)- USB串口和JTAG控制器

    摘录自参考手册之 23 USB串口 JTAG控制器 可用于烧录芯片外部flash 读取程序输出的数据 JTAG调试 仅占用2个管脚接电脑USB即可 xff0c 无需其他转换器 包含CDC ACM xff08 通信设备类抽象控制模型 xff0
  • launch 文件解析

    roslaunch工具是ros中python实现的程序启动工具 xff0c 通过读取launch文件中的参数配置 属性配置等来启动一系列节点 xff1b 很多ROS包或源码包中都有launch文件 xff0c 一般为该程序包能够运行起来的基
  • git 下载特定分支

    1 esp32上有2个分支 现在要下载特定的分支 git clone b esp32 homekit ble ssh liuyuhai 64 gerrit yeedev com 29418 yeelink firmware esp32 2
  • Docker: Ubuntu使用VNC运行基于Docker容器里的桌面系统

    https hub docker com r dorowu ubuntu desktop lxde vnc https github com fcwu docker ubuntu vnc desktop docker ubuntu vnc
  • JavaScript学习--splice()函数详解

    splice 函数详解 splice 方法向 从数组中添加 删除项目 xff0c 然后返回被删除的项目 注释 xff1a 该方法会改变原始数组 参数 xff1a index 必需 整数 xff0c 规定添加 删除项目的位置 xff0c 使用
  • docker查看容器IP的方法

    1 进入容器内部后 cat etc hosts 会显示自己以及 link 软连接的容器IP 2 使用命令 docker inspect docker inspect f 39 range NetworkSettings Networks I
  • java下载需要oracle账户

    https www oracle com java technologies javase downloads html 目前在官网下载低于jdk1 8的java jdk的时候需要登陆 xff0c 这边分享一个账号 xff0c 方便下载 账
  • uni-app网络请求封装(完整版)

    目录结构 根目录开始 api 所有请求 user js 用户请求api store 全局store管理 modules api模块 user js 用户请求模块 index js 状态管理初始化 utils 全局公用方法
  • vue+flv.js+SpringBoot+websocket实现视频监控与回放

    vue 43 flv js 43 SpringBoot 43 websocket实现视频监控与回放 需求 vue 43 springboot的项目 需要在页面展示出海康的硬盘录像机连接的摄像头的实时监控画面以及回放功能 之前项目里是纯前端实
  • ERROR 1064 (42000) You have an error in your SQL syntax; check the manual that corresponds to your

    在MySQL中导入 sql文件时 通过 use data source C info sql use data 数据库名称为data source C info sql 提前把 sql文件放入一个不太复杂的文件夹 xff0c 路径中最好不要
  • vue中实现路由跳转的三种方式(超详细整理)

    vue中实现路由跳转的三种方式 一 使用vue router vue router 本质是一个第三方的包 用的时候需要下载 步骤 xff08 7步法 xff09 xff1a 下载vue router模块到当前工程 yarn add vue
  • docker删除镜像、容器命令

    所有镜像和容器都删除的命令 docker system prune a 查看镜像 docker images 删除单个镜像 docker rmi f lt 镜像id gt 删除所有镜像 xff0c 不删除容器 docker rmi dock
  • Linux更改文件名

    使用mv a b 就可以重命名了 mv move移动文件 xff08 延伸功能 xff1a 重命名 linux系统没有专门的重命名命名 xff09 基本格式 mv filename newname 转载至 xff1a https blog
  • Docker如何对镜像进行命名

    1 在创建镜像时直接给镜像加上名称 xff0c 如下命令 xff1a docker build t mydemo f DockerFile txt 2 当使用创建命令忘记加上镜像名称了 xff0c 此时使用 docker imges 查看镜
  • Linux 下三种方式设置环境变量

    1 在Windows 系统下 xff0c 很多软件安装都需要配置环境变量 xff0c 比如 安装 jdk xff0c 如果不配置环境变量 xff0c 在非软件安装的目录下运行javac 命令 xff0c 将会报告找不到文件 xff0c 类似
  • nvm详解(mac环境nvm安装步骤及踩坑问题)

    1 定义 nvm xff0c 全称 Node Version Manager xff0c 也就是node版本控制 xff1b 它是一个命令行应用 xff0c 可以协助您快速地 更新 安装 使用 卸载 本机的全局 node js 版本 有时候
  • Flink CDC (Mysql为例)

    背景 业务中经常出现一些千万乃至亿级别的大表 xff0c 此时可能考虑分库分表 xff08 Sharding JDBC MyCat等方案 xff09 xff0c 也常同步数据进入ES中 xff1b 同步数据这一业务场景中 xff0c Fli
  • Centos7安装mysql(只需六步)

    Centos7 安装 mysql 的详细过程 xff0c 我会通过 环境准备 安装步骤 过程遇到的问题 来告诉你如何操作 1 环境准备 阿里云ECS云服务器CentOS 7 5 64位MySQL xff08 因 MySQL8 和 MySQL
  • mysql全文索引

    众所周知 xff0c 使用like 39 xxx 39 进行模糊查询时 xff0c 字段的索引就会失效 因此 xff0c 在数据量大的情况下 xff0c 通过此种方式查询的效率极低 这个时候 xff0c 就可通过全文索引 xff08 Ful