基于Lucene的站内新闻搜索引擎的设计与实现.doc

上传人:精*** 文档编号:834778 上传时间:2023-09-07 格式:DOC 页数:24 大小:188.80KB
下载 相关 举报
基于Lucene的站内新闻搜索引擎的设计与实现.doc_第1页
第1页 / 共24页
基于Lucene的站内新闻搜索引擎的设计与实现.doc_第2页
第2页 / 共24页
基于Lucene的站内新闻搜索引擎的设计与实现.doc_第3页
第3页 / 共24页
基于Lucene的站内新闻搜索引擎的设计与实现.doc_第4页
第4页 / 共24页
基于Lucene的站内新闻搜索引擎的设计与实现.doc_第5页
第5页 / 共24页
点击查看更多>>
资源描述

1、基于Lucene的站内新闻搜索引擎的设计与实现摘要Lucene是一个开源的用于制作搜索引擎的框架。目前第二代搜索引擎的设计思路为利用网络爬虫建立数据源,结合分词技术把数据源建成索引,利用索引从海量的数据源中得到搜索结果,对搜索的结果进行筛选和排序, 把最终的结果展示给用户。目前版本的Lucene包括基于JavaCC的标准分词类,建立索引相关类,搜索索引相关类,文档排序和相关性计算相关类等。Lucene良好的架构使得我们可以定义自己的分词类,而Lucene丰富的功能也使得我们能够根据具体的需求,建立自己所需的索引,实现多种多样的搜索方式,进行结果的筛选和排序。本文介绍了搜索引擎的相关知识,分析了

2、Lucene源码,并对搜索引擎的未来进行了展望。本文详细介绍了自己编写的一款在上开发的基于Lucene的新闻搜索引擎,并且通过对实际项目的介绍,阐明了Lucene实现的关键和优缺点,同时还提供了一些与Lucene无关的环节的实现思路。最后对实际项目进行了测试,并分析了测试结果。关键词:Lucene,分词,索引,搜索,排序,相关性,优缺点,搜索引擎,新闻DESIGN ANF IMPLEMENTATION OF NEWS SEARCH ENGINE BASE ON LUCENEABSTRACTLucene is an open source search engine framework for

3、developing. The second generation of search engine design idea is as follows. First, use web crawler to set up a data source. Second, segment and index the data source. Third, get the search result from the index. Fourth, sort and filter the search result. At last, feed back to user. The current Luc

4、ene version contains segment class, index class, search class, sort class and so on. Good framework makes us easy to add our own segment class. The detail implement make us easy to index, search and sort base on the requirement. This article introduces to knowledge of search engine, analysis the sou

5、rce of Lucene and outlook the future of search engine. This article introduces a news search engine base on Lucene on the platform detailed. Through the actual project, I elaborate the key for implement, discuss the advantages and disadvantages for using Lucene, and provide some design idea for impl

6、ement the search engine. At last, I test the actual project, and analysis the result.Key words: Lucene, segment, index, search, sort, correlation, advantage, disadvantage, search engine, news目 录第一章绪论11.1引言11.2Lucene简介1第二章索引的建立32.1概述32.2相关的技术综述32.2.1倒排索引32.3中文分词42.3.1按字索引42.3.2中科院分词42.3.3庖丁解牛42.3.4盘古

7、分词42.3.5Lucene标准分词42.4Lucene索引的建立42.4.1Lucene索引相关类介绍42.4.2Lucene索引结构52.4.3Lucene索引过程52.4.4Lucene索引的合并与优化52.4.5Lucene索引管理5第三章搜索63.1概述63.2Lucene的搜索63.2.1Lucene搜索相关类介绍63.2.2Lucene搜索过程63.2.3Lucene高级搜索63.2.4Lucene搜索系统的分析7第四章结果的筛选和排序84.1概述84.2Lucene筛选84.3Lucene排序84.3.1排序相关技术介绍84.3.2Lucene排序相关类介绍84.3.3Luce

