Mysql全文索引解析

article/2025/11/4 21:17:33

parser与N-gram Parser分词器选择 及 ft_min_word_len与innodb_ft_min_token_size的区分及界定

学习《高性能mysql(第三版)》这本书时,学到了全文索引这一张节,但作者当时使用的版本是MySQL 5.5,届时只有MyISAM引擎支持latin(拉丁语)语法分词器的全文索引,而5.6版本后才在InnoDB引擎实验性地支持全文索引,如今以是8.0以上的版本了,InnoDB引擎下的全文索引,也比较成熟了。本文参照《高性能mysql(第三版)》的MyISAM引擎全文索引对比笔者当前使用的MySQL 5.7.16 的InnoDB引擎全文索引的使用差异做简要和说明,不足之处欢迎指正讨论。

一:分词器是啥

分词器我们可以理解为对我们查询的关键词进行拆分的一种规则设置。MySQL最初支持全文索引时,使用的是parser (拉丁语法分词器,通过空格来分词),但对于像中文这类不以空格拆分词语的语言来说无法适用,在MYSQL5.7.6后提供了n_gram parser(字符长度分词器) ,对中文的全文索引支持更友好,分词器的使用也很简单,创建索引时添加 WITH PARSER ngram即为使用n_gram parser(字符长度分词器),不加则默认使用传统parser(拉丁语法空格分词器)。区别参见图1.1

由此可知,在分词器的选择上,依据检索内容的分词方式来选择分词器类型。如果是latin语法的语言,就用parser,否则用n_gram parser;
如果在中文内容检索上使用parser,则按照latin分词语法检索,根本检索不到内容,除非真有用到空格的分词;如果在英文内容检索上使用n_gram parser,则会按照字符长度分词器,这两种方式都能够正常使用全文检索,但检索准确率和效率都会下降,所以在语法上来说这是两种错误用法,以下讲解和实例,也将跳过这两种错误用法。

图1.1
区别参见图片
parser不用过多解释,就是遇到空格就拆分,n_gram parser拆分与字面意思不太一样,请自行查找。

二:影响全文索引的系统参数 (未测试停用词)

