广告
返回顶部
首页 > 资讯 > 数据库 >InnoDB全文索引是什么
  • 131
分享到

InnoDB全文索引是什么

2024-04-02 19:04:59 131人浏览 泡泡鱼
摘要

这篇文章主要介绍“InnoDB全文索引是什么”,在日常操作中,相信很多人在InnoDB全文索引是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”InnoDB全文索引是什么”

这篇文章主要介绍“InnoDB全文索引是什么”,在日常操作中,相信很多人在InnoDB全文索引是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”InnoDB全文索引是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

InnoDB全文索引:N-gram Parser

March 26, 2015MysqlShaohua Wang

InnoDB默认的全文索引parser非常合适于Latin,因为Latin是通过空格来分词的。但对于像中文,日文和韩文来说,没有这样的分隔符。一个词可以由多个字来组成,所以我们需要用不同的方式来处理。在mysql 5.7.6中我们能使用一个新的全文索引插件来处理它们:n-gram parser.

什么是N-gram?

在全文索引中,n-gram就是一段文字里面连续的n个字的序列。例如,用n-gram来对”信息系统”来进行分词,得到的结果如下:

N-gram 例子

1
2
3
4
N=1 : '信', '息', '系', '统';
N=2 : '信息', '息系', '系统';
N=3 : '信息系', '息系统';
N=4 : '信息系统';

 如何在InnoDB中使用N-gram Parser?

N-gram parser是默认加载到Mysql中并可以直接使用的。我们只需要在DDL中创建全文索引时使用WITH PARSER ngram。比如,下面的SQL语句在MySQL 5.7.6及更高版本上可以运行。

N-gram DDL示例

1
2
3
4
5
6
7
8
9
mysql > CREATE TABLE articles
(
FTS_DOC_ID BIGINT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(100),
FULLTEXT INDEX ngram_idx(title) WITH PARSER ngram
) Engine=InnoDB CHARACTER SET utf8mb4;
Query OK, 0 rows affected (0.06 sec)
mysql> # ALTER TABLE articles ADD FULLTEXT INDEX ngram_idx(title) WITH PARSER ngram;
mysql> # CREATE FULLTEXT INDEX ngram_idx ON articles(title) WITH PARSER ngram;

我们引入了一个新的全局变量叫ngram_token_size。由它来决定n-gram中n的大小,也就是词的大小。它的默认值是2,这个时候,我们使用的是bigram。它的合法的取值范围是1到10。现在,我们很自然会想到一个问题:实际应用中应该如何设置ngram_token_size值的大小呢?当然,我们推荐使用2。但是你也可以通过如下这个简单的规则来可以选择任何合法的值:设置到你希望能查询到的最小的词的大小。如果你想查询到单个字,那么我们需要设置为1。 ngram_token_size的值设置的越小,全文索引占用的空间也越小。一般来说,查询正好等于ngram_token_size的词,速度会更快,但是查询比它更长的词或短语,则会变慢。

N-gram分词处理

N-gram parser和系统默认的全文索引parser有如下不同点:

  1. 词大小检查:因为有了ngram_token_size,所以innodb_ft_min_token_size和innodb_ft_max_token_size将不适用于n-gram。

  2. 无用词(stopWord)处理:通常,对于一个新的词,我们会查找stopwords表,看是否有匹配的词。如果有,这个词就不会加入到全文索引中。但是在n-gram中,我们会查找stopwords表,看是否包含里面的词。这样处理的原因是,在中日韩的文本中,有很多没有意义的字符,词语和标点符号。比如,如果我们把‘的’加入到stopwords表中,那么对于句子‘信息的系统’,在默认情况下我们分词结果为‘信息’,‘系统’。其中‘息的’和‘的系’被过滤掉了。

我们可以通过查询INFORMATioN_SCHEMA.INNODB_FT_INDEX_CACHE和INFORMATION_SCHEMA.INNODB_FT_TABLE_TABLE来查询哪些词在全文索引里面。这是一个非常有用的调试工具。如果我们发现一个包含某个词的文档,没有如我们所期望的那样出现在查询结果中,那么这个词可能是因为某些原因不在全文索引里面。比如,它含有stopword,或者它的大小小于ngram_token_size等等。这个时候我们就可以通过查询这两个表来确认。下面是一个简单的例子:

简单的调试示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> INSERT INTO articles (title) VALUES ('信息系统');
Query OK, 1 row affected (0.01 sec)

mysql> SET GLOBAL innodb_ft_aux_table="test/articles";
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE;
+--------+--------------+-------------+-----------+--------+----------+
| WORD | FIRST_DOC_ID | LAST_DOC_ID | DOC_COUNT | DOC_ID | POSITION |
+--------+--------------+-------------+-----------+--------+----------+
| 信息 | 1 | 1 | 1 | 1 | 0 |
| 息系 | 1 | 1 | 1 | 1 | 3 |
| 系统 | 1 | 1 | 1 | 1 | 6 |
+--------+--------------+-------------+-----------+--------+----------+
3 rows in set (0.00 sec)

 N-gram查询处理

