前言:技术是为了解决实际问题,脱离实际问题的空谈技术,就像不知道目标就学习一样,效率低下,最后被雾笼罩。 因此,本文通过抛出问题、明确目标、解决问题来阐述全文索引。
提出问题:
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加入了新数据,这不是没有加入到索引当中吗?如何解决?