8、ne排序过程84.3.4Lucene排序方式94.3.5Lucene相关性排序94.3.6Lucene排序系统的分析9第五章搜索引擎的未来115.1概述11第六章实现126.1概述126.2索引的创建126.2.1数据源的处理126.2.2索引建立的整体思路126.2.3索引方式的选择136.2.4索引的建立与优化136.3索引的管理136.3.1历史数据索引生成器136.3.2历史数据索引生成辅助工具136.3.3索引管理工具136.3.4索引自动更新服务136.4搜索的实现146.4.1概述146.4.2布尔逻辑的实现146.4.3时间的搜索146.5排序的实现146.5.1按照索引创建的

9、时间排序146.5.2按照相关性排序146.6缓存系统146.7翻页的实现146.8日志维护系统14第七章测试167.1概述167.2索引创建测试167.3索引管理测试167.4搜索速度测试167.5搜索准确度测试16第八章结论17参考文献18致谢19第一章 绪论1.1 引言看完一部电影,意犹未尽,想了解一下电影花絮;买好房子需要装修,但隔行如隔山,在此之前什么都不懂;电脑出了问题,进程中出现了一个怪怪的东西,不知该如何解决。没关系,只要在谷歌,百度上搜索,就算是拔苗助长,却也能解决很多问题。互联网的飞速发展,为我们开创了一个新时代。而要在这浩瀚的互联网世界中寻找自己想要的东西,那就离不开搜索

10、。搜索是为网络而生的。现代意义上的搜索引擎的祖先,是1990午内蒙特利尔入学学生A1an Emtage发明的,名字叫Archie。当时大量的文件散播在各个FTP主机中,人们得到一个资源往往要花费很多时间。因此Alan Emtage发明了一个按文件名查找文件的系统:Archie。而这个系统的工作原理已经和现代的搜索引擎相接近了。真正把搜索引擎引向互联网的是一个叫“机器人”的程序。它不间断高速执行则某项任务,就好像一个“机器人”不断在“互联网”上穿梭,这便是现在意义上的“spider”。世界上的第一个网络爬虫是Matthew Gray开发的World wide web wander。1994年,斯

11、坦福大学的两位博士生杨致远和David Filo共同创办了Yahoo,从此第一代搜索引擎诞生。Yahoo是以网站分类目录为基础的搜索引擎。那时候互联网的数据量还不算太大,Yahoo的编辑们每天把各种各样的网站添加到自己的分类目录中,而网站站长也主动的把自己的网站的更新信息发布给Yahoo。这样Yahoo就把大量的互联网信息整合到自己的搜索引擎中。很长一段时间内,以分类目录为核心思想的搜索引擎占据了大量的市场份额,称为第一代搜索引擎。1997年,Larry Page正式注册了域名,1998年 Larry Page和Sergey Brin以论文的形式介绍了Google,从此互联网搜索进入Googl

12、e时代。Google的成立标志着第二代搜索引擎的诞生。这是一种以网络爬虫,PageRank为标志的搜索引擎。网络爬虫使得互联网上数以亿记的资源联系在一起。PageRank算法到现在的沙盒,有效链接分数综合算法,使得人们可以通过搜索引擎很方便的搜索到自己想要的资源。先如今,搜索引擎蓬勃发展,网络数据量与日俱增,Soso,Bing,Sogou,Iask,Baidu等搜索引擎的日益发展壮大。他们都号称是第三代搜索引擎,虽然严格来说他们和第二代搜索引擎并无区别,但是却各有特点。现在我们正在迎接互联网的新时代,也在迎接搜索引擎的新时代。1.2 Lucene简介最初Lucene是Apache软件基金会Ja

13、karta项目组的子项目,是一个完全开放源码的全文检索工具包。Lucene的原作者是Doug Cutting,他是一位资深全文检索专家,V-Twin搜索引擎的主要开发者。2000年3月Doug Cutting把Lucene转移到SourceForge上,2001年10月献给Apache基金会。Lucene的取名来自Doug Cutting的妻子的名字。Lucene在最初阶段是使用java开发的。然后逐渐被翻译成了多种语言,如C+、C#、Perl等。同时Lucene的各种应用也开始发展起来,如Nutch(一个WebCrawler工具)、Hadoop(一个基于Lucene的分布式计算平台)。它们的

