目 录
目 录
1 绪论
1.1 项目背景
1.2 国内外发展现状及分类
1.3 本论文组织结构介绍
2 相关技术介绍
2.1什么是搜索引擎
2.2 sqlserver数据库
2.3 Tomcat服务器
3 搜索引擎的基本原理
3.1搜索引擎的基本组成及其功能
3.2搜索引擎的详细工作流程
4 系统分析与设计
4.1系统分析
4.2系统概要设计
4.2系统实现目标
5 系统详细实现
5.1实现环境配置
5.2功能实现
5.2.1 建立索引
5.2.2 文件搜索实现
5.2.3 数据库的连接配置
5.2.4 数据库搜索实现
5.2.5 后台数据编辑实现
6 系统测试
6.1测试重要性
6.2测试用例
结 论
参 考 文 献
致 谢
1 绪论
环球信息网(World Wide Web),即3W,一般在计算机与信息行业用Web这个词汇来来表示,万维网是它进入中国时所赋予的称呼,其实,这就是一个资料的汇集与存储的空间。
在这个空间中,以事物为单位,一个事物也可以称为一样“资源”,利用URL来标识,统一资源标识符”(URL。这些资源通过超文本传输协议(Hypertext Transfer Protocol,HTP)传送给终端用户,其中给到用户手上的是一个个链接,然后用户通过逐层点击链接,就可以查看到资源,也可以获得到资源。
万维网也常常被人们误以为是因特网的近义词,在这里必须要表明的概念是:万维网与因特网存在着本质的区别。因特网(Internet)是指,把全世界所有的各类型电脑,利用网络连接,所形成的硬件框架,这是一个实实在在的“网”。万维网,其本质是一种功能,即让使用者光看网络页面,而页面之间又交相辉映,从而让使用者觉得这也是一种“网”,但这种网是虚拟的,是不存在的。
可以说1994年在信息时代是一个重大突破的一年,因为万维网(World Wide Web)出现了。在这一改变之前,人们的信息获取方式还是通过各种传统文化传媒,相对于万维网来说是很传统、笨拙的,它在开放性和广泛的可访问性极大的激励了人们创作的积极性。所以万维网的出现极大的缩短了人们信息获取的时间,同时信息的时效性也得到了保障。万维网一出现就收到了全世界各国人的追捧,人们在它出现的十几年的一个时间段中,就在万维网这一平台上发布了几十亿条的网页信息,他的一个数据量是那么的庞大,粗略计算一下,万维网上的网页信息每天都会不断增长几十万。因为网络化、数字化的信息资源,所以网络信息也是有利有弊:利的一面是提高了我们的信息量;不利的一面是庞大的信息一并向我们开来,犹如破堤的江水,汹涌澎湃,造成了我们无所适从。
关于搜索引擎的由来,北美加拿大(Canada)的麦吉尔大学就必须要介绍一下了,早在上世纪,90年代之初,由于网络资源众多,分散性特别大,人们在找资料的时候特别费力。麦吉尔大学的团队也意识到了这个问题,所以他们就研发出了Archie,这是一个可以自动运行的系统,可以完成在FTP上搜集有用资源的作用。该系统定期会自动搜索FTP系统上保存的文档名以及相关的资源,而且还可以自行分析,如果有客户端发出搜索请求,该系统会根据搜索请求的内容,自动提供保存在主机中文件。在以Web网页为对象的搜索引擎系统的大背景下,搜索引擎被人们当做了在网上查找信息的重要手段,通过搜索引擎系统人们可以在浩瀚的网络海洋中第一时间找到自己真正想要的信息,并且搜索引擎的智能以及现在网页的特性使得人们只要输入相关的词语(即关键词)就可以找到相关的信息。
现如今,人们看到的百度、Google取得的显著成效,可以说是成为了行业的领头羊,所以整个世界也都把视觉一部分放置在了搜索引擎这一领域当中,各种各样的搜索服务犹如雨后春笋一般争相冒出。搜索引擎不仅种类愈来愈多,而且其服务的质量也越来越全面,从最初期的国外的Google引擎、Yahoo引擎,到如今的中国的Baidu引擎、360引擎等等。随着web技术的不断完善,网络信息资源也是翻倍增长的(变化关系是成正比的)。所以为了满足用户的需要,既可以快速的找到到资源,而且还可以提高资源的质量,各类型的引擎中,必须引入检索这一概念。此外,在企业级应用的市场上,由于搜索的资源需求量大,要求的精度更加高,全文检索的功能也就被人们重视起来了,例如在各种文件档案的处理过程中、企业管理的软件中。
在这样的环境下,搜索引擎的技术也在迅猛发展。各种讨论搜索引擎的文章、博客、杂志等席卷网络的相关信息。在这个信息化全面进入人们生活各层各面的时代,搜索引擎这项技术无疑会在最热门的技术中占有一席之地。
1.2 国内外发展现状及分类
当今的时代,网络信息呈现指数型上升,其复杂性不言而喻,而网络检索技术的发展却不尽如人意,有很多方面的不足,具体阐述如下:
(1) 随着网页数量的迅猛增加,尽管是专业人员,他对所有的认知也存在不足,同时专业人员的工作量也很大,单凭人工操作,是没有办法对如此庞大的信息量进行有效的分类,更不用说是再加以检索和利用了。网络用户接触的是庞大对的、未经组织的信息,只是使用简单的关键词搜索,它对应的反馈给用户的结果冗余度较大且涵盖有限,这是让用户无法接受的。
(2) 信息实用性评价低迷。有些网站在网页中高频的出现某些关键字,从而轻易的被一些显著的搜索引擎收录,以此来提高该网站的知名度,但实际上它对用户是没有提供任何有价值的信息。
(3) 网络信息变更过快。如今的社会就是一个快节奏的社会,人们更多的喜欢是速食文化,即尽可能快的获取信息,可是分布式的信息布局,就算网络传输速度再快,要想实现实时的搜索难度堪比登天啊,即使是上一秒刷新过的网页,在下一秒就会有无尽的可能,时效性一直是人们追求网络信息的方向,但却很难做到真正的实时。
速度和效率往往是会体现这个搜索引擎是否良好的标准,故此,对于网络信息检索工具而言,其发展的主要方向就是,在信息检索的速度和效率是一步一步不断改进和突破,以提高检索的技术,提供更高的检索服务的质量,改善甚至消除局部网络信息检索的用户不满意之处。
万维网:它是世界上最大的域名注册以及虚拟主机提供商,现在的域名多种多样,不过以www开头的最多,相应的费用也是最贵的,但是,现在还有一批域名不是以www开头,直接二级域名开头,我们在做网站的时候,首先需要购买域名,然后大约根据程序的大小订购服务器,服务器按系统分为linux、window的,按开发语言也可以选择服务器,按代码的上传方式也可以选择服务器,服务器有一定的界面,当然你也可以在linux系统中敲指令来实现,window服务器使用起来比较麻烦,因为你的电脑是window的,然后你要进入另外一台主机中,就会出现只能选择其一的现象,不能同时看到,接着建立站点,设置 ftp,建立数据库,然后上传代码。
本次设计是在Lucene技术之上进行的开发,最终成功的设计出搜索引擎的全过程。从开始本次设计到最终的实现,都会在下述做详细的介绍:
第1章 绪论,本章主要从如下几个方面做了阐述:1、本次设计的系统所会面临的问题;2、怎么处理所面临的难题;3、攻克难题的详细内容;4、本次课题是基于什么样的研究背景、意义而进行;5、本次设计的可行性分析以及论文中各章节内容描述。
第2章 相关技术介绍,对涉及到的理论知识和用到的开发工具做相关阐述。
第3章搜索引擎的基本原理,详细介绍了搜索引擎的基本组成结构和工作原理。
第4章 搜索引擎系统的分析与设计,根据所需要实现的功能入手,一步步的完成设计目标。
第5章 搜索引擎系统的具体设计步骤,分步骤详细地表述了该设计的实现过程以及设计中会遇到的注意事项。
第6章 系统测试,对系统做了相关测试和评价说明。
最后:总结、致谢、参考文献。
3 搜索引擎的基本原理
3.1搜索引擎的基本组成及其功能
图3-1 搜索引擎的基本组成
由上图可知,搜索引擎程序可以化分为搜索器子程序、索引器子程序、检索器子程序以及用户接口子程序等模块;存储器以及存储桶是用来存储所检索到的各种资源的。
搜索引擎程序的组成结构具体如下:
l.搜索器 (Crawler)
搜索器,顾名思义,就是用于在互联网中探索、寻找信息,最终的目的是为了把信息存储在存储单元中的。这种计算机程序,需要日夜不停地处于运行的状态,为的是可以尽可能的更快地搜集更多的新信息,这些信息的种类是多种多样的,包括有HTML格式、XML格式、字处理文档格式以及多媒体信息等等,此外搜索引擎还需要定期更新存储器里的信息。
表3-1搜索引擎程序的组成结构表
搜索器 | 即蜘蛛((Spider)程序,它无时无刻不在运行,主要任务是从因特网上搜集各种的信息资源,然后通过压缩处理等手段,使其占用空间变小,最终存到存储库里,为日候的用户检索做准备。 |
索引器 | 把存储库里的信息提取出来,进行识别与分析,根据结果进行分类,然后再建立索引,并进行简单的排队,把结果放在恰当的硬件存储单元里,也就是上文提到的存储桶。 |
检索器 | 当用户进行查询的时候,检索器会通过判断用户输入的请求,在存储桶中进行查找,将查到的结果,根据匹配度、优先度等指标进行最终的排序,呈现给用户最好的结果。 |
用户接口 | 是用户与搜索引擎进行人机交互的界面,既可以用于输入用户的请求,也可以用来返回查找的结果,供用户选择。 |
如今,互联网已经进入了寻常百姓的家中,人们可以自由的发布信息,导致信息更新的很快,只有定时的更新网络上的信息,才能避免使用者搜索信息时的死连接或者是无效连接。现在我们考虑的搜集信息的策略有两种:
表3-2 搜集信息的策略
为了提高信息的发现以及信息的更新速度, 搜索器的实现方法通常会采用分布式、并行计算技术,这样就可以满足商业搜索引擎每天几百万网页的的信息发现了。
2.索引器(Indexer)
索引器,通过阅读所搜集的信息,并进行整理,将信息中的索引项生成索引表,同时还可以用索引项表示文档。索引项有客观索引项以及内容索引项之分:
表3-3 索引项的分类
为了对文档的内容进行区分,通常会给单索引项赋权值,这样就可以用单索引项进行区分了,而且还可以用来得出查询结果与查询目标的相关度。一般使用的方法有:统计学方法、概率学方法以及信息论法。短语索引项的提取,一般会采用统计学的方法或者是概率学的方法甚至是语言学的方法。
索引表,一般会采用由索引项去查找相对应文档的内容,这就是所谓的倒排表 (InversionList)。当然,索引表还会把索引项在文档中出现的位置也记录在表,目的是为了计算索引项之间的关系,究竟是相邻还是接近。
索引器的算法有两种:集中式、分布式,每一种算法都有优点,但也都有其缺点。当搜索的数据量巨大的时候,为了解决跟上信息量上升迅速的难题,必须采取即时索引 (InstantIndexing)的方式,一个漂亮的索引算法,随着索引器的搜索的数据的提升,其性能的优越性就会展露无遗。索引的质量的高低,有时就会完全决定搜索引擎的有效性。
3.检索器(Searcher)
依照用户的查询请求,搜索索引库并快速的检索出所需的文档,然后比较所查到的文档和查询请求之间的相关度评价。最终,根据相关度的高低,将输出的查询结果进行由高到低的排序,还可以实现用户相关性与搜索引擎之间的反馈机制。
检索器的设计,目前已有四种成熟的模型:
混合的模型、代数的模型、以及概率模型、集合理论模型。
4.用户接口(UserInterface)
搜索引擎,目的是为了让用户进行检索信息,所以必须有用户接口,这样才能实现人机交互,从而才能真正的体现搜索引擎的价值。用户接口就是用来进行,将用户的查询请求输入搜索引擎、显示用户的查询结果、更高级的可以提供用户相关性反馈机制,从而更好地实现搜索引擎,其所提供的信息的准确性、合理性等等。 有了用户接口,不仅方便了用户使用搜索引擎,而且使得用户可以更加的高效率、多方式地得到及时的信息。
用户输入接口我们可以分为两类,一种是简单接口,另外一种就是与之对应的复杂接口。
简单接口,就是最为平常的一种交互界面,使用者只能够输入查询信息,不能进行更加精确地查询,而且也没有反馈的功能;
复杂接口,不仅可以提供输入查询信息的文本框,而且使用者还可以对查询得信息进行限制,减小搜索空间,例如,使用逻辑运算符、使用相近、相邻的关系、域名的范围(如.cn、.com)、出现的位置 (如题目、关键字、作者、时间)、搜索文档的字数等等。中国知网、万方数据库等等,都可以提供上述限制,由于不同的公司所用的限制方式不同,会给用户的使用带来一些不便,当前就有一些公司与机构,正在着手制定查询选项的一系列标准。
3.2搜索引擎的详细工作流程
搜索引擎的详细软件内部构成和具体工作流程说明如下:
图 3-2 搜索引擎的内部构件
搜索引擎的工作原理:当我们在一个表单中输入要搜索的内容时,搜索引擎就会根据我们输入的内容在数据库中进行搜索,首先他会匹配各个网页中的头部信息中的关键字,如果这个网站中有这个关键字的话,就会匹配出来;如果没有的话,搜索引擎就会自动过滤掉。简单直白的说,搜索引擎的工作原理就是对已存在的一个大型数据库内的信息资源进行智能化的筛选过程,并将有效的结果反馈给用户。
在这一个过程中无论是谁家的搜索引擎,无论是百度还是谷歌还是雅虎都会采用自己的算法根据一些指标来进行判断,然后暗战关联度。高低从高到低排序。在这一过程中,需要我们在做网站的时候头部关键字部分还有超链接部分
还有在做完网站之后会引入一个文件以便收录,结合一些SEO技术,一个成功的网站是会在排名前五,而且通过一些合理的页面布局,利用不同的工具,还有超链接的设置要合理,避免垃圾链接无用链接。通过让搜索引擎爬你的网站,从而增加网站的流量,为各大站长带来收益。
我们通常会用好多指令查看某一个网站的浏览人数,但是对于每一个搜索引擎又各有各的算法,在百度适用的不一定在谷歌适用。典型的我们会通过查看看site://www.xxx.com 类型的网站,来了解某一个网站的浏览人数。
4 系统分析与设计
4.1系统分析
经过对搜索引擎的研究同时与Lucene自身的特性相结合,将本次设计所需要实现的功能阐述如下:
- 支持桌面文件搜索,格式包括txt、doc、xls和ppt;
- 支持分词查询
- 支持全文搜索
- 能够高亮显示搜索关键字
- 显示查询所用的时间
- 显示搜索历史、过滤关键字
分词查询与全文搜索这两项功能,我们都可以利用Lucene本身自带的库加上相关算法就可以完成设计了,为了使得关键字的高亮度这一问题得到解决,显然,我们需要利用Highlighter的辅助,通过数据库持久化保存数据。
4.2系统概要设计
在我们进行需求分析的时候,制定的用例以及领域模型都可以直接的带入到设计阶段,我们粗略设计的搜索引擎系统的构架如下:
图4-1 系统总体架构
4.2系统实现目标
希望实现一个可用于海量信息快速搜索的个性化引擎,它应该具有快速、便捷和精确等特性,并且能够一目了然而看到搜索耗时,关键字高亮度显示等等个性化效果。实现时希望不需要高配置的硬件资源以及复杂的环境配置或搭建,幸运的是开源Lucene库给我们提供了可能。
5.1实现环境配置
因为我所选择的搜索引擎是基于Lucene的,所以需要利用Lucene的一些jar包,这样才能借助Lucene完成我们自己想要的搜索功能,并且为了实现分词,我们还需要引用分词组件的相关类库,具体的引用类库如图5-1所示:
图 5-1 Lucene配置
5.2功能实现
5.2.1 建立索引
Lucene对数据的检索是在索引文件中查找的,可能会有人问为什么不直接在数据中检索呢?一个是数据库检索要实现全文检索,实现分词是相当困难的,而且,如果数据量小只有几百几千倒是可以考虑用数据库检索。把数据从数据库里读取出来,写入索引文件的时候是一条一条记录的写入的。
由于Lucene只能替文本这一类型的数据组建索引,所以为了进行其他类型的数据进行检索,只能把其他的格式的数据用文本类型的替换,这样就可以进行索引、搜索了。如果需要对HTML文档进行索引的话,你就首先需要利用文本格式把 HTML文档替换,随后才可以将转化的结果输入 Lucene进行索引与检索,接着就会创建一份索引文件,我们需要把它保存到存储器里面,最终通过判断用户在UI界面输入的查询请求,从建立好的索引文件中查找。
实现代码:
/**
* 为数据库检索数据创建索引
* @param rs
* @throws Exception
*/
private void createIndex(ResultSet rs) throws Exception {
Directory directory = null;
IndexWriter indexWriter = null;
try {
indexFile = new File(searchDir);
if(!indexFile.exists()) {
indexFile.mkdir();
}
directory = FSDirectory.open(indexFile);
analyzer = new IKAnalyzer();
indexWriter = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED);
indexWriter.setMaxBufferedDocs(maxBufferedDocs);
Document doc = null;
while(rs.next()) {
doc = new Document();
Field id = new Field("id", String.valueOf(rs.getInt("id")), Field.Store.YES, Field.Index.NOT_ANALYZED, TermVector.NO);
// Field title = new Field("title", rs.getString("title") == null ? "" : rs.getString("title"), Field.Store.YES,Field.Index.ANALYZED, TermVector.NO);
Field content = new Field("content", rs.getString("content") == null ? "" : rs.getString("content"), Field.Store.YES,Field.Index.ANALYZED, TermVector.NO);
doc.add(id);
doc.add(content);
indexWriter.addDocument(doc);
}
indexWriter.optimize();
indexWriter.close();
} catch(Exception e) {
e.printStackTrace();
}
}
5.2.2 文件搜索实现
文件搜索首先需在设置系统一个搜索文件夹,然后把待搜索的文件放到该文件夹下面,接着输入关键字即可搜索,本系统目前支持搜索的文件格式包括.txt、.doc、.xls和.ppt.
在文件搜索之前需要建立索引,在建立索引的时候对性能影响最大的地方就是在将索引写入文件的时候, 所以在具体应用的时候就需要对此加以控制[4].
在读取文件夹下的文件时,我们是通过FileInputStream对象来完成这一操作的,该对象只需要有一个参数就可以啦,这个参数就是文件的存储路径,如果我们使用FileInputStream来读取文件的话,我们还需要通过利用BufferedReader对象,把文件转换成Buffered的形式存放,最后我们通过IndexSearcher对象来实现文件的搜索:
实现代码:
IndexWriter iwriter = new IndexWriter(directory, analyzer, true,
IndexWriter.MaxFieldLength.LIMITED);
iwriter.setMaxFieldLength(25000);
// Lucene是不可以对除Document文件以外的文件建立索引的,Document只是一个假设文件
while ((a = br.readLine()) != null) {
Document doc = new Document();
doc.add(new Field(fieldName, a, Field.Store.YES,
Field.Index.ANALYZED));
iwriter.addDocument(doc);
}
// Field.Store.YES:为该Field值创建索引
// Field.Index.TOKENIZED:索引Field的值,使它能够被查到
// Field 对象是用来描述一个文档的某个属性的
iwriter.close();
// 索引对象
IndexSearcher isearcher = new IndexSearcher(directory, true);
QueryParser parser = new QueryParser(Version.LUCENE_29, fieldName,analyzer);
图5-2 文件搜索效果图
5.2.3 数据库的连接配置
相关代码:
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String url= "jdbc:sqlserver://localhost:1433; DatabaseName=LuceneDB2";
String username = "qian";
String password = "wqian";
con = DriverManager.getConnection(url, username, password);
5.2.4 数据库搜索实现
本模块解决了数据库快速搜索的问题,这个问题其实与文件搜索的原理一样,第一步都是需要创建索引的,当文档的索引创建好之后,就能够进行搜索的任务了。
相关代码:
// 执行sql语句增删改
public int updateExecute(String sql) {
int result = 0;
try {
Connection con = getConnection();
Statement sta = con.createStatement();
result = sta.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
// 执行sql查询语句 返回一个ResultSet
public ResultSet queryExectue(String sql) {
ResultSet rs = null;
try {
Connection con = getConnection();
Statement sta = con.createStatement();
rs = sta.executeQuery(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
public String executeScalar(String sql) {
ResultSet rs = queryExectue(sql);
String s = "";
try {
while (rs.next()) {
s = rs.getString(1);
}
} catch (SQLException e) {
e.printStackTrace();
}
return s;
}
这个时候,在前端页面上的用户提交一个关键字的查询请求,而后这个请求将会被自动进行分析处理。最终,系统会将用户的查询指令传输到后台中,并且把检索到的信息资源进行返回,前台一般为显示器,会将检索到的信息进行显示:
图5-3 检索结果显示图
5.2.5 后台数据编辑实现
管理员可以点击页面的“登录”链接到管理员登录页面,用户在登录页面输入账号和密码即可登录系统,登录后用户可以看到目前系统所有数据,同时也可以修改或者删除任何一条数据可以通过标题来搜索自己想看的数据,也可以通过添加按钮来添加新的数据:
图5-4 后台登录界面
6 系统测试
6.1测试重要性
该项目是在本地服务器上进行运行和调试,首先是对Java环境的安装及配置,以及对数据库环境的安装与配置,安装完毕后将文件导入根目录,以后才可以在浏览器上进行运行、测试。
在项目开发过程中,会遇到那种错综复杂的问题,所以,测试在软件开发过程中起到了至关重要的作用,它的影响力不比任何开发的环节低,因为软件的开发是一项巨大的工程,不仅耗时,而且开发人员也不可能会预料到所有可能出现的情况,这样就会导致每个时期都难免会产生一系列的错误,而测试人员的主要职责就是,检查与发现程序在运行的程中的错误;一个优异的测试用例,就说明这个测试用例可以有极大地概率找出系统中目前还没有被觉察到的错误;找出目前还没有觉察到的错误,这就是成功的测试的标准。本系统的测试和纠错信息流程如图6.1所示。
图6-1 测试和纠错信息流程图
软件测试,又称为多模块测试,一共有四个阶段:
表6-1 测试阶段的介绍表
单元测试 | 单元测试的用例从单元详细设计中导出。 功能性测试与结构性测试可用于单元测试。 |
集成、确认测试 | 这一阶段的任务,是通过把单元测试中的各个模块按要求整合到一起,通过调试等步骤,获得一套可以满足用户需求的软件。 |
系统测试 | 本阶段中所寻找的错误通常是与目标需求之间存在的差距。通常是属于功能性测试的。 |
图6-2 层次测试的信息流程图
6.2测试用例
通过输入关键字进行查询,然后根据搜索结果判断系统是否存在问题.
例:搜索“在”,反馈结果如图6-2所示:
图6-3 搜索结果图1
可见搜索结果是正确的,并且关键字都已高亮度显示。
结 论
本次设计主要就是通过利用Lucene技术,来实现搜索引擎的设计和实现的过程。其中用到了开源工具有MyEcipse(提供项目运行的Java环境,编写程序空间)、sql server2008(数据库,用户前端展示信息的支撑,是数据的存储地)、tomcat(服务器,用户提交检索请求,由它来进行接收、处理)他们分别管控的自身的部分,同时也相互协调配合,这一功能得以正常运行和实现,是缺一不可的。
本项目是对一个基于Lucene技术的搜索引擎设计与实现的过程,通过开源库Lucene的支持,快速地实现了海量信息的搜索功能,它不仅实现了文件快速查找的功能,而且还实现了全文搜索,还能实现类似百度的分词搜索效果,效果颇佳。同时加入了数据库处理。
该系统可以通过扩展或改造然后适用于站内搜索,这样可以使用户快速的找到自己想浏览的信息,提高用户体验和网站流量。
到此搜索引擎的基本功能都已基本完成,但是还有待改进或加强的地方,例如如果把分词做到最优最人性化,怎样分才是最合理,都需要进一步研究。