最近想研究一下搜索引擎,看资料前,前几晚趟在床上初步琢磨了一下;其实自己以前也有些零星的想法,先把自己的初步方案记录下来。再和Lucence等对比一下,检验一下自己的想法。
主要是搜索引擎的基本架构和数据模型。
1. 基本架构
按照使用这么多年Yahoo,Baidu的经验,Search Engine要做的事儿就是:输入几个关键字,查询出很多的网址列表。 列表一般按匹配度,网址的跳转频率等排序,也要简单列出该网页的前几十个字作为摘要。
所以查询模块是最外层的,也是第一个模块。
Engine内部要存储这些网址列表和关键词信息,首先要采集网址数据。因此采集模块是整个系统的数据来源。采集时,要分析网页中词(Word),并建立词和网页之间的关联,因此词法分析模块是采集后的一个数据处理模块。
大概先这么多吧:
1) 采集
2) 词法分析
3) 搜索
4) 数据存储(DB或File)
2. 模块及处理
1) 资源采集模块(Resource Collect)
互联网的所有信息以资源形式出现,虽然资源有不同形式:网页,普通文本,图片,视频,音乐等,但都可以用 URL 来唯一标识。
先只考虑对网页的搜索处理。
初步可以考虑,根据给定几个门户网站进行层次性采集。比如:从 sohu.com 首页,采集该页面所有链接 Link ,在对所有链接再进行同样的分析,由于网页一个链多个,不断向下链接,因此仅从一个给定的 URL向下分析,就能分析出很多URL,可能无穷尽,因此可以指定采集到那个层次深度 deep。 采集将所有的网页URL信息及基本信息存入 URL 库。
动态采集:比如你在javaeye中发表一篇新blog,google过会就能搜索到了。肯定不是上面的采集方法。至于什么方法,我暂时没想到,到时再看相关资料。暂时只考虑第一种采集。
2) 词法分析(Word Analyze)
对采集的URL库逐一进行分析,目的是分析出每个网页文本内容包含的 Word,并建立 Word 和 URL的对应关系索引。
英文分词容易,按空格。而中文比较棘手。但中文中的词在语言学上应该是一个有限集合 WordSet,假定符合语义的词都在一个字典中 dictionary,那么,分析URL时,对汉字的组合进行字典检查,符合语义的词才保存到 Word 库中。
词法分析,暂定按汉字个数组合依次分析:2个,3个,4个。OK,先这么多,多的也不管啦。也就是说假定合法的汉语Word只包含2,3,4个汉字。
3) 搜索(Search)
单词搜索:用户输入单个Word,系统在数据中进行查询。按Word-URL索引进行快速等值匹配。将符合的URL列表返回,包含网页标题,URL,前50字的摘要等信息。URL列表的排序是个关键,按下列顺序排序:标题匹配,摘要匹配,正文匹配,URL被搜索次数。
每次搜索,系统对被搜索Word的搜索次数+1,结果集合中的网页URL被搜索次数+1, 被点击的结果URL,对其点击次数+1.
先不考虑分页。
3. 数据模型
1) 首先有几个基本数据项:网页(URL),词(Word),词组(WordGroup)。
词库 Word:wordID, word
词组库: WordGroup:wordGroupID, wordGroup
网页 URL: 网页是 text/html 类型的资源,它有几个基本属性:
URL,
标题(Title),
摘要(Abstract),
建立时间(Time),只入URL库被索引起来的时间。
其中URL是唯一标识,互联网上,任何资源都可以用一个URL唯一表示,因此,被索引的就不只是网页,图片,视频,一般文件等都可以作为引擎搜索的对象。
2) 匹配 (Match关系)
在词法分析时,所有词都是被选关键词,要快速查询,需要建立所有词和网页的关系索引,因此需要URL-Word关系,N:M, 这个关系就是匹配索引(MatchIndex)。 词法分析模块的结果就是生成Word词库,URL库和 Match 关系。 查询时,就可以根据Word快速找到网页(或URL)。
Match属性:
wordID,
urlID,
keywordMatch, 网页关键词是否匹配,用<meta/> keyword进行判断;
urlMatch,url是否匹配
abstractMatch,摘要匹配次数,
fullTextMatch, 除摘要外的全文匹配次数,
matchLocs, 摘要和全文匹配位置列表,记录多个位置,逗号隔开,格式: "loc1,loc2,loc3", 例如"3,19,230"
matchTime, 词法分析记录下此匹配记录的时间
3) URLGroup: 按词组搜索肯定是要考虑的,因此也要建立词组和网页的关系:URL-WordGroup。词组是查询时输入的,是分散的几个word组成的一个临时组,WordGoup也是在查询阶段建立的。
4) WordGroupMatch: wgID,urlID.
5) SearchRecord: 对搜索查询要做记录,主要是记录用户搜索关键词的频率。SearchRecord:WordID,URL,Time,IP.
6 WordFrequency: 搜索结果要记录输入的关键词频率:WordFrequency:Word,Frequency.
7) 相应的,需要有:WordFGrouprequency
URLFrequency: 搜索结果对匹配的网页也要记录它的频率,让用户的搜索行为反应到网页被搜索的频率上,以后的查询结果,不断根据网页被搜索的次数调整在搜索结果中的顺序。URLFrequency:URL,frequency