14、出现为Lucene带来了新鲜而且强大的动力。目前Lucene已经发展到了3.0版本。但是由于新版本刚刚发布,稳定性还不是很好,本文还是按照成熟的lucene2.4版本进行介绍。第二章 索引的建立2.1 概述我们首先已经事先建立好了数据源,那么对于建立搜索引擎而言,第二步就是建立索引。索引的目的在于建立一个用户目的信息,与数据源中一个单一数据的对应。具体到文章来说就是需要找到用户所搜索的词与文章的关联。索引的建立主要涉及一下几个问题,什么样的数据要建立索引?以怎样的方式建立索引?什么样的数据需要建立索引呢?这就要分析用户需求了。现阶段用户往往输入一段文字,然后希望找到与这段文字相关的信息。这段文

15、字可以拆分成一个个的字,也可以拆分成一个个的词。无论字词,现在最后这都是我们获取的用户信息,我们要通过这个用户信息查找到相应的数据,那么字词便是需要建立索引的东西。与用户有关的字词,往往出现在文章的标题和文章的正文中,这便是我们需要建立索引的域。把这里边的内容拆成一个个的字词,这些字词就是我们要进行索引的数据。而且用户需要搜索时间,我们就把时间整体索引,用户需要搜索什么,我们就把什么做索引。怎样的方式去建立索引,决定了通过你的索引查找到相关文章的效率,索引的方式很多,我据一种简单的方式,而后结合Lucene在详细的说明建立索引的方式。一种最简单的建立索引的方式就是把字词和一篇文章中出现过这个字

16、词的文档的编号存在一起。这样,当搜索到这个字词的时候,便能得到相应的文档编号,通过文档编号,便可以获取文档的全部信息。索引的建立是开发搜索引擎的关键一步,他关系着你的搜索引擎的搜索效率。2.2 相关的技术综述2.2.1 倒排索引倒排索引是也常被称为反向索引、置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。举一个例子:文本T0“我爱中华人民共和国”文本T1“我爱中国”文本T2“中华人民共和国很伟大”那么反向文件索引为:“我”:0,1“爱”:0,1“中华人民共和国”:0,2“中国”:1“很”:2“伟大”

17、:2这样搜索“我”“中国”的结果就是0,11=12.3 中文分词中文分词是索引建立的关键。因为中文博大精深,不像英语以空格完美分隔词。同样的一句话在不同的语境下意思不同,同样连在一起两个字,在某些情况下它们是一个词,而有些情况下它们就是分别的字或者另一个词的组成部分。例如我马上到,我从马上下来。两个马上很难区分。而且像“高高兴兴”这样的叠词,“去哪儿”这个儿化音词,“吃了顿饭”这种分离词都对使得分词变得极其困难。现在变简单的介绍几种分词方式。2.3.1 按字索引按字分词可以解决所有的问题,使得搜索变的十分准确,因为字是汉字的最小单位,我们只要知道输入的是什么字,字与字之间的位置关系便可以确定整

18、个搜索内容。但是按字分词往往使得索引过大,并且用户往往都是直接输入连在一起的汉字,这样便使得,按字拆分的方法不能很好的猜测用户的意思。2.3.2 中科院分词中科院分词系统是目前使用很广泛的系统。其最大的特点便是保留了大量的分词组合结果,对于每一个结果,通过公司进行计算其相关性,从而从多个分词结果中选出最合适的一个。另一个特点便是他的人名,地名识别系统。虽然在其开源版本上不尽如人意,但是在其共享版的测试中效果还是非常好的。他的缺点是分词数据并不是很快,而且开源版和共享版都有些问题。优点是分词准确。2.3.3 庖丁解牛这个算法只有Java版本,其中的分词算法效率很高,和JavaCC中的词法分析算法

19、有一些类似。这个分词的缺点是有很多分词不准,优点是分词速度很快。2.3.4 盘古分词 这个分词的思想便是匹配,但是其中对于多字的词,这个分词软件设置了很高的优先级,使得分词结果与我们实际想要的结果更加接近。这个分词的优点是完全开源,结构清晰,方便在里边修改源代码,调整权重,并且有一套很好的词典管理工具。缺点就是其内置的词典太过混乱,需要人工修改,并且分词准确性不如中科院分词。2.3.5 Lucene标准分词 这个分词是按照JavaCC实现的。最后的结果是英文完美分词,中文按字拆分。总的来说对英文应用来说是完美的分词。但是对中文分词来说,效率上不够。2.4 Lucene索引的建立2.4.1 Lu

