# 基于内存的搜索引擎设计和实现
## 需求分析
## 题目要求
实现一个基于内存的英文全文检索搜索引擎,需要完成以下功能:
功能 1:将指定目录下的一批.txt 格式的文本文件扫描并在内存里建立倒排索引,这里面包含必须的子功能包括:
读取文本文件的内容;
将内容切分成一个个的单词;
过滤掉其中一些不需要的单词,例如数字、停用词(the, is and 这样的单词)、过短或过长的单词(例如长度小于 3 或长度大于 20 的单词);
利用 Java 的集合类在内存里建立过滤后剩下单词的倒排索引;
内存里建立好的索引对象可以序列化到文件,同时可以从文件里反序列化成内存里的索引对象;
可以在控制台输出索引的内容。
功能 2:基于构建好的索引,实现单个搜索关键词的全文检索,包含的子功能包括:
根据搜索关键词得到命中的结果集合;
可以计算每个命中的文档的得分,并根据文档得分对结果集排序;
在控制台显示命中的文档的详细信息,如文档的路径、文档内容、命中的关键词信息(如在文档里出现次数)、文档得分;
功能 3:基于构建好的索引,实现二个搜索关键词的全文检索。包含的子功能包括:
支持这二个关键词的与或查询。与关系必须返回同时包含这二个单词的文档集合,或关系返回包含这二个单词中的任何一个的文档集合;
可以计算每个命中的文档的得分,并根据文档得分对结果集排序;
在控制台显示命中的文档的详细信息,如文档的路径、文档内容、命中的关键词信息(如在文档里出现次数)、文档得分;
功能 4:基于构建好的索引,实现包含二个单词的短语检索,即这二个单词必须在作为短语文档里出现,它们的位置必须是相邻的。这个功能为进阶功能。
除了以上功能上的要求外,其他要求包括:
针对搜索引擎的倒排索引结构,已经定义好了创建索引和全文检索所需要的抽象类和接口。学生必须继承这些预定义的抽象类和和实现预定义接口来完成实验的功能,不能修改抽象类和接口里规定好的数据成员、抽象方法;也不能在预定义抽象类和接口里添加自己新的数据成员和方法。但是实现自己的子类和接口实现类则不作任何限定。
自己实现的抽象类子类和接口实现类里的关键代码必须加上注释,其中每个类、每个类里的公有方法要加上 Javadoc 注释,并自动生成 Java API 文档作为实验报告附件提交。
使用统一的测试文档集合、统一的搜索测试案例对代码进行功能测试,构建好的索引和基于统一的搜索测试案例的检索结果最后输出到文本文件里作为实验报告附件提交。
本实验只需要基于控制台实现,实验报告里需要提供运行时控制台输出截屏。
关于搜索引擎的倒排索引结构、相关的抽象类、接口定义、还有相关已经实现好的工具类会在单独的 PPT 文档里详细说明。同时也为学生提供了预定义抽象类和接口的 Java API 文档和 UML 模型图。
需求分析
自行对题目要求进行细化、补充, 例如发生异常的条件。
除上述题目要求以外,额外的细化,补充分析如下:
功能 1:将指定目录下的一批.txt 格式的文本文件扫描并在内存里建立倒排索引
对给定的目录,逐个读取每一个文本文件,建立存储每个文档信息的结构(document)用于存储每个文档的以下信息:文档编号、文档路径、文档内容;
将每个文本文件的内容切分成一个个的单词,针对每一个单词构建包含此单词信息的三元组(TermTuple):单词文本、出现的位置、出现的次数;
对给定目录的所有文本文件完成三元组的构建和去重之后建立索引:索引包含两个结构,由文档编号和文档路径构成,用于查询文档;由词语和对应的 postinglist 构成,用于查找具体词条
索引的第一个结构使用 map 结构建立即可;第二个结构需要遍历每一个文档的 TermTuple 来构建每一个词语的 PositionList
索引对象的序列化与反序列化过程中要注意,map 等引用数据在序列化和反序列化的时候不能直接操作,而需要遍历每一个成员进行遍历,可能的话需要调用成员的序列化/反序列化方法,进行递归操作
可以在控制台输出索引的内容,完成相应的 toString 方法,可能的话需要调用子成员的 toString 方法
功能 2:基于构建好的索引,实现单个搜索关键词的全文检索
命中的结果集合需要使用一定的数据结构存储,此处通过数组来保存
计算每个命中的文档的得分时简单地根据在文档中的出现次数来进行计分;
注意对构建好的索引检索时可能为空的情况,针对这种情况要有相应的处理
功能 3:基于构建好的索引,实现二个搜索关键词的全文检索。
支持二个关键词的与或查询。先对分别两个关键词进行单词查询,针对查询结果,对于不同的要求(与/或)进行查询结果的筛选或合并,同样要注意无结果的处理;
可以计算每个命中的文档的得分进行排序,在控制台显示命中的文档的详细信息,这两个功能的实现与功能 2 中类似;
## 系统设计
## 概要设计
介绍设计思路、原理。将一个复杂系统按功能进行模块划分、建立模块的层次结构及调用关系、确定模块间的接口及人机界面等。
要有总体结构、总体流程(图)。
设计每个模块的实现算法(处理流程)、所需的局部数据结构。具体介绍每个模块/子程序的功能、入口参数、出口参数、流程(图)等。
![](https://www.writebug.com/myres/static/uploads/2022/6/16/4e5a3e14dc08867a51cdd71807a9f78e.writebug)
图 1 总体结构流程图
主体流程分为三个部分,跟工程所分的三个 package 一样(index, parse, query),分别为以下内容
对给定的目录下的文件进行扫描,将每一个文本文件通过 StringSplitter 拆分为单词,同时使用 Filter 对不满足要求的单词进行筛选,将单词存储为 TermTuple 格式,并以此来构建 Document 对象。
对每一个 Document 建立索引,分为两个部分,对于文档自身的索引以及对于词条的索引,对于后者,我们通过不断地读取 Document 中的 TermTuple 来构建针对每一个单词的 Postinglist。接着完成序列化以及反序列的功能
词条查询则直接在对应的 term 到 postinglist 的 map 中寻找对应的词语,并将结果包装为 Hit 即可
## 详细设计
相关存储结构
构建索引用到的相关类的 UML 图如图 2 所示
![](https://www.writebug.com/myres/static/uploads/2022/6/16/994f22df64669682a856c2c1243fd8d7.writebug)
图 2 相关存储结构 UML 图
Term:本质上是对于 String 类型的简单包装,所以实现起来非常简单,在此不再赘述;
TermTuple:对于某一次单词出现情况的包装,主要有三个成员,term, freq, curPos,分别表示单词本身,出现的频率(默认为 1),以及在某一个文档中出现的位置;
Document: 保存每一个文档的基本信息,包括文档所在路径 docPath,文档唯一编号 docId,同时还有组成整个文档的所有单词所构成的 TermTuple 的 List。实现了 addTuples 方法将传入的 Tuple 添加到三元组中,contains 方法判断三元组中是否存在传入的 Tuple,以及 getTuple 方法根据传入的下标获取
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
资源包含文件:课程报告word+项目源码+帮助文档等 开发环境Manjaro-Deepin下的Intellij IDEA ultimate edition 2020.1.1-1,编译链接直接点击运行即可,实验中使用的jdk版本为1.8。调试过程也是通过idea进行的。 这次实验基本上是在给定的框架之下实现指定的功能,比较有特色的主要有以下几点 1.各种对象的序列化以及反序列化。在序列化过程中充分利用了成员实现的序列化反序列化方法,与在toString方法中调用成员的toString方法有异曲同工之妙 2.充分利用Java实现的API接口。比如在类Index中的getDictionary方法中,需要返回所有保存的Term,可以直接调用map结构的keySet方法返回一个Set对象,包含了所有的键,也即所有的Term,类似的还有由于实现了子类的compareTo以及equal方法,对于子类所构成的ArrayList可以放心的调用sort方法, 详细介绍参考:https://biyezuopin.blog.csdn.net/article/details/125358637
资源推荐
资源详情
资源评论
收起资源包目录
Java实现基于内存的搜索引擎设计和实现.zip (323个子文件)
test.bat 740B
stylesheet.css 13KB
testng-reports.css 5KB
testng.css 312B
index.dat 2KB
index_search_sort.dat 2KB
index.dat 1KB
index_1_2_3_txt.dat 904B
PostingList.dat 166B
Posting.dat 136B
Term.dat 20B
Java实现基于内存的搜索引擎设计和实现 课程论文.doc 947KB
collapseall.gif 157B
index.html 240KB
emailable-report.html 94KB
methods-alphabetical.html 41KB
methods.html 41KB
AbstractHit.html 24KB
AbstractPostingList.html 24KB
AbstractPosting.html 23KB
Index.html 22KB
AbstractDocument.html 22KB
AbstractTerm.html 22KB
AbstractIndex.html 22KB
index-1.html 22KB
testng.xml.html 20KB
AbstractTerm.html 18KB
AbstractPosting.html 18KB
AbstractIndexSearcher.html 18KB
index-16.html 17KB
D__IdeaWorkspace_SeachEngine_test_hust_cs_javacourse_search_index_IndexTest.java.html 16KB
Config.html 15KB
AbstractIndexSearcher.LogicalCombination.html 15KB
AbstractTermTuple.html 14KB
AbstractTermTuple.html 14KB
AbstractTermTupleScanner.html 14KB
AbstractTermTupleFilter.html 13KB
FileUtil.html 13KB
AbstractIndexBuilder.html 13KB
StringSplitter.html 13KB
package-use.html 13KB
AbstractDocumentBuilder.html 13KB
AbstractTermTupleStream.html 13KB
index-7.html 12KB
index-17.html 12KB
AbstractHit.html 12KB
D__IdeaWorkspace_SeachEngine_test_hust_cs_javacourse_search_index_DocumentBuilderTest.java.html 11KB
AbstractDocument.html 11KB
index-3.html 11KB
D__IdeaWorkspace_SeachEngine_test_hust_cs_javacourse_search_query_HitTest.java.html 11KB
overview-tree.html 11KB
AbstractTermTupleStream.html 11KB
AbstractPostingList.html 11KB
classes.html 11KB
AbstractIndex.html 11KB
AbstractIndexSearcher.LogicalCombination.html 10KB
FileSerializable.html 10KB
Sort.html 10KB
FileSerializable.html 9KB
TestBuildIndex.html 9KB
TestSearchIndex.html 9KB
StopWords.html 9KB
index-9.html 9KB
index-4.html 9KB
Sort.html 9KB
package-summary.html 9KB
help-doc.html 8KB
D__IdeaWorkspace_SeachEngine_test_hust_cs_javacourse_search_index_PostingListTest.java.html 8KB
AbstractDocumentBuilder.html 8KB
serialized-form.html 8KB
index-10.html 8KB
package-tree.html 8KB
index-8.html 8KB
package-use.html 7KB
package-summary.html 7KB
D__IdeaWorkspace_SeachEngine_test_hust_cs_javacourse_search_index_PostingTest.java.html 7KB
package-summary.html 7KB
index-15.html 7KB
package-summary.html 7KB
toc.html 7KB
index-11.html 7KB
index-6.html 7KB
index-13.html 7KB
index-2.html 7KB
D__IdeaWorkspace_SeachEngine_test_hust_cs_javacourse_search_index_DocumentTest.java.html 6KB
package-use.html 6KB
index-14.html 6KB
index-5.html 6KB
index-19.html 6KB
index-18.html 6KB
overview-summary.html 6KB
package-tree.html 6KB
package-summary.html 6KB
package-summary.html 6KB
index-12.html 5KB
package-tree.html 5KB
package-tree.html 5KB
package-tree.html 5KB
package-tree.html 5KB
AbstractTermTupleScanner.html 5KB
共 323 条
- 1
- 2
- 3
- 4
资源评论
- piyefei2023-04-16终于找到了超赞的宝藏资源,果断冲冲冲,支持!
- m0_740573652024-04-18资源不错,内容挺好的,有一定的使用价值,值得借鉴,感谢分享。
shejizuopin
- 粉丝: 9538
- 资源: 1288
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功