搜索引擎-架构概述(1)

架构

对软件系统来讲,从一个层面对系统的各个组件进行抽象.描述它们各自的功能、提供的接口以及它们之间的关系.

需求

架构为应付需求而产生,对搜索引擎来讲,它主要的需求来自两个方面:

效果(effectiveness):搜索的结果质量如何.
效率(effeciency):返回结果的相应时间是不是够低,搜索服务的吞吐量是不是够高.

索引处理系统(Indexing Process)

从这样的需求出发,我们就不能顺着文档的每一个字或词来比较用户输入的查询关键字.
所以我们需要一种能提供高效的数据结构、算法和检索策略的东西,这就是索引处理系统.
这个系统大概像下面这样:
这里写图片描述
这幅图能告诉我们什么?


采集文本组件(Text acquisition)

这个组件用于发现、识别、和存储文档.为索引做准备.通常它必须具备以下几个功能:

1.爬虫 (Crawler)

一般搜索引擎中就是网络爬虫(web cralwer)了.
它负责通过超链接来源源不断地从互联网、文件服务器等信息源中爬取网页、新闻、email、话题等文档.并将这些信息加工后丢进文档数据库中.如上图所示.
爬虫要解决一个更新的问题,因为一个搜索引擎必须拥有对更新或时新的内容进行处理的能力.

2.信息源 (Feeds)

对于实时文档流,检测信息如果就能获得更新的消息那再好不过了.RSS就是一种信息源.它用XML来描述.

3.转换 (Conversion)

这里的转换的功能一些也可以丢给文本转换组件.
来自爬虫抓取或者信息源的文档集合,格式很多,比如html、xml、PDF、doc、ppt等,而我们更喜欢纯文本的格式以高效和有效处理.

4.文档数据库 (Document Data Store)

必须有一个能存储文档及其元数据的地方,否则索引再快,也没东西返回,虽然互联网上的文档可以时时抓取,但离线分析显然更快,这就需要一个文档数据库.
选择关系型数据库(RDBMS)还是NoSQL数据库,根据实际情况来.


文本转换组件(Text Transformation)

这个组件负责将文档转换成为索引项(index term)特征(feature).
所有词项组成的集合叫作*索引字表index vocabulary)*.

1.解析器 (parser)

这个组件负责分词或叫词素切分(tokenizing)和识别词素(tokens).
词素识别可以将文档中的结构化部分切分出来,比如链接、主题、图标等。
不仅是对文档,对查询也要做分词,这样查询和文档才能比较。

2.停用词处理 (stopping)

一些停用词,比如英文中的to、of、the,中文中的的、吗等,对文档内容贡献不大,但却大量出现。
去除停用词可以在相当的幅度上增加检索效率,但也可能带来错误的搜索结果。
停用词库的大小要斟酌,小了意义不大,大了容易过滤掉很多东西,导致查询的本意被改变或者变得不可读。比如一骗文章叫“论的字在生活中的作用”,去除了“的”之后,就会很囧。

3.词干提取 (parser)

同义词或英文中的派生词处理.

链接是网页内容的重要组成部分.大名鼎鼎的Google就是靠PageRank这种链接分析技术起家.
链接反映了网页内容之间的关系,这类似于图的边.
通过链接抽取和分析算法,可以得出一个页面的重要程度和被关注程度,这一信息可以用来为页面打分或赋予权重.
同时,链接文本可以更有语义地表达链接所指向的内容,这对于页面或文章分类也是有用的信息.
所以

链接分析对搜索结果意义重大.

5.信息提取 (information extraction)

考虑这样一句话,”搜索引擎是一个技术成熟但实现成本高的应用“,其中“搜索引擎”显然比“搜”、“索”、“引擎”更统一、更整体,对这样的名词短语进行抽取,对返回正确的搜索结果很有意义。
它还处理句法、语法、命名实体识别(named entity ),比如分类公司、人名、地名等。

6.分类器 (classifier)

这个组件用于识别文档中与类别相关(class related)的部分.
比如文档的标签或话题分类,可以是体育、政治或者计算机,甚至是吐槽。
显然,分类是基于有监督学习(supervized learning)的技术,因为实现知道了分类标签,而聚类则用于在一无所知的情况下对文档进行类别划分,比如google news,它就将新闻聚合成不同类别展现给用户.


创建索引组件 (Index Process)

索引往往比文档本身要小很多,比如lucene中的索引可以达到是原文档的20-30%,同时相对文档来讲更具可比较性。
这个组件必须有以下的能力:

1.文档统计 (Document Statistics)

统计、汇总和记录词出现的频率、位置和其它特征等信息。
比如索引项在所有文档中出现的次数,在一组或一类文档中出现的次数,在文档中出现的位置,以及按照词素(tokens)数量统计的文档长度。
处理这些信息的目的是丢给排序组件,排序组件根据这些信息对文档进行打分.
具体需要统计什么是根据排序组件中的检索模型来定,统计结果用一种叫查找表(lookup table)的高效数据结构来保存。

2.附加权重 (Weighting)

计算索引项(或词项)的权重,词的权重反映了词在文章中的相对重要性,排序算法需要这些信息来为分档进行打分。
具体的权重形式由检索模型决定,加权操作也可以、有时也必须需要查询中的一些信息来确定,所以这个功能的一部分也可以由查询处理系统来提供。但为了查询处理的效率,在索引建立环节需要尽可能多的去计算。

如果用户输入了这样一个查询“我想买玩具”,“我”这个词一般会大量出现在各个文档中,这个词的权重就不应该比“玩具”高,否则将会返回大量的包含“我”的文档,这就是一次不成功的查询。

一般的加权方法主要使用tf.idf

tf-词频(term frequency)是指索引项在一个文档中出现的频率.
idf-逆文档频率(inverse document frequency)是指索引项在所有文档集合中出现的频率.

idf=logNn

其中,N是所有文档总数,n是包含某个词项的文档个数.

在上面的例子中,结合idf的公式,可以看出,包含“玩具”这个词的文档数目n一定小于包含“我”这个词的文档数量m,所以“玩具”这个词的权重更高.
权重信息也会放入查找表中。

3.倒排 (Inversion)

倒排组件是创建索引组件的核心,因为它事关效率。

倒排是将文档-索引项转换为索引项-文档,如下:

term,doc=inversedoc,term

这个组件的挑战在于如何高效地处理倒排转换过程,应付全量和增量信息的索引建立任务。
同时为了减小索引的大小以提高效率,还会对索引进行压缩(compression)

4.分布索引 (Index Distrubition)

通常搜索引擎处理的文档集合非常大 ,那么就必须考虑索引的分布式问题。

document distrubition
为了能够并行的支持创建索引和查询,可以将文档子集的索引表派发到不同的计算机和站点上。
term distrubition
为了能够支持并行的查询,可以讲索引项子集的索引表派发到不同的计算机和站点上。

其它的分布方式还有p2p、复制(replication)等.

转载于:https://www.cnblogs.com/foreach-break/p/4471190.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值