文本查询(Text Searches)

  • 在自然语言模式(NATURAL LANGUAGE MODE)下,文本的查询被转换为n-gram分词查询的并集。例如,(‘信息系统’)转换为(‘信息 息系 系统’)。下面一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> INSERT INTO articles (title) VALUES ('信息系统'), ('信息 系统'), ('信息的系统'), ('信息'), ('系统'), ('息系');
Query OK, 6 rows affected (0.01 sec)
Records: 6 Duplicates: 0 Warnings: 0

mysql> SELECT * FROM articles WHERE MATCH (title) AGaiNST ('信息系统' IN NATURAL LANGUAGE MODE);
+------------+-----------------+
| FTS_DOC_ID | title |
+------------+-----------------+
| 1 | 信息系统 |
| 6 | 息系 |
| 2 | 信息 系统 |
| 3 | 信息的系统 |
| 4 | 信息 |
| 5 | 系统 |
+------------+-----------------+
6 rows in set (0.01 sec)
  • 在布尔模式(BOOLEAN MODE),文本查询被转化为n-gram分词的短语查询。例如,(‘信息系统’)转换为(“‘信息 息系 系统'”)。

1
2
3
4
5
6
7
mysql> SELECT * FROM articles WHERE MATCH(title) AGAINST('信息系统' IN BOOLEAN MODE);
+------------+--------------+
| FTS_DOC_ID | title |
+------------+--------------+
| 1 | 信息系统 |
+------------+--------------+
1 row in set (0.00 sec)

通配符查询(Wildcard Searches)

  • 如果前缀的长度比ngram_token_size小,那么查询结果将返回在全文索引中所有以这个词作为前缀的n-gram的词。

1
2
3
4
5
6
7
8
9
10
mysql> SELECT * FROM articles WHERE MATCH (title) AGAINST ('信*' IN BOOLEAN MODE);
+------------+-----------------+
| FTS_DOC_ID | title |
+------------+-----------------+
| 1 | 信息系统 |
| 2 | 信息 系统 |
| 3 | 信息的系统 |
| 4 | 信息 |
+------------+-----------------+
4 rows in set (0.00 sec)
  • 如果前缀的长度大于等于ngam_token_size,那么这个查询则转换为一个短语(phrase search),通配符则被忽略。例如,(‘信息*’)转换为(‘”信息”‘),(‘信息系*’)转换为(‘”信息 息系”‘)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql> SELECT * FROM articles WHERE MATCH (title) AGAINST ('信息*' IN BOOLEAN MODE);
+------------+-----------------+
| FTS_DOC_ID | title |
+------------+-----------------+
| 1 | 信息系统 |
| 2 | 信息 系统 |
| 3 | 信息的系统 |
| 4 | 信息 |
+------------+-----------------+
4 rows in set (0.00 sec)

mysql> SELECT * FROM articles WHERE MATCH (title) AGAINST ('信息系*' IN BOOLEAN MODE);
+------------+--------------+
| FTS_DOC_ID | title |
+------------+--------------+
| 1 | 信息系统 |
+------------+--------------+
1 row in set (0.00 sec)

短语查询(Phrase Searches)

  • 短语查询则被转换为n-gram分词的短语查询。比如,(‘信息系统’)转换为(‘”信息 息系 系统”‘)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT * FROM articles WHERE MATCH (title) AGAINST('"信息系统"' IN BOOLEAN MODE);
+------------+--------------+
| FTS_DOC_ID | title |
+------------+--------------+
| 1 | 信息系统 |
+------------+--------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM articles WHERE MATCH (title) AGAINST ('"信息 系统"' IN BOOLEAN MODE);
+------------+---------------+
| FTS_DOC_ID | title |
+------------+---------------+
| 2 | 信息 系统 |
+------------+---------------+
1 row in set (0.01 sec)

到此,关于“InnoDB全文索引是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

您可能感兴趣的文档:

--结束END--

本文标题: InnoDB全文索引是什么

本文链接: https://www.lsjlt.com/news/66773.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • InnoDB全文索引是什么
    这篇文章主要介绍“InnoDB全文索引是什么”,在日常操作中,相信很多人在InnoDB全文索引是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”InnoDB全文索引是什么”...
    99+
    2022-10-19
  • MySQL innodb 全文索引使用
    1、mysql 5.7 全文索引以下几个参数(配置文件/etc/my.cnf)#控制innodb全文检索分词的最小长度,如果设置为2那么一个汉字和一个字母将不能搜到ngram_token_size=1#存储...
    99+
    2022-10-18
  • lucene全文索引是什么
    本篇内容主要讲解“lucene全文索引是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“lucene全文索引是什么”吧!一、Lucene介绍及应用Apache Lucene是当下最为流行的开源...
    99+
    2023-06-02
  • mysql中innodb索引原理是什么
    这篇文章主要介绍了mysql中innodb索引原理是什么,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。聚集索引(clustered index)...
    99+
    2022-10-18
  • mysql中什么是全文索引
    这篇文章将为大家详细讲解有关mysql中什么是全文索引,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、说明MyISAM存储引擎支持全文索引,用于查找文本中的关键词,而不是直接比较是否相等。...
    99+
    2023-06-15
  • innodb联合索引的原理是什么
    InnoDB联合索引的原理是将多个列的值组合起来作为索引的键,并按照指定的顺序进行排序和存储。它使用B+树数据结构来实现索引存储和查...
    99+
    2023-10-27
    innodb
  • MySQL中 Innodb索引的原理是什么
    本篇文章给大家分享的是有关MySQL中 Innodb索引的原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。什么是索引?索引(index...
    99+
    2022-10-18
  • InnoDB 层全文索引字典表 | 全方位认识 information_schema
    在上一篇中,我们详细介绍了 InnoDB 层的锁、事务、及其相关的统计信息字典表 ,本期我们将为大家带来系列第七篇《InnoDB 层全文索引字典表 | 全方位认识 information_schem...
    99+
    2022-10-18
  • mysql全文索引的概念是什么
    这篇“mysql全文索引的概念是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mysq...
    99+
    2023-05-25
    mysql
  • MongoDB之索引(全文索引)
    在一些信息管理平台上经常需要进行信息模糊查询,最早的时候是在某个字段上实现的模糊查询,但是这个时候返回的信息并不会很准确,因为只能够查A字段或者是B字段,而在MongoDB里面实现了非常简单的全文检索。 ...
    99+
    2022-10-18
  • SQL Server 全文搜索/全文索引
    全文引擎使用全文索引中的信息来编译可快速搜索表中的特定词或词组的全文查询。全文索引将有关重要的词及其位置的信息存储在数据库表的一列或多列中。全文索引是一种特殊类型的基于标记的功能性索引,它是由 SQL Server 全文引...
    99+
    2014-12-30
    SQL Server 全文搜索/全文索引
  • mysql索引文件是什么
    MySQL索引文件是用于快速查找和检索数据库中数据的数据结构,它是在表中的一个或多个列上创建的,以提高查询性能和数据检索速度,包含了索引键值和指向实际数据位置的指针,索引文件通常存储在磁盘上,与表数据文件分开存储。本教程操作系统:Windo...
    99+
    2023-08-02
  • Mysql全文索引
    1.背景简介 项目开发过程有时候会遇到全文检索的需求,但是数据量有时候比较小,不属于高并发高吞吐场景,这种场景搭建ES服务有点浪费资源,也把工程设计复杂了,所以需要采用更简单更廉价的方案。一般业务系统都会用到Mysql或者PostgreSQ...
    99+
    2023-08-18
    mysql 数据库 全文检索
  • mysql 全文索引
    停止词(stopword) ...
    99+
    2022-10-18
  • 什么是InnoDB存储引擎
    这篇文章主要介绍“什么是InnoDB存储引擎”,在日常操作中,相信很多人在什么是InnoDB存储引擎问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是InnoDB存储引擎”...
    99+
    2022-10-18
  • MySQL (InnoDB)在什么情况下无法使用索引
    目录1. 前置知识1.1 InnoDB 索引结构2. 什么情况下不能使用索引2.1 索引列在表达式或函数中【必】2.2 联合索引中,非最左前缀【必】2.3 联合索引中,最左前缀,但是中间有范围查询,那么范围查询后面的列都用不到索引【必】2....
    99+
    2016-04-15
    MySQL (InnoDB)在什么情况下无法使用索引 数据库入门 数据库基础教程
  • MySQL中InnoDB存储引擎是什么
    这篇文章给大家分享的是有关MySQL中InnoDB存储引擎是什么的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。在MySQL中InnoDB属于存储引擎层,并以插件的形式集成在数据库...
    99+
    2022-10-18
  • 索引是什么
    索引是一种按照一定规则对书籍、文献、文件等进行分类整理的工具。它的作用是帮助读者快速找到所需信息,节省阅读时间并提高阅读效率。不同类型的索引包括书目索引、关键词索引和主题索引等,能够提供不同的搜索途径,使读者能够根据自身需求快速定位到所需的...
    99+
    2023-08-04
  • MySQL---单列索引(包括普通索引、唯一索引、主键索引)、组合索引、全文索引。
    1. 索引 索引是通过某种算法,构建出一个数据模型,用于快速找出在某个列中有一特定值的行,不使用索 引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的 时间就越多,如果表中查询的列有一个索引,MySQL...
    99+
    2023-09-21
    数据库 mysql sql
  • Lucene fnm索引文件格式是什么
    这篇文章主要介绍“Lucene fnm索引文件格式是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Lucene fnm索引文件格式是什么”文章能帮助大家解决问题。简介后缀为f...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作