基于Javaweb的搜索引擎的实现报告模板.docx
《基于Javaweb的搜索引擎的实现报告模板.docx》由会员分享,可在线阅读,更多相关《基于Javaweb的搜索引擎的实现报告模板.docx(29页珍藏版)》请在冰豆网上搜索。
![基于Javaweb的搜索引擎的实现报告模板.docx](https://file1.bdocx.com/fileroot1/2022-12/7/5095a0d1-3e42-4276-a60c-d4982c811e69/5095a0d1-3e42-4276-a60c-d4982c811e691.gif)
基于Javaweb的搜索引擎的实现报告模板
仁爱学院
长实习设计说明书
题目:
基于Javaweb的搜索引擎的实现
系别:
专业班级:
学号:
学生姓名:
指导教师:
蒋辉
2021年11月20日
1项目治理
该部分文档编写负责人
该部分文档复核人
最终版本
项目开发打算必需由粗到细给出,每项任务要落实到人且规定该任务的起止日期和时刻;明确每一个时期提交文档的日期和时刻。
保证任务按时正常完成。
简单部署人员任务分派和时刻分派
确信组长胡杨实现Heritrix网络爬虫的页面摄取,Lucene全文搜索,成立索引,依照索引进行搜索,运用tika页面解析器进行html页面的解析,运用mmseg4j分词器进行中文分词,编写功能完整的搜索函数,并用junit进行简单的测试。
确信组员李文杰要紧工作是设计及实现主界面和搜索结果界面的设计,成立单表数据库的成立,在数据库中添加有关页面信息,设计和实现数据访问类,设计和实现数据元素的实体类,设计搜索结果页面的信息反馈,和进行本项目的软件测试工作。
9月20日至9月30日,组长与组员商讨搜索引擎的成立原理,去图书馆借阅相关书籍。
确信搜索引擎实现功能为学院官网新闻板块的全文搜索,运用apache公司的开源项目Lucene实现全文搜索的索引成立及对索引的搜索功能,运用网络爬虫Heritrix对被搜索页面进行摄取,运用开源jar包tika对已摄取的html页面进行解析,中文分词部份利用sougou中文分词器。
10月8日至10月15日,配置Heritrix_1.14网络蜘蛛,进行目标网页的摄取,进行主界面的初步设计,成立数据库,在myeclipse中配置Lucene_3.5,对摄取的html页面进行索引的成立,并编写junit测试类进行时期性测试。
10月16日至10月23日,对成立的索引编写搜索实现类,并调试,初步设计搜索引擎的搜索结果显示页面。
10月24日至10月31日,在项目中加入中文搜索分词器,在数据库中加入被搜索的页面信息,编写数据访问类,编写页面实体的实体类。
11月1日至11月7日,在项目中加入tika页面信息提取器,实现完整的搜索功能,将搜索结果在搜索结果页面显示出来。
11月8日至11月15日,最后完善项目,在搜索页面中加入结果条数显示,在新页面中打开结果页面的链接,增加结果分页,每页6条结果。
11月16日至11月20日,撰写本报告,撰写演示文稿。
2.需求分析
该部分文档编写负责人
该部分文档复核人
最终版本
项目的功能需求分析
本项目实现功能:
1.对学院官网新闻板块进行分析,成立索引。
2.在主页面输入要搜索的关键字,点击“搜索一下”按钮,稍等,会自动跳转到搜索结果页面。
3.在结果页面,点击tjrac搜索,能回到主页面,在后面的文本框中再次输入搜索关键字,点击“搜索一下”按钮,能从头进行搜索。
4.搜索结果显示页面中,能显示搜索结果的条数,并带有分页功能,每页显示6条结果,点击“下一页”,“上一页”进行跳转,也能够输入页面序号进行直接跳转。
5.结果页面显示搜索的结果的题目,题目同时又是超链接,点击能够在新的页面中打开对应的网页,还会显示结果的中文摘要,对应网址等。
6.系统简单流程图:
查询数据表的内容
根据数据表中的内容生成索引文件
校验创建文件是否成功
进行搜索
显示失败
(图2-1)
8.系统数据流图:
输入搜索关键字
根据已摄取的网页建立索引
根据索引进行搜索
对搜索结果在数据库中进行查找
如果存在结果?
显示在结果页面中显示结果
显示无搜索结果
Y
N
(图2-2)
编号
标题
摘要
网址
网页
(图2-3)
3.数据库设计
该部分文档编写负责人
该部分文档复核人
最终版本
3.1
数据库表格设计与实现。
3.2
表3-1page
字段名称
含义
类型
是否为空
约束
自动增长
id
varchar(25)
NO
主键
否
name
varchar(80)
NO
content
varchar(120)
NO
address
varchar(100)
NO
3.3
数据库编写脚本:
CREATETABLE`page`(
`id`varchar(25)NOTNULLCOMMENT'页面编号',
`name`varchar(80)NOTNULLCOMMENT'页面名称',
`content`varchar(120)NOTNULLCOMMENT'页面简介',
`address`varchar(100)NOTNULLCOMMENT'页面地址',
PRIMARYKEY(`id`)
)ENGINE=MyISAMDEFAULTCHARSET=gbk;
INSERTINTO`page`VALUES('t20200525_33928','增进交流共谋进步——记天津大学与仁爱学院工业设计专业交流会','10月14日,天津大学仁爱学院机械系组织06级工业设计专业新生到天津大学进行参观学习,这次活动深受广大新生的好评。
日前','tjrac.edu/collegenews/collegenews/202005/t20200525_33928.htm');
INSERTINTO`page`VALUES('t20200525_33927','嵇纬武教授与学院同窗座谈','10月16日下午,嵇纬武教授与学院英语专业同窗及其他专业同窗别离座谈,听取同窗们对近来英语教学的情形反映,沟通教学信息','tjrac.edu/collegenews/collegenews/202005/t20200525_33927.htm');
INSERTINTO`page`VALUES('t20200525_33926','邱忠文教授与治理系部份同窗座谈','10月18日中午,邱忠文教授与治理系部份同窗座谈,了解同窗们数学学习情形和学习生活信息。
邱教授安排每周三中午与同窗们座谈','tjrac.edu/collegenews/collegenews/202005/t20200525_33926.htm');
INSERTINTO`page`VALUES('t20200525_33925','天津大学仁爱学院2006级首届新生开学典礼隆重举行(图)','冷风习习,吹走了炎炎夏日,迎来了清凉宁谧、硕果累累的金秋。
在这秋高气爽季节,在彩球飞扬、人群涌动的喜庆气氛中,天津大学仁爱学院于9月20日上午10:
00在喷泉广场隆重举行2006级新生开学典礼','tjrac.edu/collegenews/collegenews/202005/t20200525_33925.htm');
INSERTINTO`page`VALUES('t20200525_33923','天津大学仁爱学院天津市现场咨询会','[图]','tjrac.edu/collegenews/collegenews/202005/t20200525_33923.htm');
INSERTINTO`page`VALUES('t20200525_33924','各省市考生及家长注意我院专业信息','各省市考生及家长请注意,您所取得的关于我院以下专业信息的说明如下:
智能工程是专业方向 事实上是我院机械系 机械设计制造及其自动化专业科技英语是我院英语专业的专业方向',
。
。
。
。
。
。
(以下略)
4.概要设计
该部分文档编写负责人
该部分文档复核人
最终版本
4.1
要紧介绍项目利用的编程技术及手腕
4.2
1.Lucene:
Lucene是apache软件基金会jakarta项目组的一个子项目,是一个的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部份引擎(英文与德文两种西方语言)。
Lucene的目的是为人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或是以此为基础成立起完整的全文检索引擎。
(图4-1)
作为一个全文检索引擎,其具有如下突出的优势:
(1)索引文件格式独立于应用平台。
Lucene概念了一套以8位字节为基础的索引文件格式,使得兼容系统或不同平台的应用能够共享成立的索引文件。
(2)在传统全文检索引擎的的基础上,实现了分块索引,能够针对新的文件成立小文件索引,提升索引速度。
然后通过与原有索引的归并,达到优化的目的。
(3)优秀的的系统架构,使得关于Lucene扩展的学习难度降低,方便扩充新功能。
(4)设计了独立于语言和文件格式的接口,通过同意Token流完成的创建,用户扩展新的语言和文件格式,只需要实现文本分析的接口。
(5)已经默许实现了一套壮大的查询引擎,用户无需自己编写代码即便系统可取得壮大的查询能力,Lucene的查询实现中默许实现了布尔操作、模糊查询(FuzzySearch[11])、分组查询等等。
2.Heritrix:
Heritrix是一个爬虫框架,可加如入一些可互换的组件。
(图4-2)
它的执行是进行的,要紧有以下
几步:
1。
在预定的URI当选择一个。
2。
获取URI
3。
分析,归档结果
4。
选择已经发觉的感爱好的URI。
加入预定队列。
5。
标记已经处置过的URI
要紧部件:
Heritrix要紧有三大部件:
范围部件,边界部件,处置器链
范围部件:
要紧依照规那么决定将哪个URI入队。
边界部件:
跟踪哪个预定的URI将被搜集,和已经被搜集的URI,选择下一个URI,剔除已经处置过的URI。
处置器链:
包括假设干处置器获取URI,分析结果,将它们传回给边界部件。
3.中文分词器
mmseg4j用Chih-HaoTsai的MMSeg算法实现的器,并实现lucene的analyzer和solr的TokenizerFactory以方便在Lucene和Solr中利用。
MMSeg算法有两种分词方式:
Simple和Complex,都是基于正向最大匹配。
Complex加了四个规那么过虑。
官方说:
词语的正确识别率达到了98.41%。
mmseg4j已经实现了这两种分词算法。
4.文档解析器
ApacheTika利用现有的解析类库,从不同格式的文档中(例如HTML,PDF,Doc),侦测和提掏出元数据和结构化内容。
(图4-2)
功能包括:
侦测文档的类型,,语言,等其他现有文档的属性。
提取结构化的文字内容。
该项目的目标利用群体要紧为搜索引擎和其他内容索引和分析工具。
编程语言为Java.
5.Javabean
JavaBean是一种JAVA语言写成的可重用组件。
为写成JavaBean,类必需是具体的和公共的,而且具有无参数的。
JavaBean通过提供符合一致性的公共方式将内部域暴露成员属性。
众所周知,属性名称符合这种模式,其他Java类能够通过自身机制发觉和操作这些JavaBean属性。
用户能够利用JavaBean将功能、处置、值、数据库访问和其他任何能够用java代码制造的对象进行打包,而且其他的开发者能够通过内部的JSP页面、Servlet、其他JavaBean、applet或应用来利用这些对象。
用户能够以为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关切任何改变。
6.mysql数据库
MySQL是一个,由瑞典MySQLAB公司开发,目前属于公司。
MySQL是一种关联,关联数据库将数据保留在不同的表中,而不是将所有数据放在一个大仓库内,如此就增加了速度并提高了性。
MySQL的SQL语言是用于访问的最经常使用标准化语言。
MySQL软件采纳了双授权政策(本词条“授权政策”),它分为社区版和商业版,由于其体积小、速度快、整体拥有本钱低,尤其是这一特点,一样中小型网站的开发都选择MySQL作为网站数据库。
由于其社区版的性能卓越,搭配和可组成良好的开发环境。
(图4-4)
MySQL是一个开放源码的小型关联式数据库治理系统,开发者为瑞典MySQLAB公司。
目前MySQL被普遍地应用在Internet上的中小型网站中。
由于其体积小、速度快、整体拥有本钱低,尤其是开放源码这一特点,许多中小型网站为了降低网站整体拥有本钱而选择了MySQL作为网站。
5.详细设计
该部分文档编写负责人
该部分文档复核人
最终版本
重要部份代码展现及说明
1.索引的成立:
publicclassIndexUnit{
privatestaticDirectorydirectory=null;
static{
try{
directory=FSDirectory.open(newFile("E:
/work/Java_web_work/Lucene/index02/"));
}catch(IOExceptione){
e.printStackTrace();
}
}
publicstaticDirectorygetDirectory(){
returndirectory;
}
privatestaticDocumentgeneratorDoc(Filef)throwsIOException{
if(f.isDirectory())returnnull;
Documentdoc=newDocument();
Metadatametadata=newMetadata();
doc.add(newField("content",newTika().parse(newFileInputStream(f),metadata),TermVector.WITH_POSITIONS_OFFSETS));
doc.add(newField("title",FilenameUtils.getBaseName(f.getName()),Field.Store.YES,Field.Index.ANALYZED,TermVector.WITH_POSITIONS_OFFSETS));
doc.add(newField("filename",f.getName(),Field.Store.YES,Field.Index.NOT_ANALYZED));
doc.add(newField("path",f.getAbsolutePath(),Field.Store.YES,Field.Index.NOT_ANALYZED));
doc.add(newField("type",FilenameUtils.getExtension(f.getName()),Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
intpage=0;
try{
page=Integer.parseInt(metadata.get("xmpTPg:
NPages"));
}catch(NumberFormatExceptione){
}
doc.add(newNumericField("page",Field.Store.YES,true).setIntValue(page));
doc.add(newNumericField("date",Field.Store.YES,true).setLongValue(f.lastModified()));
doc.add(newNumericField("size",Field.Store.YES,true).setIntValue((int)(f.length()/1024)));
returndoc;
}
publicstaticvoidindex(booleanhasNew){
IndexWriterwriter=null;
try{
writer=newIndexWriter(directory,newIndexWriterConfig(Version.LUCENE_35,newMMSegAnalyzer()));
if(hasNew==true){
writer.deleteAll();
writer.forceMergeDeletes();
}
Filefile=newFile("E:
/work/Java_web_work/Lucene/Example02/");
Documentdoc=null;
for(Filef:
file.listFiles()){
doc=generatorDoc(f);
if(doc!
=null)
writer.addDocument(doc);
}
}catch(CorruptIndexExceptione){
e.printStackTrace();
}catch(LockObtainFailedExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}finally{
try{
if(writer!
=null)writer.close();
}catch(CorruptIndexExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
}
2.依照索引的搜索:
publicArrayListsearcher(Stringword){
ArrayListresList=newArrayList();
try{
IndexSearchersearcher=newIndexSearcher(IndexReader.open(IndexUnit.getDirectory()));
TermQueryquery=newTermQuery(newTerm("content",word));
TopDocstds=searcher.search(query,260);
for(ScoreDocsd:
tds.scoreDocs){
Documentdoc=searcher.doc(sd.doc);
System.out.println(doc.get("title"));
resList.add(doc.get("title"));
}
searcher.close();
}catch(CorruptIndexExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
returnresList;
}
3.数据库访问类
publicclassDBBean{
Connectioncon=null;
Statementstat=null;
PreparedStatementpstat=null;
ResultSetrs=null;
privatestaticfinalStringDRIVER="com.mysql.jdbc.Driver";//概念驱动字符串
privatestaticfinalStringURL="jdbc:
mysql:
//localhost:
3306/searchmis";//概念URL
privatestaticfinalStringNAME="root";//概念用户名
privatestaticfinalStringPASSWORD="qdhy199148";//概念密码
//无参的构造函数
publicDBBean(){
}
/*
*取得数据库连接
*/
publicConnectiongetCon(){
try{
Class.forName(DRIVER).newInstance();
con=(Connection)DriverManager.getConnection(URL,NAME,PASSWORD);//创建连接
System.out.println("成功创建链接"+con);
}catch(SQLExceptione){
//TODO:
handleexception
e.printStackTrace();
}catch(ClassNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(InstantiationExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IllegalAccessExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
returncon;
}
/*
*执行数据库查询并返回查询结果
*/
publicResultSetquery(Stringsql){
try{
con=getCon();
stat=con.createStatement();
rs=stat.executeQuery(sql);
}catch(Exceptione){
//TODO:
handleexception
e.printStackTrace();
}
returnrs;
}
/*
*执行数据库更新01
*/
publicvoidupdate(Stringsql){
try{
con=getCon();
stat=con.createStatement();
stat.executeUpdate(sql);
}catch(Exceptione){
//TODO:
handleexception
e.printStack