900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 小型站内搜索引擎

小型站内搜索引擎

时间:2022-06-26 06:41:25

相关推荐

小型站内搜索引擎

写在前面

关于搜索引擎我们平时接触到的再多不过了,谷歌、必应、搜狗等,当然这些搜索引擎都是属于比较大型的搜索引擎,他们基本上是可以对全网的网页数据进行搜索的

通常我们在使用搜索引擎时,我们输入完搜索内容之后进行搜索,搜索引擎会在一个极短的时间内为我们反馈出来上万条甚至几十万条跟搜索内容相关的数据

其实我们知道这个搜索的过程其实是将用户的搜索请求对各个网页的html文件内容进行匹配关键字,说通俗一点其实也就是一堆在文件里面找一段字符串,如果这个文件中有这段字符串,那么就认为这个html文件跟搜索的关键词相关,然后将这个html文件的标题,内容摘要,以及对应在互联网中的URL作为一条搜索结果反馈给用户

对于在文件中查找相关搜索关键词的过程我们不难理解,但是搜索引擎是如何能够在短时间内反馈给用户这么准确并且大量的数据呢,这里我们就要涉及到两个索引:正排索引、倒排索引

正排索引

正排索引说通俗一点就是通过一个文档ID,我们可以得到这个文档ID所对应的文档内容

倒排索引

倒排索引又叫做反向索引,它和正排索引刚好是反过来的,倒排索引就是根据内容可以查找到指定的文档编号

正排索引是从文档到关键字的映射(已知文档求关键字),倒排索引是从关键字到文档的映射(已知关键字求文档)

当我们有了正排索引和倒排索引的概念之后来理解搜索引擎的搜索过程,用户输入关键字,搜索引擎根据关键字找到对应的文档编号,再通过文档编号找到对应的文档内容反馈给用户,因为是映射关系,所以在查找的时候效率就会很高,这也就是为什么在短时间内搜索引擎可以反馈给用户大量的搜索结果。

所以写一个搜索引擎的核心之处就是构建正排索引和倒排索引

关于项目

用于php官方帮助文档的检索的站内搜索引擎

因为在接触了解到搜索引擎这方便知识以后想自己写一个搜索引擎,但是无奈在原始数据这块有些缺乏,所以找到了php官方帮助文档,php官网提供相关帮助文档的html文件下载,包含约一万四千左右的html文档,所以该项目的目的就是能够实现能够根据关键词对php官方一万多个文档的快速检索

项目开发环境

平台工具:CentOS 7, g++

语言:C++

用到的第三方库:Boost库, cppjieba(结巴分词)、jsoncpp、cpp-httplib

源码:/NiuBenn/Search

项目具体:

概述:整个项目分为三大模块:对html文件的处理模块构建正排以及倒排索引的模块、搜索模块

一、对html文件的处理

该模块的目的:解析出html文件的文档标题、正文、以及对应在php官网的URL

首先通过boost库中的filesystem文件系统得到我们项目data/input目录下的所有html文档的路径,然后依次对每一个文档进行解析

解析标题:通过html文档中的<title></title>标签我们可以解析出该文档的文档标题

解析正文:首先html文档的内容包括了两部分,正文以及html标签,所以我们这一部分的目的就是去除掉html标签,保留下正文,可以根据htlm的文件格式,利用标签总是被<>包裹的规则,去掉标签,保留正文

解析URL:我们通过观察不难发现我们data目录中的文档路径与php官方网站中的URL有着对应的关系,通过这个关系我们可以处理我们本地htlm文档的path得到URL

对解析出来的标题、正文、URL我们存放在一个Doc_Info的结构体中

其次我们将解析出来的所有内容按照每个文件一行的格式追加写入到一个文件中,用于后续构建索引

二、构建索引

首先我们构造正排索引,通过读取起前面模块处理后的数据,我们将每个文档的标题、正文、URL读取出来,存放在Doc_Info结构体中,这里的Doc_Info相比前面的多了一项文档ID,然后将读取出来的每个Doc_Info对象编号后push_back到我们的 Forwardl Index正排索引的这个vector中,这样我们正排索引的部分就构建完毕了

倒排索引部分我们需要一个kv的数据结构来存放我们的数据,所以这块我们使用了map,k就是关键词,val就是包含了这个关键词,词频,文档id的一个结构数组,这块我们使用结巴分词对正文和标题部分进行分词,然后通过分词的结果,我们简单的进行词频统计,将关键词,词频,文档id作为一个结构体pushback到对应key值的被vector中,这样我们的倒排索引部分就构建完毕

三、搜索模块

根据的搜索内容进行分词将用户的搜索内容分为多个关键词,依次去倒排索引中查找对应的文档id,然后将多个关键词查出的多组文档id进行去重合并,重新计算权值,然后按照权值排序,从而我们得到了一组权值又高到低的文档id,然后我们利用文档id再去正排索引中将对应的每一个文档的标题,正文摘要,URL获取。将获取到的多条结果使用json序列化的方式构建返回结果

四、server模块

​​​​​​​我们根据用户的搜索内容调用搜索模块,将搜索模块得到的序列化的数据返回给用户

在整个项目过程中,也遇到了很多大大小小的问题,最多的是第三方库的使用,还有多多少少数据处理过程中的一些小细节问题

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。