前文提到,MySQL5.6版本后,MyISAM引擎和InnoDB引擎均支持全文索引,为了区分不同引擎和分词器的参数配置,产生了如下三组参数:(注意:修改系统参数后需要重启MySQL并使用OPTIMIZE TABLE命令重置表格才能使修改生效

1:n_gram parser(字符长度分词器)参数
ngram_token_size  -- n_gram parser(字符长度分词器)的分词长度   默认为2,

该参数不区分搜索引擎,也就是说,当使用 n_gram parser时,搜索关键词长度设置将无效,搜索关键词长度必须大于等于ngram_token_size,才能使用索引,否则不会被索引,返回空数据

----------结论验证:设置对应参数 ngram_token_size =3;ft_min_word_len =4;innodb_ft_min_token_size =4。搜索中文长度大于等于3时即可搜索到数据,说明使用n_gram parser时,搜索关键词长度确实无效。如有疑问请自行验证

2:parser(拉丁语法空格分词器)MyISAM引擎参数
ft_min_word_len    --搜索关键词最小长度  默认为4
ft_max_word_len   --搜索关键词最大长度  默认为 84

MyISAM引擎下使用parser(拉丁语法空格分词器)时,n_gram parser(字符长度分词器)相关参数及InnoDB引擎搜索关键词长度相关参数将无效,搜索时的关键词长度必须在ft_min_word_len 和 ft_max_word_len 之间(包含下边界,上边界未测试),才能使用索引,否则不会被索引,返回空数据

-------结论验证:设置对应参数 ngram_token_size =3;ft_min_word_len =4;innodb_ft_min_token_size =3.搜索英文长度大于等于4时才能搜索到数据,说明使用parser时,n_gram parser相关参数及InnoDB引擎相关参数确实无效。如有疑问请自行验证

3:parser(拉丁语法空格分词器)InnoDB引擎参数
innodb_ft_min_token_size    -- 搜索关键词最小长度 默认为3
innodb_ft_max_token_size   -- 搜索关键词最大长度 默认为 84

InnoDB引擎下使用parser(拉丁语法空格分词器)时,n_gram parser(字符长度分词器)相关参数及MyISAM引擎搜索关键词长度相关参数将无效,搜索时的关键词长度必须在innodb_ft_min_token_size 和 innodb_ft_max_token_size之间(包含下边界,上边界未测试),才能使用索引,否则不会被索引,返回空数据

-------结论验证:设置对应参数 ngram_token_size =3;ft_min_word_len =3;innodb_ft_min_token_size =4,搜索英文长度大于等于4时才参能搜索到数据,说明使用parser时,n_gram parser相关参数及MyISAM引擎相关参数确实无效。如有疑问请自行验证

本节标题已经说了,未测试停用词,这里只提一下相关参数,具体结论请自己验证
A:ft_stopword_file---- myisam引擎下,用于置定一组尾部文件来使用自定义的停用词,没有默认停用词表
B:innodb_ft_enable_stopword -- InnoDB引擎是否开启停用词,INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD为InnoDB默认停用词表

三:全文索引创建及查询分类(参考《高性能Mysql》)

1:创建全文索引(以n_gram parser为例)

创建索引create fulltext index title_fulltext on table_name(column1,column2,....) WITH PARSER ngram;
修改索引alter table table_name  add fulltext index title_fulltext(column1,column2,....) WITH PARSER NGRAM;

2:查询全文索引(与分词器类型无关)

  • 1:自然语言的全文索引(默认全文索引类型) – IN NATURAL LANGUAGE MODE (可以不加)
    自然语言的全文索引,会按照分词器将搜索关键词拆分成多个,查询其并集,按照相关度降序排列查询结果。例句如下:
select sclassID,Name_J,Name_JS,match(Name_J, Name_JS)  AGAINST('巴西国家' IN NATURAL LANGUAGE MODE) as relevance 	from zlk_sclass WHERE match(Name_J, Name_JS)  AGAINST('巴西国家');
  • 2:布尔全文索引
    布尔全文索引,会 将搜索关键词看作一个“短语”进行搜索,不会拆分词语。使用修饰符时,可以拆分成多个短语,进行相应修饰符功能的短语查询。例句如下:
select sclassID,Name_J,Name_JS,match(Name_J, Name_JS)  AGAINST('巴西国家' in boolean MODE) as relevance 	from zlk_sclass WHERE match(Name_J, Name_JS)  AGAINST('巴西国家' in boolean MODE) ;

注意事项如下:
A:无论使用哪种搜索引擎的哪种全文索引,相应分词器都会对搜索的关键词进行分词处理。
B:在MATCH()函数中指定的列必须和在全文索引中指定的列完全相同,否则就无法使用全文索引。这是因为,全文索引不会记录相关字/词是来自哪一列的。
C:自然语言的全文索引,是按照拆分词并集(or)进行查询,并按照相关度降序排序返回数据
D:布尔全文索引,默认按照“短语搜索”, 返回按照短语精确匹配(不是交集)的数据,只使用全文索引是无法判断是否精确匹配短语的,通常还需要查询原文确定记录中是否包含完整的短语。由于需要进行回表过滤,所以速度会比较慢。除非使用可以通过索引直接定位的修饰符,布尔全文索引最常用的通用修饰符见图3.1,需要注意的是,parser按照空格拆分关键词,拼接修饰符比较容易,但n_gram parser按字符长度拆分,处理修饰符是非常麻烦的,所以n_gram parse的全文索引不建议使用修饰符
E:我们指定 MATCH()两次:一次在 SELECT列表中,一次在 WHERE子句中。返回结果按相关性递减的顺序对行进行排序。这不会产生额外的开销,因为MySQL优化器注意到这两个 MATCH()调用是相同的,只调用一次全文搜索代码。但如果你将MATCH()函数放到ordery by子句中,MySQL将无法再使用索引排序,而只能使用文件排序,会降低查询效率。

图3.1
常用布尔全文索引修饰符

四:全文索引的限制(参考《高性能Mysql》)

全文索引可以理解成基于相似度的查询而不是精确的数值比较,本身有很多限制,简要介绍以下几点:
1:全文索引支持char、varchar、text类型字符内容的搜索。
2:MySQL的全文索引只有全部在内存中的时候,性能才非常好。如果内存无法装载全部索引,那么性能可能会非常慢(可以为全文索引设置单独的键缓存(key cache),保证不会被其他的索引缓存挤出内存)
3:相比其它的索引类型,当insert、update和delete操作进行时,全文索引的操作代价非常大。而且全文索引会有更多的碎片,可能需要做更多的optimize table操作。
4:一旦使用了全文索引,即便这时有更合适的索引可用,MySQL也会放弃性能比较,置之不理。
5:全文索引不存储索引列的实际值,也就不可能用作索引覆盖扫描。
6:除了相关性排序,全文索引不能用作其他的排序。如果查询需要做相关性以外的排序操作,都需要使用文件排序。

全文索引限制就罗列这么多,基于这些限制,在选择使用MySQL的全文索引时,需要谨慎考虑。
在次感谢您的阅读,不足之处欢迎指正讨论。


http://chatgpt.dhexx.cn/article/DZE2ciDa.shtml

相关文章

全文索引原理介绍

一、总论 根据http://lucene.apache.org/java/docs/index.html 定义: Lucene 是一个高效的,基于Java 的全文检索库。 所以在了解Lucene之前要费一番工夫了解一下全文检索。 那么什么叫做全文检索呢?这要从我们生活中的数据说起。 我们生活中的…

什么是全文索引,为什么要使用全文索引?

MySQL中什么是全文索引,为什么要使用全文索引? 1.全文索引在查找上方面其效率是普通模糊(like)查询的N倍2.MySQL 5.7.6 之后的版本innodb支持全文索引3.修改配置文件 my.ini 或者my.conf 增加以下配置innodb_ft_min_token_size …

MySQL全文索引怎么创建

mysql全文索引 很慢,速度不如like的百分之一 从explain开始说起吧,很显然第一个sql语句压根没用任何索引(key列内什么都没有)!第二个倒是用到索引,却是主键索引,并非你添加的fulltext索引! 接下来&#xff…

SQL Server 全文索引的应用

在公司项目中提出了一个需求: 搜索包含指定关键词的数据。得到这需求后,站在技术角度考虑第一时间就联想到使用SQL里面“like”查询语句。进一步分析需求后,发现“Like”查询满足不到实际的要求。 示例: ---------------------…

全文检索

本文我将为大家讲解全文检索技术——Lucene,现在这个技术用到的比较多,我觉得大家还是应该掌握一下,不说多精通,但是应该有所了解。在讲解之前,我们先来看一个案例,通过该案例引出全文检索技术——Lucene。…

mysql全文索引使用

一、前言 在以前的博客中小编介绍过mysql的执行流程,索引优化等。正好前一段时间项目有一个新的需求,就重新调研了一下mysql的全文索引,并对mysql的全文索引进行了压测,看看性能怎么样。以判断是否使用。——可想而知,…

MySQL使用全文索引(fulltext index) 及中文全文索引使用

全文索引介绍 ----------------------------------------------------------------------------------------------------------------------------- 1.创建全文索引(FullText index) 旧版的MySQL的全文索引只能用在MyISAM表格的char、varchar和text的字段上。 不过新版的My…

索引和全文检索

目录 索引 全文检索 学习类容:索引和全文检索 索引 索引:对数据库中一列或多列的值进行排序的一种结构 作用:合理的使用索引可以加速检索表中的数据。 分类: 按键列个数区分:单列索引,多列索引。 按…

MySQL使用全文索引(fulltext index)

1.创建全文索引(FullText index) 旧版的MySQL的全文索引只能用在MyISAM表格的char、varchar和text的字段上。 不过新版的MySQL5.6.24上InnoDB引擎也加入了全文索引,所以具体信息要随时关注官网, 1.1. 创建表的同时创建全文索引 CREATE TABLE article ( …

MySQL 全文索引

说到查询,日常中常用的baidu,cnbing ,google等之类的网站。关系型数据库中的全文索引应该也是从这些搜索引擎里摸索出来的。 全文索引介绍: 在数据库中常用的查询方式一般是 等价,范围方式。当然也有LIKE %的模糊查询&#xff0c…

MySQL索引系列:全文索引

什么是全文索引? 全文索引首先是 MySQL 的一种索引类型,也是搜索引擎的关键技术。 试想在1M大小的文件中搜索一个词,可能需要几秒,在100M的文件中可能需要几十秒,如果在更大的文件中搜索那么就需要更大的系统开销&am…

全文索引简介

全文索引技术就是将各种信息,文档中所有的文字序列都作为检索对象,找出包含检索词汇的信息或文档。 全文索引在数据库中一般是作为单独模块使用的,如MYSQL全文检索工具——Sphinx,一般全文索引模块需要配合数据库的存储方式进行处…

【MySQL】全文索引详解

文章目录 🍀全文索引概述 🍀全文索引的创建 🍀创建表时定义索引 🍀在已存在表上创建 🍀执行create语句 🍀执行ALTER TABLE语句 全文索引概述 全文索引主要对字符串类型建立基于分词的索引&#xff0c…

html怎么异步传数据,用jQuery实现异步通信(用json传值)方法步骤

jQuery是时下比较流行的一个js库,能够用简单的代码做出理想的效果,就像官网上说的那样“write less ,do more”。Jquery在一定程度上改写了以往对JavaScript的写法,本人就用jquery实现上篇中用ajax实现异步通信的效果,感受一下jqu…

用jQuery实现异步通信(用json传值)具体思路

jQuery是时下比较流行的一个js库,能够用简单的代码做出理想的效果,就像官网上说的那样“write less ,do more”。Jquery在一定程度上改写了以往对JavaScript的写法,本人就用jquery实现上篇中用ajax实现异步通信的效果,感受一下jqu…

jQuery的toggle

<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><!--引入jq框架--><script src"https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script></head><body>…

12.jQuery技术

一、jQuery知识点总览。 css&#xff08;&#xff09;方法&#xff1a;//通过css&#xff08;&#xff09;方法获取样式值let backgroundcolor $("#one").css("backgroundColor");alert(backgroundcolor);//通过css&#xff08;&#xff09;方法设置id为…

jQuery

##jQuery基础 1.概念&#xff1a;一个JavaScript框架。简化JS开发 *jQuery是一个快速、简洁的JavaScript框架&#xff0c;是继Prototype之后又一个优秀的JavaScript代码库&#xff08;框架&#xff09;于2006年1月由John Resig发布。 jQuery设计的宗旨是“write Less&#xf…

jQuery建立WebSocket连接

jQuery建立WebSocket连接&#xff0c;向服务端发送数据&#xff0c;实现WebSocket连接成功。 js代码如下&#xff1a; <script src"https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script><script type"text/javascript">…

WebGoat攻略 for Mac(1)

WebGoat攻略 for Mac&#xff08;1&#xff09; 一、环境配置1.配置Docker2.配置WebGoat3.连接WebGoat 二、题目攻略Introduction(介绍)a.WebGoatb.WebWolf General(通用)a.HTTP Basics(HTTP基础)b.HTTP Proxies配置OWASP ZAP c.Developer Tools(开发人员工具)d.CIA Triade.Cry…