最近在做一个关于搜索引擎方面的项目,于是乎研究了一点关于搜索引擎方面的东西。我们的目标是做一个轻量级的搜索引擎,相对真正的商业搜索引擎来说还是较为简单的。
对于搜索引擎这样的项目来说,我觉得重点在于质量要求,对于功能要求可能会弱一点。高并发,高存储量和快速查询是一个搜索引擎的命脉,而在功能上重点要注意的是几个算法的实现。以前做的项目大多数只是注重功能的实现,对于性能的要求很低,而这次的项目则要求我们对这方面有所注重,也是一次很好的学习过程。
从该项目的需求出发,将项目分为 4 个模块,分别为抓取模块,分析模块,搜索模块和用户接口模块。对于每个模块的需求进行的相应的划分。根据需求以及现实的硬件条件,初步设计出搜索引擎的体系结构,如下图。
抓取模块和分析模块
首先是抓取模块和分析模块,对于互联网进行定期的网页爬取,并进行分析。将爬取和分析的数据存储到数据库。对于数据库,主要分为 4 个部分,存储链接结构的链接表,存储网页内容的内容表,建立关键词倒排索引的索引表和用于竞价排名的竞价表。
在爬取和分析数据的时候需要在链接表中预储存一部分网页链接,根据已有的网页链接进行网页爬取,并且将新的链接存储的数据库中,采用类似队列的方式对于网页爬取链接进行处理。对于链接表中数据的设计要考虑到后期根据反向链接的数量进行搜索结果排序。将爬取和分析后的页面存储到内容表中,并且,分析模块分析网页建立词项的倒排索引存储到索引表中。
在质量要求方面要求对数据库中的数据进行加密处理以及多个服务器之间的数据同步。我们的设计是多个服务器上的数据库进行完全冗余存储,及多个数据库中的数据同步。每个服务器进行网页的爬取和分析以后要将本服务器新增的数据发送给另外的服务器以保持数据同步。
搜索模块
搜索模块的主要功能是根据用户的请求进行处理,返回给用户搜索的结果。因为多个服务器之前的数据库是冗余的,所以在搜索的时候只要对本服务器进行搜索即可。
搜索模块接受到用户的请求,将用户的请求进行分词处理和近义词处理。然后通过对索引表和内容表的查询,搜索出结果集,并且根据链接表和竞价表对结果集进行加权和排序。将排序后的结果集返回给用户。
在质量要求方面要求大量用户的并发执行,要求多线程和良好的 Bean 容器。
用户接口模块
用户接口模块运行在另外的一个 web 服务器上,该 web 服务器呈现网页并接受用户的请求,首先对用户的输入进行敏感词分析,将分析过的请求发送到后台服务器,并从后台服务器获得搜索结果,将结果显示给用户。
质量上要求多用户的并发,主要体现在要求良好 web 容器和多线程,以及在发送请求到后台服务器时的负载均衡。