数据知识工程大作业——goodu搜索引擎设计与实现

本文介绍了作者在数据知识工程课程中的大作业——设计并实现一个简单的搜索引擎。搜索引擎支持用户指定返回结果数、查询响应时间显示、按权重排序结果、短语查询以及谷歌/百度式的间隔查询。文章详细阐述了索引构建(使用哈希表和链表数据结构)和查找过程(单词搜索采用堆排序,词组搜索基于向量夹角计算)。同时,分享了在实现过程中遇到的问题及解决方案。
摘要由CSDN通过智能技术生成

前言

很长一段时间没有写博客,因为最近在忙一些学校的事情,在数据知识工程这门课上,老师留了一个大作业,是做一个简单的搜索引擎,功能需求如下:

要求:

用户可指定返回结果数

显示查询的响应时间

排序结果中提取文档中包含查询关键词的片段

支持短语(2单词)查询

 

按照功能的需求,我们最终完成了一个简单的搜索引擎,可以返回指定结果数、显示查询的响应时间,可以对结果进行排序,并且显示搜索结果所在的部分的文字,支持短语(2单词)的查询,并且支持类似于google /4 baidu的搜索方式,用以搜索在googlebaidu之间间隔小于等于四个词的文档。

 

设计过程

索引

对于一个搜索引擎来说,最重要的部分应该就是索引的建立,一个索引建立的好坏与否直接决定了后面搜索部分的速度和准确度。而根据数据知识工程这门课程前面的讲解,建立索引就是通过对所有文本的扫描来获得单词token并且通过porter stemmer将单词变为相应的词根(term),然后将词根建立为dictionary,通过倒排索引建立每个term的文档id列表(postingList)。

获取token就是读取文件的过程,然后通过porter stemmer将单词转换为term。在建立索引的过程中有两个部分需要设计相应的数据结构。DictionaryPostingList

dictionary的建立可以使用两种数据结果来实现,一种是哈希表,一种是树。两种数据结构各有优劣,哈希表可以实现常数时间的查找,查找速度最快,但是如果dictionary需要增长的话需要耗费大量时间来重新建立哈希表。用树来存储term的好处在于可以实现前缀的查找,相对哈希表来说增加dictionary代价更小,缺点是查找不如哈希表那么快(logM)。因为本次作业是给定的数据集,为了实现最快速的查找,我们毫无疑问要选择哈希表来实现,因为代码是用Java来实现的,所以我们使用了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值