MySQL全文搜索索引

概述

使用全文索引的场景:

  1. like、json字段查询太慢
  2. ES、Solr、Lucene这种比较高级的搜索引擎学习成本和使用成本较高,而自己的业务量需求并没有达到这个级别

全文索引通过建立倒排索引来快速匹配文档,MySQL 5.6 + 版本引入此功能,全文索引将连续的字母、数字和下划线当做一个单词,分割单词一般用空格、逗号、句号。

简介:

  • MySQL中的全文索引是FultLeXT类型的索引
  • 全文索引只能用于InnoDB或MyISAM表,只能为CHAR、VARCHAR、TEXT列创建
  • MATCH (字段) AGAINST (关键词),必须和创建时的字段一起,例如MATCH (light,weight,baby)使用的字段名与全文索引muscle(light,weight,baby)定义的字段名一致。如果只对单个字段查询,需要分别创建全文索引
  • 全文索引是以词为基础的,innodb_ft_min_token_size和innodb_ft_max_token_size用来设置单词的最大和最小长度,不在这个长度区间的将忽略。
  • 在停用词stopwords中的将被忽略
  • MySQL 5.7.6,提供支持中文、日文和韩文(CJK)的内置全文ngram解析器,以及用于日文的可安装MeCab全文解析器插件
  • 当创建表时,可在CREATE TABLE语句中给出FULLTEXT索引定义,或稍后使用ALTER TABLE或CREATE INDEX添加该定义
  • 对于大型数据集,将数据加载到没有FULLTEXT索引的表中然后创建索引,要比将数据加载到具有现有FULLTEXT索引的表中快得多

类型

全文索引的三种类型

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

创建

创建全文索引的三种方式

  1. 建表时指定FULLTEXT(column1, column2, ...)
  2. 修改表: ALTER TABLE table_name ADD FULLTEXT INDEX index_name (column1, column2, ...);
  3. 对表新增index:CREATE FULLTEXT INDEX index_name ON table_name (column1, column2, ...);

配置
编辑my.ini配置文件,增加:

# MySQL全文索引查询关键词最小长度限制
[mysqld]
ft_min_word_len = 1

存储方式

  • full inverted index:会占用更多的空间,因为它不仅会存储单词和单词所在文档的ID,还会存储单词所在文档的ID中具体的位置。
  • inverted file index:只存储单词及对应的单词所在文档。节省空间,但是查找时,只能根据关键字得到相应文档,再进行查找

stopword

InnoDB会把单词拆分进行存储,查找时,根据单词匹配(默认是英文符号)。有些词是不能索引查询的,就称之为停用词,stopword。查询系统的默认停止词:

SELECT * FROM information_schema.INNODB_FT_DEFAULT_STOPWORD;

添加自定义的停用词:

相关表

information_schema.INNODB_FT_INDEX_TABLE

information_schema.INNODB_FT_INDEX_CACHE
information_schema.INNODB_FT_DEFAULT_STOPWORD

相关性

计算原理:

  • word(查询关键字)是否在文档中出现
  • word在文档中出现的次数
  • word在索引列中的数量
  • 多少个文档包含该word

排序:等级由MySQL根据行中词的数目、唯一词的数目、整个索引中词的总数以及包含该词的行的数目计算出来

实战

建表语句:

CREATE TABLE full_text_test (title VARCHAR(80),FULLTEXT (title)
);

插入准备好的数据:

INSERT INTO full_text_test
VALUES
('It''s a beautiful night we''re looking for something dumb to do'),
('Hey baby I think I wanna marry you'),
('Is it the look in your eyes or is it this dancing juice'),
('Who cares baby I think I wanna marry you'),
('Well I know this little chapel on the boulevard'),
('We can go ooooo'),
('No one will know ooo'),
('Oh come on girl'),
('Who cares if we''re trashed'),
('Got a pocket full of cash we can blow whoa whoa'),
('Shots of patrol whoa whoa'),
('And it''s on girl'),
('Don''t say no no no no no'),
('Just say yeah yeah yeah yeah yeah'),
('If you''re ready like I''m ready'),
('I''ll go get the ring'),
('Let the choir bell sing like ooh ooh ooh'),
('So what you wanna do ooh ooh'),
('Let''s just run girl'),
('If we wake up and you want to break up'),
('That''s cool ooh ooh'),
('No I won''t blame you ooh ooh'),
('It was fun girl'),
('And we''ll go go go go go'),
('Just say I do ooh ooh ooh'),
('Tell me right now baby'),
('Tell me right now baby baby');

自然语言

Natural Language,也是默认的检索模式,表示查询带有指定word的文档,下面2种方式是等价:

SELECT title, MATCH(title) AGAINST('baby') AS relevance FROM full_text_test order by relevance desc;
SELECT title, MATCH(title) AGAINST('baby' in NATURAL LANGUAGE MODE) AS relevance FROM full_text_test order by relevance desc;

