目标:通过阅读本文能知道像Google、百度这样的搜索引擎能在毫秒级在海量数据中查找、返回搜素关键词的原理。本文通过和传统数据库的对比引出倒排索引的概念和结构。为进一步了解搜索引擎打下一个基础。
引言:数据库查找和搜索引擎查找的区别
让我们从熟悉的数据库,例如MySQL开始。下面这张表是常见的Mysql表,存放着一些电视剧的信息。
title | description | starringName | tag |
诛仙青云志 | 草庙村少年张小凡(李易峰饰),在经历全村尽灭的惨案后,被青云门收归门…… | 李易峰,赵丽颖,杨紫,成毅, | 古装,武侠,玄幻,诛仙,青云志 ,TFboys,李易峰,赵丽颖 |
笑傲江湖第三季 | 《笑傲江湖》第三季爆... | 郭德纲,冯小刚,宋丹丹,百克力... | 笑傲江湖,笑傲江湖第三季,笑傲江湖2016,笑傲江湖东方卫视 |
疯狂动物城 | 故事发生在一个所有哺... | 金妮弗·古德温,杰森·贝特曼,伊德里斯·艾尔巴,珍妮·斯蕾特,,邦尼·亨特,,,J·K·西蒙斯,奥克塔维亚 ·斯宾瑟 , 艾伦 ·图代克 ,Shakira... | 疯狂动物城,金妮弗·古德温,杰森·贝特曼,,拜伦·霍华德,瑞奇·摩尔 |
太行山上央视版 | 全剧始终贯穿着军民团... | 唐国强,刘劲,郭连文,王伍福,姚居德,,,李晓枫... | 内地剧,战争,军事,年代,农村,太行山上 |
荒原第一季 | 数世纪后,人类重回封... | 吴彦祖,,莎拉·伯格,,马尔顿·索克斯,,,,史蒂芬·朗,... | 荒原,美版西游记,动作,冒险,吴彦祖,荒芜之地 |
睡在我上铺的兄弟 | 沪都大学330宿舍的... | 陈晓,秦岚,,,李现,王啸坤,余心恬 ,蓝盈莹,蒋雪鸣... | 睡在我上铺的兄弟,,张琦,陈晓, 秦岚 |
倒霉爱神 | 性感可人的曼哈顿女孩... | 琳赛·洛翰,克里斯·派恩,费松·拉夫,萨米拉·阿姆斯特朗,米西·派勒,布丽·特纳,克里斯·卡马克 ,Jonah,Falco... | 其它 |
这样DBA可以通过组合关键词找到观众想看的某一部电视剧了。
和SQL语句比起来,我们大概可以将涉及的字段区分成:
摘要字段:用来展现结果的字段。
倒排索引字段:用来过滤筛选条件的字段。
正排字段:用来对结果排序的字段。
问:好好地数据库字段,为什么要拆分成这些? 答:因为搜索引擎不是存储引擎。Mysql为了保证数据完整性存储尽可能多的字段属性,但这些字段大部分都跟搜索没有关系。为了提高速度,搜索引擎会舍弃大部分不用的字段。同时根据字段的用途不同有不同的处理。 举例而言:对于倒排索引字段,因为涉及用户体验问题要求快速找到数据集,所以一般会全部放入主内存中。 对于正排字段,涉及到将用户关注的内容放到前面,因此会尽可能放入内存。 对于展现字段,则各自有各自的处理。有可能会放在硬盘,甚至有可能会放到其它机器上。 |
数据库查找 .:
1,效率太低。 尽管《数据库原理》老师说可以对字段建索引,但千万级记录单条件查询仍需要3~4分钟甚至更久
2,不够智能,对查询要求高。 例如“猪仙青云志”就找不到了。“我的老丈人会工夫”也找不到热播电视剧《我的岳父会武术》
3,排序结果不够理想:很多时候要在上百条结果中翻页,或者做二次处理。
对比一下搜索引擎:
1, 高效率:千万级记录多条件查询可以在毫秒级返回结果
2, 可以有智能纠错,可以进行拼音查找、笔画查找、前缀查找等
3, 80%以上概率前三条即为用户想要的查询结果。
初识索引:索引的结构
‘z`
docId | title | description | starringName | tag |
123 | 诛仙青云志 | 草庙村少年张小凡(李易峰饰),在经历全村尽灭的惨案后,被青云门收归门…… | 李易峰,赵丽颖,杨紫,成毅, | 古装,武侠,玄幻,诛仙,青云志,TFboys,李易峰, 赵丽颖 |
30778 | 笑傲江湖第三季 | 《笑傲江湖》第三季爆... | 郭德纲,冯小刚,宋丹丹,百克力... | 笑傲江湖,笑傲江湖第三季,笑傲江湖2016,笑傲江湖东方卫视 |
索引结构说明:
l 从index开始,和数据库类似分字段,查找时需要有字段信息。
举例:在演员中查找“周星驰”和在导演中查找 “周星驰”,结果是不一样的。所以需要区分“导演”字段和“演员”字段。
l 每个字段下面有一系列的词。
l 每个词后面跟着一长串的列表,列表上有id,还有一些辅助信息。
举例查找一下-à title:青云志
1,从index根节点开始,找到title的那一条链。
2,在链中查找“青云志”。可以得到123, 789, 1024, 2048 四个文档。
如果查找 title:青云志 + starringName:李易峰呢?
那就将刚才的四个文档,和李易峰的123文档做交集,得到123 。也就是123是搜索结果
排序:
通过123ID可以到正排字段里找到它的辅助信息。和预期的可能不太一样的,它记录的内容是“token: 青云志 pos: 1 offset: 6 ”表示“青云志”在“诛仙”后面---》也就是第2个词,第6个位置(下标从0开始,以UTF8编码。一个汉字是三个字节。)
通过这些辅助信息可以对结果进行进一步的排序。
摘要展现字段:
可以通过123再到另一个地方获取诛仙青云志的展现信息。例如可以将它放到memcached中,通过123ID获取它。
索引创建过程:
索引创建过程中,有两个很重要的过程是“分词”和“归一化”。
分词能将“诛仙青云志”变成“诛仙”“青云志”
中文的归一化则是将很多同义词变成一个标准词,例如将老丈人变成岳父,将功夫变成武术。
通过这种转换,就可以将“我的老丈人会功夫”变成“我的岳父会武术。”