20、cene索引相关类介绍(1) Document Lucene中的逻辑文件,每一个或多个物理文件与一个逻辑文件相对应。Document逻辑文件便是Lucene中数据源。(2) Field代表Document的属性。一个Document由多个Field组成。Field有是否索引,是否储存,是否分词之分。(3) Term词条,每个Field中包含一个或多个词条。(4) IndexWriter写索引相关类 (5) IndexReader读索引相关类2.4.2 Lucene索引结构(1) Segment通常,一个Segment代表Lucene的一个完整索引段,一个索引中会包含多个Segment。(2)

21、.fnm包含了Document中所有Field的名称。(3) .fdt用于储存具有Store.YES属性的Field数据。(4) .fdx用于储存Document在.fdt中的位置。(5) .tis用于储存分词后的词条。(6) .tii标明了每个.tis文件中词条的位置。(7) Deletable储存了要删除的文档。(8) .cfs复合索引格式。2.4.3 Lucene索引过程(1) 初始化IndexWriter。初始化分词器,设置好文件路径。(2) 生成Document。把每个Field添加到Document,区分哪些是要保存的,哪些是要分词的,哪些是要索引的。(3) 写索引。把Docume

22、nt信息写人缓存,然后生成Segment、.fnm、.fdt、.fdx、.tis、.tii、Deletable文件,最后合并为Segment、.cfs、Deletable三个索引文件。(4) 索引的合并与优化。把多个.cfs文件合并为一个,并删除无用信息。2.4.4 Lucene索引的合并与优化索引的合并通过mergeFactor、maxMergeDocs、minMergeDocs因素控制,在批量建立索引时mergeFactor去大值,在少量添加索引时mergeFactor去小值。索引的优化通过IndexWriter的Optimize方法实现。把多个Segment和Deletable进行了合并

23、。2.4.5 Lucene索引管理 Lucene的索引管理通过IndexReader来实现,通过这个类,我们可以通过ID找到相应的文档,通过ID删除文档,对删除的文档进行恢复等操作。索引的建立还是通过IndexWriter。索引的同步则依靠write.lock和commit.lock来实现。通过IndexReader和IndexWriter这两个类就可以很好的管理索引。在具体的项目中会介绍如何有效的管理索引。第三章 搜索3.1 概述搜索是建立一个搜索引擎的第三步,也是根据需求确定内核设计最烦琐的一步。我们在建立搜索是不仅要考虑搜索的数量和范围,更要定义相关的过滤器来过滤搜索结果,最后针对各种需

24、求详细设计自己的搜索逻辑。就目前而言,用户查看的往往只是搜索结果的前几条。过多的搜索会造成不必要的时间浪费。如何建立缓存使得用户快速查找,如何对最终结果进行估计,这些都显得格外重要。搜索结果的过滤是非常必要的,搜索结果包含敏感词,用户给出需求想要限制搜索结果的范围,这些情况下都需要对搜索的结果进行过滤。搜索逻辑是比较烦琐的一块,对于字词的正则表达式的分析,各种域的限制,使得这一块非常容易出错。需要耐心的去修改,去完善。3.2 Lucene的搜索3.2.1 Lucene搜索相关类介绍(1) IndexSearch定义各种搜索的接口。(2) Query用于查询的Lucene字词类。(3) Hits

25、储存搜索结果的类型。(4) QueryParse把字词生成查找对象。3.2.2 Lucene搜索过程(1) 初始化IndexSearch选择相应的Analysis分词器。(2) 初始化Query通过QueryParse把字词转化成一个Query。然后把各种产生的Query合并在一起。(3) 定义Filter初始化Filter,确定过滤的范围。(4) 搜索通过IndexSearch的Search方法,返回Hits,得到结果。3.2.3 Lucene高级搜索(1) TermQuery这是最简单的一种Query, 包括词条本身的内容和词条所在的Field的信息。通过使用TermQuery,你可以进行