Match()指定被搜索的列,Against()指定要使用的搜索表达式,传递给Match()的值必须与FULLTEXT()定义中的相同。如果指定多个列,则必须列出它们(而且次序正确), 除非使用BINARY方式,否则全文本搜索不区分大小写。

Boolean

表示字符串前后的字符有特殊含义。+表示存在,-符号表示不存在。如,查找含有marry,不含有cares的记录:

SELECT title FROM full_text_test WHERE MATCH(title) AGAINST('+marry' in BOOLEAN MODE);-- 返回2条记录
SELECT title FROM full_text_test WHERE MATCH(title) AGAINST('+marry -cares' in BOOLEAN MODE);-- 返回1条记录

符号解释:

  • +:必须出现
  • -:必须不出现,用来排除其他操作符的结果,如果只指定这个,将什么都不返回
  • 无符号:默认情况,代表或,自动分词搜索。和没有指定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*
包含apple单词的行,applesauce等都会被匹配到
"some words"
完全匹配some words的行
+apple +(>turnover <strudel)

  1. 包含apple和turnover,或包含apple和strudel
  2. 包含apple和turnover权重高于包含apple和strudel的记录

查询扩展

添加WITH QUERY EXPANSIONIN NATURAL LANGUAGE MODE WITH QUERY EXPANSION启用,它会执行两次检索,第一次使用给定短语检索,第二次是结合第一次相关性比较高的行进行检索。

如下查询语句:

SELECT * FROM full_text_test WHERE MATCH (title) AGAINST ('fruit' WITH QUERY EXPANSION);

执行时,会先执行一次基本查询,即自然语言查询:

SELECT * FROM full_text_test WHERE MATCH (title) AGAINST ('fruit' IN NATURAL LANGUAGE MODE);

然后第二次查询会将第一次查询的结果作为输入短语,最后根据相关性降序获取查询结果。

也就是说,某条字符串如果不含有fruit关键词短语,如果含有apple关键词,则也可能出现在查询扩展的结果集里。

参考

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

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

相关文章

深入NLTK:Python自然语言处理库高级教程

在前面的初级和中级教程中&#xff0c;我们了解了NLTK库中的基本和进阶功能&#xff0c;如词干提取、词形还原、n-gram模型和词云的绘制等。在本篇高级教程中&#xff0c;我们将深入探索NLTK的更多高级功能&#xff0c;包括句法解析、命名实体识别、情感分析以及文本分类。 一…

MySQL索引1——索引基本概念与索引结构(B树、R树、Hash等)

目录 索引(INDEX)基本概念 索引结构分类 BTree树索引结构 Hash索引结构 Full-Text索引 R-Tree索引 索引(INDEX)基本概念 什么是索引 索引是帮助MySQL高效获取数据的有序数据结构 为数据库表中的某些列创建索引&#xff0c;就是对数据库表中某些列的值通过不同的数据结…

关于golang锁的一点东西(2)

上篇中&#xff0c;介绍了关于golang互斥锁的内容&#xff0c;了解了golang互斥锁基于runtime信号量的同步机制&#xff0c;以及runtime信号量的实现。本篇书接上回&#xff0c;继续聊一点读写锁的东西。同样的&#xff0c;不会纠结于某些细节&#xff0c;而是关注于一些我感兴…

24届华东理工大学近5年自动化考研院校分析

今天给大家带来的是华东理工大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、华东理工大学 学校简介 华东理工大学原名华东化工学院&#xff0c;1956年被定为全国首批招收研究生的学校之一&#xff0c;1960年起被中共中央确定为教育部直属的全国重点大学&#…

Vue读取本地静态.md并侧边栏导航跳转、展示.md文件

vue markdown 侧边栏导航跳转 类似锚点跳转 - 灰信网&#xff08;软件开发博客聚合&#xff09; Vue使用mavon-editor插件解析markdown编辑预览_onpine的博客-CSDN博客 vue组件直接读取.md文档展示_vue项目中读取readme文件_小蒜瓣的博客-CSDN博客vue中使用mavonEditor(markd…

uni-app uView自定义底部导航栏

因项目需要自定义底部导航栏&#xff0c;我把它写在了组件里&#xff0c;基于uView2框架写的&#xff08;vue2&#xff09;&#xff1b; 一、代码 在components下创建tabbar.vue文件&#xff0c;代码如下&#xff1a; <template><view><u-tabbar :value"c…

2023华数杯数学建模A题思路分析 - 隔热材料的结构优化控制研究

# 1 赛题 A 题 隔热材料的结构优化控制研究 新型隔热材料 A 具有优良的隔热特性&#xff0c;在航天、军工、石化、建筑、交通等 高科技领域中有着广泛的应用。 目前&#xff0c;由单根隔热材料 A 纤维编织成的织物&#xff0c;其热导率可以直接测出&#xff1b;但是 单根隔热…

结合实际谈谈:CPU密集型和IO密集型任务在并发编程中的应用

