前言
代码语言:javascript复制2014年数据,facebook图片每天新增20PB;
youtue 一分钟上传400小时视频
谷歌 一分钟翻译1亿个单词
百度 一个词条对应数据量5000万-1亿
所以现在的互联网是一个信息大爆发的时代,有信息
就要有搜索,而且必须是又快,有全面,又准确的搜索,对于
检索,我将搜索分为传统检索与全文检索两个方面
传统检索
文件内存检索
windows操作系统文件检索,word oneNote excel等等 数据 量是不大的,将文件本身加载到内存中 功能相对不算丰富。
数据库检索
基于sql的like语句对数据库进行模糊查询,但是使用like语句 进行搜索的效率极低。
全文检索
全文数据库是全文检索系统的主要构成部分。所谓全文数据库是 将一个完整的信息源的全部内容转化为计算机可以识别、处理的 信息单元而形成的数据集合。全文数据库不仅存储了信息,而且 还有对全文数据进行词、字、段落等更深层次的编辑、加工的功 能,而且所有全文数据库无一不是海量信息数据库。(来自百度 百科)
全文检索如何实现高精度匹配
以百度搜索为例,当你百度一下你想要搜索的内容之后,页面返回 大量的信息,这些信息是从哪里来的,随便点进一个链接都会进入 不同的网站,所以可以确定,页面上展示的资源来自公网,那么这些 公网资源都是百度的爬虫即时搜索的吗,F5刷新一下百度为您找到相关结果约 xxxx个并没有动,所以这些信息是以另一种方式出现的。百度的分布式爬虫 对公网上的信息进行大量的抓取放到百度的分布式文件系统中,在经过整理 放到全文检索数据库中,当我们搜索时,百度的搜索引擎使用关键字对全文检索 数据库检索即可。
全文检索工具包lucene
公网上那么多的资源是怎么经过经过整理放到全文数据库中的呢, 原始时代就不过多赘述了,直接介绍一下lucene工具包,全文检索 技术中的工具包.可以极大的提升对全文检索技术开发的效率,由美国 的Doug Cutting(狗哥) hadoop创始人开发。
倒排索引算法
将大量的原数据经过整理放入全文数据库并进行检索,就需要我们 创建索引(搜索的关键字)和检索索引,创建索引时,就是用了一种 倒排索引的算法
代码语言:javascript复制分词(analyze):对数据进行词,字,段落加工形成的有效词项
文档(document):信息单元,一个最小的整体数据单元,例如,
网页海量数据每个文档都表示一个网页,海量数据是商品,每个
文档都表示一个商品对象数据;
域属性(field):有结构的文档对象,可以再由多个域属性(field)
组成,例如一个网页文档对象,标题title,内容content,出版社pub
lisher
DocId | Doc |
---|---|
1 | 谷歌地图之父跳槽 Facebook |
2 | 谷歌地图之父加盟 Facebook |
3 | 谷歌地图创始人拉斯离开谷歌加盟 Facebook |
4 | 谷歌地图之父跳槽 Facebook 与 Wave 项目取消有关 |
5 | 谷歌地图之父拉斯加盟社交网站 Facebook |
文档分词之后得到如下倒排索引
WordId | Word | DocIds |
---|---|---|
1 | 谷歌 | 1,2,3,4,5 |
2 | 地图 | 1,2,3,4,5 |
3 | 之父 | 1,2,4,5 |
4 | 跳槽 | 1,4 |
5 | 1,2,3,4,5 | |
6 | 加盟 | 2,3,5 |
7 | 创始人 | 3 |
8 | 拉斯 | 3,5 |
9 | 离开 | 3 |
10 | 与 | 4 |
可以理解为索引对象底层使用双层map作为容器key值记录分词之后的 词项,value的key值为记录文档ID的数组,value的value为记录文档 域属性的数组,其实索引文件里面记录的是矩阵。