26、最简单也是最原始的搜索。(2) BooleanQuery这是布尔搜索。通过BooleanQuery,我们可以实现与、或、非的逻辑操作。只需要在添加的时候指定这个值是必须出现,必须不出现还是应该出现。(3) RangeQuery这是范围搜索。通过这个便可以搜索某个域中一定值范围的数据。(4) PrefixQuery这是前缀搜索。通过这个便可以根据某种前缀查找内容了。(5) PhraseQuery这是短语搜索。通过这个便可以将短语作为一个整体进行搜索了。(6) MultiPhraseQuery这是多短语搜索。通过这个便可以进行多个短语的搜索。(7) FuzzyQuery这是模糊搜索。通过这个便可以

27、帮助用户按照单字进行模糊查找。(8) WidecardQuery这是通配符搜索。通过这个便可以通过一个带有通配符的字符串来进行搜索。(9) SpanQuery这是跨度搜索。这是一个在某个词与词的距离范围内匹配,便返回结果的搜索。(10) 正则表达式Lucene支持正则表达式,用And、Or、Not表示。包含And、Or、Not的字符串会自动按照其表示的正则表达式规则处理。3.2.4 Lucene搜索系统的分析 Lucene虽然实现了这么多的功能,有很多的效率并不高。比如RangeQuery,RangeQuery的工作原理是在最大值和最小值之间依次累加产生一个个的Query(比如要查找1100范

28、围内的匹配,则要产生100个Query).对于产生的每一个Query,去数据源进行搜索。这样的结果就是耗费了大量的时间与内存。而对于使用BooleanQuery完成逻辑搜索,速度也远不如使用TermQuery来的快。而且Lucene是精确搜索,会给出一个精确的搜索结果。这样就使得很多用户查看概率非常小的信息也进行了搜索与记录,大大浪费了搜索引擎的效率。第四章 结果的筛选和排序4.1 概述在搜索出结果之后需要对搜索结果进行筛选和排序了。筛选比较好理解,就是对于一些不需要或者不应该出现的结果进行过滤。在取得的搜索结果上使用过滤或者在搜索之前定义过滤机制都可以很好的完成任务。对于搜索结果的排序一直是

29、搜索引擎的一个难点。Google首先提出的PageRank算法思想是相关性排序的基础。虽然根据不同的需求,可能产生一些按照时间排序的情况出现,但是排序中最重要的还是相关性排序。PageRank的主要思想是对每一个page生成一个值,最终根据这个值进行排序。但是,这样的一个代表相关性的值,却很难找到一个有效的公式。Google基于page引用次数而进行了最初的排序,而后有竞价排名。经历了几年的运行,Google采用了好网站链接的方式在修改它的排序算法。而后更是通过多个数据来定时调整它的排序算法。后来我们又渐渐的发现Google 引入了“沙盒”这个概念来管理新的网站和违规的网站。总之,排序算法因为

30、其商业利益的问题显得尤为重要。就算只是考虑准确性的因素,排序算法也显得尤为重要。如何把更接近用户意思的Page呈递给用户,这将直接影响用户对于这个搜索引擎的体验。4.2 Lucene筛选(1) RangeFilter这是一个过滤一个范围值之内所有搜索结果的过滤器。在某些情况下,使用RangeFilter会比使用RangeQuery快一些。但是在使用RangeFilter之前,就已经遍历过一次索引了,那么这会影响查询的效率。(2) QueryFilter这是一个在上次基础上进行二次检索所使用的过滤器。可以很方便的实现二次检索。4.3 Lucene排序4.3.1 排序相关技术介绍(1) 词频某个关

31、键字在某个文档中出现的次数。(2) 反文档词频在某类文档中出现某个关键字的文档的次数4.3.2 Lucene排序相关类介绍(1) Document其中有个setBoost函数可以用来设置某个域的权重。(2) Sort定义文档排序的方式。4.3.3 Lucene排序过程 Lucene在进行搜索的时候就进行了文章相关性值的计算。在进行搜索时也定义了最终的排序方式。整个排序的过程是结合在搜索过程中的。4.3.4 Lucene排序方式(1) 按照文档创建顺序排序这是Lucene常见的一种排序方式,即先创建索引的排在后边。这样就等于我们通常意义的时间顺序。(2) 按照某个域排序这是Lucene的另一种常