大家好&#xff0c;我是三叔&#xff0c;很高兴这期又和大家见面了&#xff0c;一个奋斗在互联网的打工人。 在并发编程中&#xff0c;了解任务的性质对于选择合适的并发策略和资源分配至关重要。本篇博客将深入探讨 CPU 密集型和 IO 密集型任务的概念&#xff0c;分析它们在并…

小程序开发趋势:探索人工智能在小程序中的应用

第一章&#xff1a;引言 小程序开发近年来取得了快速的发展&#xff0c;成为了移动应用开发的重要一环。随着人工智能技术的飞速发展&#xff0c;越来越多的企业开始探索如何将人工智能应用于小程序开发中&#xff0c;为用户提供更智能、便捷的服务。本文将带您一起探索人工智能…

Netty面试题

1.BIO、NIO 和 AIO 的区别&#xff1f; BIO&#xff1a;一个连接一个线程&#xff0c;客户端有连接请求时服务器端就需要启动一个线程进行处理。线 程开销大。 伪异步 IO&#xff1a;将请求连接放入线程池&#xff0c;一对多&#xff0c;但线程还是很宝贵的资源。 NIO&#x…

tomcat通过systemctl启动时报错Cannot find /usr/local/tomcat/bin/setclasspath.sh

解决方法&#xff0c;检查自己的CATALINA_HOME和TOMCAT_HOME配置情况 我的配置在/etc/profile下的如下 使其立即生效 后将/usr/lib/systemd/system/tomcat.service中的CATALINA_HOME和TOMCAT_HOME和/etc/profile改一致 重新加载再重启解决 解决方法&#xff0c;检查自己的C…

总结七大排序!

排序总览 外部排序&#xff1a;依赖硬盘&#xff08;外部存储器&#xff09;进行的排序。对于数据集合的要求特别高&#xff0c;只能在特定场合下使用&#xff08;比如一个省的高考成绩排序&#xff09;。包括桶排序&#xff0c;基数排序&#xff0c;计数排序&#xff0c;都是o…

Android Q以上后台启动Activity初步尝试

在Android Q以后 google不允许在后台service 广播等等启动Activity 具体请看google文档从后台启动 Activity 的限制 | Android 开发者 | Android Developers 文档里有详细的说明,在哪种情况下可以后台启动Activity。 大体分为以下几种情况: 1、应用具有可见窗口,例如前…

没有jodatime,rust里怎么比较两个日期(时间)的大小呢?

关注我&#xff0c;学习Rust不迷路&#xff01;&#xff01; 在 Rust 中&#xff0c;比较两个日期的大小有多种方法。以下是列举的四种常见方法&#xff1a; 1. 使用 PartialOrd trait&#xff1a; use chrono::prelude::*;fn main() {let date1 NaiveDate::from_ymd(2022,…

FPGA----UltraScale+系列的PS侧与PL侧通过AXI-HP交互(全网唯一最详)附带AXI4协议校验IP使用方法

1、之前写过一篇关于ZYNQ系列通用的PS侧与PL侧通过AXI-HP通道的文档&#xff0c;下面是链接。 FPGA----ZCU106基于axi-hp通道的pl与ps数据交互&#xff08;全网唯一最详&#xff09;_zcu106调试_发光的沙子的博客-CSDN博客大家好&#xff0c;今天给大家带来的内容是&#xff0…

【2023】华为OD机试真题Java CC++ Python JS Go-题目0258-数组连续和

题目0258-数组连续和 题目描述 给定一个含有 N N N 个正整数的数组, 求出有多少个连续区间(包括单个正整数), 它们的和大于等于 x x x 。 输入描述 第一行两个整数

【ElasticSearch】ElasticSearch 内存设置原则

由于ES构建基于lucene,而lucene设计强大之处在于lucene能够很好的利用操作系统内存来缓存索引数据&#xff0c;以提供快速的查询性能。lucene的索引文件segements是存储在单文件中的&#xff0c;并且不可变&#xff0c;对于OS来说&#xff0c;能够很友好地将索引文件保持在cach…

MySQL的关键指标及采集方法

MySQL 是个服务&#xff0c;所以我们可以借用 Google 四个黄金指标的思路来解决问题。 1、延迟 应用程序会向 MySQL 发起 SELECT、UPDATE 等操作&#xff0c;处理这些请求花费了多久&#xff0c;是非常关键的&#xff0c;甚至我们还想知道具体是哪个 SQL 最慢&#xff0c;这样…

机器学习——SVM核函数

核函数这块&#xff0c;原理理解起来&#xff0c;相对比较简单 但还是会有一些不太理解的地方 对于非线性可分的数据而言&#xff0c;在当前维度&#xff0c;直接使用SVM有分不出的情况 那么就可以从当前维度&#xff0c;直接升到更高维度&#xff0c;进行计算。 例如原本数…

MAVLINK—C语言demoWindows版本

mavlink/examples/c/udp_example.c 在学习mavlink时准备学习一下官网的C语言example&#xff0c;发现是unix系统的&#xff0c;打算在Windows系统下尝试&#xff0c;于是将示例修改了一下。 #include <stdio.h> #include <errno.h> #include <string.h> #in…