基于BOOST的小型搜索引擎

搞这个项目的初衷是因为在查boost文档的时候很不方便,每一次都要因为没有搜索引擎搞好久,所以这一次就打算自己写一个基于boost库的搜索引擎,期望达到的目标是当用户输入关键字的时候,可以将相关的文档的标题,url以及摘要按照相关度罗列出来。
项目一共分为三个模块,分别为数据解析模块,索引模块以及搜索模块。

数据解析

首先我们需要对存在于主机上的boost文档进行数据解析,很明显我们只需要html文件,并且根据后面的需要我们需要将每一个html的信息(标题,url,正文)进行提取,存储在doc_info结构体中,方便后面你索引模块构建索引。

索引

在索引模块,我们需要实现用户输入关键字,可以快速的返回搜索结果,所以我们需要将解析后的数据通过构建为倒排索引与正排索引两种方式,在这个模块中我们需要实现的具体点在于如何根据相关度来展示搜索结果,如何做到时效性而不是一个个遍历。所以我们采用正排索引和倒排索引两种方式来解决这个问题,正排索引就是给定每一个要搜索的html编号根据编号来存储,当我们搜索的时候只需要输入编号就可以,倒排索引就是我们输入关键字根据关键字的相关度给出html。

关于正排索引的实现方式我们一般用vector等顺序容器实现,html的编号就是下标。
关于倒排索引的实现方式我们一般用哈希原理实现容器就是unorder_map,因为哈希可以做到根据关键字快速搜索出想要的资源,不过在我们这里由于关键字在很多html中都存在,所以要根据词频来计算优先度。

在正排索引中我们要构建结构体从而包括url正文以及标题,而在倒排索引中我们则要先将文章以及标题分词,将分词结果存起来以备使用,这里文章和标题的权重比例为1:10.
在倒排索引中我们底层用哈希存储,哈希的K是要搜索的字符,V是一个vector,这个vector中存储着倒排索引定义的结构体,其中每一个节点包括html的正排索引编号以及权重。

所以在我们拿到一个html的时候,首先将他标题以及正文还有url解析出来,然后存在正排索引里,然后将他根据权重进行分词,根据所分的不同的词插入到每一个词的vector里存在底层的哈希中。

搜索模块

搜索模块分为分词,查找,排序,构建这四部分,首先我们将用户输入的字符串进行分词,根据分词的不同在倒排索引中进行查找,将查找的结果存起来然后进行排序,根据词频大小进行排序,最后根据指定的格式将结果展示出来。
我们这里一共有两处用到分词,第一次是在构建索引的时候将正文以及标题进行分词,第二次是用户键入字符串的时候将字符串进行分词,这里用的是github的开源项目:结巴分词
在完成后我们这个搜索引擎只是单机使用,可以利用http,用户将输入的字符串利用http传入主机,在搜索引擎搜索后再将构建的结果利用http传入客户端,这里由于http服务器不是主要,所以没有进行实现,利用的是github开源项目httplib
至此,一个简单的搜索引擎就完成了,功能拓展待笔者有时间慢慢加吧…
源码 [email protected]:walekkk/search_engine.git

你可能感兴趣的:(数据结构,linux)