32、见的排序方式。即按照某个域的值,从小到大或者从大到小排序。(3) 按照相关性排序这是Lucene的另一种常见的排序方式。这是按照事先计算好的分数,对文档按照从分数高到分数低的方式排序。(4) 其它排序方式Lucene还支持很多中排序,比如按照文档编号等进行排序,但是由于不常用,这里就不列举了,可参照Lucene源码中的Sort类。4.3.5 Lucene相关性排序文档的得分公式为:总的来说Lucene使用了TF,IDF作为基础因子,长度因素作为辅助因子,并自行添加了一个域调节因子。4.3.6 Lucene排序系统的分析 Lucene的排序系统,就功能上来说是比较齐全的,但是最大的问题就是相关性

33、排序。这样一个简单的相关性排序公司显然无法很好的计算相关性。做好文章的相关性分析需要做到很多。首先,我们需要把文章中的词划分为三类。一类是常用词,比如这,那,很好这之类的。一类是这类文章的专有词,即在这一类文章中经常出现,但在其它文章中不经常出现的词。一类便是普通词。Lucene中“IDF”这个值能够很好的区分常用词,但是对于专有词的区分却完全没体现。试问,对于财经内搜索中“股票”一词的价值和体育内搜索中“股票”一词的价值显然不同。这是其一,另外人们对于搜索结果的前几个往往比较重视,如果能在搜索结果中加入人工干预,便能够针对特殊问题来进行处理。就目前这个公式来看,这个公式能够获得大约85的准确

34、率。而我决定一般意义上要有90的准确率才算合适,最好能达到95。所以目前这个相关性计算的公司还有很大的改进的潜力。第五章 搜索引擎的未来5.1 概述现在是搜索引擎蓬勃发展的时代,另一方面,互联网的日益发展使得互联网的数据量越来越大,现在的搜索引擎上一些结果重复的出现,加上各大公司对于搜索引擎的重视,使得关于第三代搜索引擎的竞争愈加激烈。总体来说,搜索引擎会向几个方向发展,第一,分类与细化。专门的新闻搜索,专门的视频搜索,各个公司集中资金投向一个特有领域还是最现实的。另外,细化之后,搜索引擎的搜索结果,明显好于混合搜索中出现的结果。第二,特有化。我的意思就是建立一些特有的搜索引擎,比如一些直接从

35、关键词到内置结果的链接。这样可以针对一些频繁搜索的关键词,另其转到有人工分析出的应该转到的结果,比如:股票。第三,智能化。智能化才应该是第三代搜索引擎的标志。传统意义上的搜索引擎,只是在搜索的各个阶段有了一定的智能化机制,对于用户的输入和思想进行智能化提示,这样并不算搜索引擎的智能化。要实现智能化,首先需要模拟人在真实网络中的位置与思考方式,我们既然可以想象一个蜘蛛去收集资源,那么我们也可以想象一个小白鼠去寻找奶酪。第三代搜索引擎的建立离不开互联网的建设,只有一个更加有规则的互联网的建立,才能让我们更好的去模拟网络环境。当互联网更新换代的时候,也就是搜索引擎的另一个春天。第六章 实现6.1 概

36、述我设计实现了一个千万页面级别的新闻搜索引擎,主要包括了一个用户检索服务系统,一个索引自动更新服务,一个索引管理工具,一个历史数据索引生成器,一个历史数据索引生成辅助工具。新闻搜索引擎的需求是搜索结果准确,不能存在不符合要求的搜索结果,也不能遗漏搜索结果。另外,新闻搜索引擎还要求与新设计的新闻数据源完美结合,保证能每5分钟更新一次索引,每天进行一次索引优化和合并。要求索引的速度尽量的快,公司并没有给出实际的要求,我按照对于公司原有搜索引擎的测试定出了在1.5秒之内完成搜索的需求。另外,结合公司的现状,自己给出了实现高级搜索和多种排序方式的需求。6.2 索引的创建6.2.1 数据源的处理新闻数据

