前言
很长一段时间没有写博客,因为最近在忙一些学校的事情,在数据知识工程这门课上,老师留了一个大作业,是做一个简单的搜索引擎,功能需求如下:
要求:
用户可指定返回结果数
显示查询的响应时间
排序结果中提取文档中包含查询关键词的片段
支持短语(2单词)查询
按照功能的需求,我们最终完成了一个简单的搜索引擎,可以返回指定结果数、显示查询的响应时间,可以对结果进行排序,并且显示搜索结果所在的部分的文字,支持短语(2单词)的查询,并且支持类似于google /4 baidu的搜索方式,用以搜索在google和baidu之间间隔小于等于四个词的文档。
设计过程
索引
对于一个搜索引擎来说,最重要的部分应该就是索引的建立,一个索引建立的好坏与否直接决定了后面搜索部分的速度和准确度。而根据数据知识工程这门课程前面的讲解,建立索引就是通过对所有文本的扫描来获得单词token并且通过porter stemmer将单词变为相应的词根(term),然后将词根建立为dictionary,通过倒排索引建立每个term的文档id列表(postingList)。
获取token就是读取文件的过程,然后通过porter stemmer将单词转换为term。在建立索引的过程中有两个部分需要设计相应的数据结构。Dictionary和PostingList。
dictionary的建立可以使用两种数据结果来实现,一种是哈希表,一种是树。两种数据结构各有优劣,哈希表可以实现常数时间的查找,查找速度最快,但是如果dictionary需要增长的话需要耗费大量时间来重新建立哈希表。用树来存储term的好处在于可以实现前缀的查找,相对哈希表来说增加dictionary代价更小,缺点是查找不如哈希表那么快(logM)。因为本次作业是给定的数据集,为了实现最快速的查找,我们毫无疑问要选择哈希表来实现,因为代码是用Java来实现的,所以我们使用了