首页 > 编程知识 正文

mysql全文索引是什么,全文索引的定义

时间:2023-05-03 18:31:17 阅读:37905 作者:3461

前言:技术是为了解决实际问题,脱离实际问题的空谈技术,就像不知道目标就学习一样,效率低下,最后被雾笼罩。 因此,本文通过抛出问题、明确目标、解决问题来阐述全文索引。

提出问题:

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

扩张问题--分词是什么?

2如何使用全文索引?

问题说明:

在谈论什么是全文索引之前,先看看这种场景:

现在经常看到的“车站内”检索等功能。

我现在想搜索《恶魔法则》。 网页显示有关“恶魔法则”的所有数据。

此搜索可以按标题、按内容、按作者综合搜索。 如何实现?

针对这个问题,刚学习sql语句两天的朋友可以选择select * from表名where标题like '%xxx%' or内容like '%xxx%' or作者like '%xxx% ';

是的。 这个句子可以实现这样的功能。 但是,效率非常低。 (什么? 为什么? 这个问题请自己考虑(谷歌)

那么,如何实现这一功能,提高效率呢?

一种方法是全文索引。

全文索引用于使“关键字搜索”功能获得更高的性能。

什么是全文索引呢?

我们将应用场景具体化:

现在有文章管理系统。 假设所有文章的内容都在数据库的一个字段中。 此字段最多可以包含3000字节。

文章的平均长度为2000字节。

表的结构简化如下。

文章id

文章标题

文章的内容

1

超级赛亚人

我是超级赛亚人。 我喜欢苹果

这个系统有几十万篇文章。 我想从这几十万篇文章中找出包含“我喜欢苹果”这句话的数据。

如上所述,like的效率非常低。 那么怎么替换?

如果能用搜索到的“关键字”创建索引文件,问题似乎会变得简单。 索引文件的逻辑结构如下。

关键词

文章id

我喜欢吃苹果

1

搜索的流沙时,首先搜索这个索引表,找到“我喜欢苹果”的关键词,获取对应的文章id。 这样可以大幅提高搜索性能。

你现在可能看起来知道了,让我们来看看更详细的例子。

有这样的数据表:

文章id

文章标题

文章的内容

1

超级赛亚人

我是超级赛亚人。 我喜欢苹果。 我既不是天朝人,也不是地球人

2

天朝大国

我是大天朝威武,我是大天朝13亿人,我是大天朝

3

我喜欢游泳

游泳有很多好方法

4

动画电影

我儿子喜欢看动画,特别是龙珠。 里面有赛亚人,赛亚人喜欢吃苹果。 他们不是地球人

5

运动

我喜欢运动,喜欢跑步,喜欢游泳,喜欢健身,喜欢xxoo

6

开枪

我是二战退役军人,这是我的回忆录,我最幸福的时光是在天朝吃苹果炮击

7。

8。

9。

然后,如果根据上述文章的内容创建了索引文件(此处忽略索引文件的数据结构,并以友好的方式显示)。

关键词

文章id

赛亚人

一四

苹果

1,4,6

天朝

1,2,6

地球

一四

游泳

三五天

龙珠剧场版

4

喜欢

1,4,5,6

那么当你想搜索“赛亚人”时,这个索引文件直接告诉你文章id为1和4的文章中有这个词。

此索引文件为“全文索引”。

(注)这里的索引文件只是简单易懂,就是这样的表情,实现起来有更复杂的数据结构。 为了从这么多关键词中快速找到想找的关键词。 这里无视数据结构的知识,从本质上说明全文索引是什么,是为了解决什么。 即使没有专业的背景知识,只要您学习过哪个数据库的sql语句,就可以理解。 )

到此为止,解决了什么是全文索引的问题。 ^^

通过观察上面的例子,如果有心的话,可能会考虑这样的事情:

超级赛亚人分为一个词还是“超级”、“赛亚人”两个词?

这就是“分词”。

现在有很多特别的分词系统! 这里很少介绍算法。 (这不仅需要计算机知识,还需要语言学专家的帮助哦。

我明白了全文索引和分词。

那么怎么用呢? 也就是说,如何使用全文索引和分词方式优化搜索?

大致方案如下

下:

为了简化概念,我们只从一个固定的套路开始讨论,这样就能省略数据源这些概念,而专心其工作方式啦:

需要工作的程序:索引程序,分词程序,数据库。

工作原理:

1、索引程序从数据库读取数据,比如上面例子中的数据表,索引程序通过sql语句:select 文章id,文章标题,文章内容 from 文章表.获得文章的相关数据

2、索引程序对需要索引的内容进行“分词”,而这里的分词就是调用分词程序啦!

3、索引程序对分好词的一个个词条加入索引文件。

在你写的代码里,原来到数据库----like %xxx%-----的语句

就变成了到索引文件里去查找,从而找到相应的数据(这点相信你已经理解啦!)

好了,原理部分介绍到这。

mysql现在一般使用的版本其实也支持全文索引啦,索引类型为fulltext,只不过他的功能还不够强大:

是对中文的支持不够好,无法智能分词

不过要是纯英文搜索用他还是可以的,只不过要注意有个停止词的概念哦!

那么用什么方法可以快速解决中文搜索的问题呢?

你一定听说过sphinx。(即使没听说过也没关系啦,之后我们会以这个为例子来详细讲解)

coreseek=sphinx+mmesg 这个程序就可以解决这个问题的啦。

sphinx就是上面说的索引程序啦。

mmseg就是分词程序啦。

国内有人修改了sphinx源码,内建和mmseg配合,整合到一起就是coreseek啦!

在下一篇中,

1我们会结合上面的原理,具体分析coreseek的使用参数。

2最后给出具体的分词索引方案。而不仅仅是“照着葫芦画瓢”。

留下思考的问题:

上面说的工作原理当中,sphinx读取数据库生成索引。那么如果sphinx生成完索引,mysql加入了新数据,这不是没有加入到索引当中吗?如何解决?

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。