37、中需要呈现给用户的有以下几个字段,文章的标题,文章的内容,文章的网址链接,文章的创建时间,文件的发布媒体。我们需要处理的原始文件是静态的xml文件。各个xml文件分布在按“年/月日”这样的结构划分的文件夹中。通过判断文件的创建时间变可以快速的定位到相应的文件夹,减少文章查询的数据量。因为索引的创建时间有可能直接影响到排序的结果,那么在创建文件时就需要额外注意遍历文件的顺序。对于数据源的处理,主要进行以下几步:(1) 定义文件的遍历方式。Lucene有一种排序方式为先创建索引的数据排在后边。而结合实际的新闻需求,我们需要按照索引创建的时间对结果进行排序,而且时间距离当前时间越近的文章,越应该排在

38、前边。这样就要求我们先创建时间久远的文章,而后创建时间靠近现在的文章。对于按照“年/月日/具体文件”这样的结果创建的数据,可以直接遍历文件夹,这样就可以使得靠前的时间先索引。(2) 从xml文件中选取创建索引所需要的数据。根据新闻数据所需要的字段,从原xml文件中,我需要提取出其中的content字段,title字段,url字段,media字段,showtime字段,ID字段。ID字段是为了方便快速定位索引位置,方便对索引进行管理。(3) 对取出的数据进行加工。取出的数据,特别是content数据,包含有大量的html相关的内容,比如html标签,html转义字符,JavaScript。按照需

39、求,我并不需要处理JavaScript中的文字,所以直接用正则表达式过滤掉了JavaScript标签及其内容。Html标签对于文章中的文字信息没有什么关系,也直接用正则表达式去除。而对于像>这样的html转义字符,我就把常用的这样的转义全部替换为空格,这样既有利于分词,也不会对文章文字内容产生影响。经过自己亲自在Google,Baidu这些搜索引擎上的测试,这些大型搜索引擎也没有对html转义标签做完整的过滤。6.2.2 索引建立的整体思路由于新闻搜索引擎的数据源有两套(历史数据和近期数据),新闻搜索系统还需要每5分钟更新一次索引,并且需要用户能够随时搜索出结果。所以索引的创建并不容易。

40、索引创建的关键是维持一个原则:那就是时间靠前的新闻先索引。这是为了保证可以按照索引创建的顺序排序,从而保证时间序。这样就要求我们先建立历史数据的索引,再在历史数据的基础上建立近期数据的索引,最后建立一个服务程序,每5分钟检查一下代表当天日期的文件夹中的文件是否有更新,有更新就创建索引。这样便可以维持时间靠前的新闻先索引的原则。为了使得用户总是能搜索数据,为了解决创建索引时的那段真空期。本系统建立了两套索引,这两套索引是完全想同的,当其中一套索引在更新索引时,外部程序把索引源指向另一套数据,供用户搜索。当这一套索引创建完毕后,开始创建另一套索引,同时,外部程序把索引源指向这套索引,供用户搜索。6

41、.2.3 索引方式的选择对于每一个数据源中的字段,我们需要选择一个合适的索引方式,需要设置这个字段是否需要索引,是否需要储存,是否需要分词。显然,所有的字段都需要我们索引和储存。但是需要进行分词的只有title字段和content字段。因为无论media字段,url字段还是showtime字段都是作为一个整体操作的。6.2.4 索引的建立与优化万事俱备之后便可以建立索引,索引建立好了之后便需要对索引进行优化。索引的优化需要花费大量的时间,大约是1个小时左右。所以,索引的优化不能放在白天,这样用户查看的数据便会有1个小时左右的延迟,这是相当严重的。我把索引的优化定在每天的凌晨1点,那时候新闻更新

42、的已经很少了,并且既便是索引优化花费了45个小时,这样也不能影响到第二天用户对于最新数据的浏览。6.3 索引的管理索引的管理包括文件的增加,删除和修改,也包括索引的重建,索引的阶段修复。为了对索引进行系统的管理,我设计了很多的索引管理工具。6.3.1 历史数据索引生成器 这个索引工具的功能是遍历历史数据文件,然后生成索引。历史文件的文件夹结构虽然和最近文件文件夹结构相似,但是历史文件的文件结构却和最近文件的结构相差很大,并且历史文件是html格式,而最近文件是xml格式,所以为了创建历史数据的索引,单独建立了一套索引工具。6.3.2 历史数据索引生成辅助工具这个索引工具是为了单独删除一个历史数

43、据文件而建立的。显然,对于至少一年以前的数据,不会有什么修改和添加,但是对于历史悠久的数据,时间久了就可以删除了,因为完全不会有用。由于历史数据文件结构的特殊性,只有单独创建一个工具来实现。删除历史文件索引通过输入文件的完整路径名来实现。6.3.3 索引管理工具 索引的管理工具是用来维护最近数据的,需要对文件索引进行批量删除,或者需要修改文件,或者需要添加文件,或者是重建当天数据,或者是重建所有最近数据,或者重建某一天之前的数据文件。使用这个工具都可以时间。这个工具有简单的图形界面,可以很好的帮助我们管理索引。6.3.4 索引自动更新服务这个服务是用来自动更新当天的索引和执行每天的优化的。这个

44、服务每5分钟便检查一下存放当天数据的文件夹中是否有新的数据。检查是通过查找文件的ID是否在索引中存在,然后检查文件的最近修改时间是否和上次一致。如果ID存在,但是最近修改时间和上次不一致,则说明是经过修改的文件;如果ID不存在,则说明是新文件。 对于新文件,就添加进入索引;对于修改过的文件,就先删除原文件,然后在添加修改后的文件。这个服务也会在每天的一点启动索引优化,并且通过程序设置用户服务程序所引用的索引数据源。6.4 搜索的实现6.4.1 概述 文中的搜索主要采用BooleanQuery来进行,可以选择按照标题搜索或者按照正文搜索。另外,自己定义了一套布尔逻辑的实现规则。也提供了按照时间搜

45、索的可能性。 另外,我定义了一个高级搜索页面。用户可以选择在一定的时间域搜索,可以选择布尔逻辑搜索,可以选择不同的按标题或者正文搜索,也可以选择按时间排序或者按照相关性排序。6.4.2 布尔逻辑的实现 首先对字符串进行了过滤,字符串中只可以包括,中文,英文,数字,“-”,“(”,“)”和空格,对于其它的字符一律替换成为空格。然后按照空格把字符串分成一个个的子串。对于“-”开头的字符串,添加到BooleanQuery时的添加条件为MUST_NOT,也就是“非”;对于以“(”开头,以“)”结尾的字符串,添加到BooleanQuery时的添加条件为SHOULD,也就是“或”;其余字符串,添加到Boo

46、leanQuery时的添加条件为MUST,也就是“与”。另外,对于每一个子串,我还以“-”,“(”,“)”和空格作为分隔符再次进行分割,对AND,OR,NOT进行了过滤,这样最终便使得Query中只包含中文,英文和数字,而且不包含AND,OR,NOT等Lucene停用字。6.4.3 时间的搜索 对于时间的搜索,我采用Filter来实现,在不给予时间参数的情况下,默认不采用Filter,而当有时间参数的情况下,便采用Filter对搜索结果进行过滤。时间搜索采用了Filter,因为如果用RangeQuery,对于10年的时间跨度的搜索,会产生3650个搜索匹配,搜索效率太低。Filter虽然在原理上与RangeQuery相当,但是在效率上会快一些。界面上让用户最多选择2个月的时间跨度就是基于效率的考虑,而且一般来说新闻的实效性很强,两个月前的数据也没有太大的意义。6.5 排序的实现6.5.1 按照索引创建的时间排序如下的代码段则表示按照创建的时间排序:new Sort(new SortField(null, SortField.DOC, true)6.5.2 按照相关性排序 Lucene的默认排序就是按照相关性排序,无需多余的设置,由于新闻中时间因素尤为重要,在一开始的时候便应该设置showtime这个域的权重值为2.6.6 缓存系统

展开阅读全文
相关资源
相关搜索
资源标签

当前位置:首页 > 学术论文 > 毕业设计

版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1 

陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922