昆明理工大学-WEB服务与分布式计算-期末报告-2

上传人:积*** 文档编号:120850700 上传时间:2022-07-18 格式:DOC 页数:25 大小:1,012.50KB
返回 下载 相关 举报
昆明理工大学-WEB服务与分布式计算-期末报告-2_第1页
第1页 / 共25页
昆明理工大学-WEB服务与分布式计算-期末报告-2_第2页
第2页 / 共25页
昆明理工大学-WEB服务与分布式计算-期末报告-2_第3页
第3页 / 共25页
点击查看更多>>
资源描述
课程报告课程名称: WEB 服务与分布计算 设计题目: 基于Lucene全文检索系统 学 院: 信息工程与自动化学院 专 业: 计算机科学与技术 年 级: 级 学生姓名: 邹华宇(10405204) 指引教师: 王红斌 日 期: 6月16日 教 务 处 制 期末考察成果评估评分项目分值得分报告条理清晰,内容详实,体会深刻40报告格式符合规范10程序符合规定40界面美观,功能有扩大10评语:成绩:指引教师签字:评估日期: 年 月 日目 录1需求分析4 1.1系统背景简介4 1.2功能需求分析42 Lucene框架构造分析4 2.1系统功能构造4 2.2系统流程图4 2.3开发及运营环境43Lucene平台搭建44 系统实现105总结121. 需求分析 1.1 系统背景简介Lucene是apache软件基金会4 jakarta项目组的一种子项目,是一种开放源代码的全文检索引擎工具包,即它不是一种完整的全文检索引擎,而是一种全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。Lucene的目的是为软件开发人员提供一种简朴易用的工具包,以以便的在目的系统中实现全文检索的功能,或者是以此为基本建立起完整的全文检索引擎。Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一种简朴却强大的应用程式接口,可以做全文索引和搜寻。在Java开发环境里Lucene是一种成熟的免费开源工具。作为一种全文搜索引擎,lucene具有如下突出长处:(1)索引文献格式独立于应用平台。Lucene定义了一套以8位字节为基本的索引文献格式,使得兼容系统或者不同平台的应用可以共享建立的索引文献。(2)在老式全文检索引擎的倒排索引的基本上,实现了分块索引,可以针对新的文献建立小文献索引,提高索引速度。然后通过与原有索引的合并,达到优化的目的。(3)优秀的面向对象的系统架构,使得对于Lucene扩展的学习难度减少,以便扩大新功能。(4)设计了独立于语言和文献格式的文本分析接口,索引器通过接受Token流完毕索引文献的创立,顾客扩展新的语言和文献格式,只需要实现文本分析的接口。(5)内置一套强大的查询引擎,顾客无需自己编写代码虽然系统可获得强大的查询能力,Lucene的查询实现中默认实现了布尔操作、模糊查询(Fuzzy Search)、分组查询等等。 1.2 功能需求分析本地文献信息检索是获取知识的捷径。掌握文献信息检索措施与技能,可以协助人们快、准、全地获取所需知识,最大限度地节省查找时间,使文献信息得以充足的运用。本程序的开发基于lucene的基本进行开发,在对本地文献进行文献名搜索的同步,可以更精确的辨认文献内容与所搜索核心词的具体有关性。搜索的目的是为了在大量的信息中发现自己感爱好的信息。但是,当有了足够的资料(例如网页、Word文档、Pdf文档,或数据库中的资料等)之后,并不能立即开始搜索,在此之前,必须先对信息建立索引。所谓全文检索的核心就是索引,索引就是指将原始数据解决成一种高效的交叉引用的查找构造以便于迅速的查找。为了迅速搜索大量的文本,你必须一方面索引那个文本然后把它转化为一种可以让你迅速搜索的格式,除去缓慢的顺序地扫描过程。建立索引,就是看待搜索的信息进行一定的分析,并将分析成果按照一定的组织方式存储起来,一般将这些成果存储在文献中。存储分析成果的文献的集合就是索引。在查询时,先从索引中查找,由于索引是按照一定的构造组织的,因此查询的速度非常快。2Lucene框架构造分析 2.1系统功能构造本地搜索程序的实现,需要lucene作为设计核心,lucene只关注文本的索引和搜索,Luncene的架构设计如图:Lucene功能强大,但从主线上说,重要涉及两块:文本内容经切词后索引入库和根据查询条件返回成果。 查询逻辑:查询者输入查询条件,条件之间可以通过特定运算符进行运算,例如查询但愿查询到与“中国”和“北京”有关的记录,但不但愿成果中涉及“海淀区中关村”,于是输入条件为“中国+北京-海淀区中关村”; 查询条件被传达到查询分析器中,分析器将将对“中国+北京-海 淀区中关村”进行分析,一方面分析器解析字符串的连接符,即这里的加号和减号,然后对每个词进行切词,一般最小的词元是两个中文,则中国和北京两个词不必再 切分,但对海淀区中关村需要切分,假设根据切词算法,把该词切分为“海淀区”和“中关村”两部分,则最后得到的查询条件可以表达为:“中国” AND “北京” AND NOT(“海淀区” AND “中关村”)。 查询器根据这个条件遍历索引树,得到查询成果,并返回成果集,返回的成果集类似于JDBC中的ResultSet。将返回的成果集显示在查询成果页面,当点击某一条内容时,可以链接到原始网页,也可以打开全文检索库中存储的网页内容。 入库逻辑 :入 库者定义到库中文档的构造,例如需要把网站内容加载到全文检索库,让顾客通过“站内检索”搜索到有关的网页内容。入库文档构造与关系型数据库中的表构造类 似,每个入库的文档由多种字段构成,假设这里需要入库的网站内容涉及如下字段:文章标题、作者、发布时间、原文链接、正文内容(一般作为网页快照)。涉及N个字段的文档(DOCUMENT)在真正入库前需要通过切词(或分词)索引,切词的规则由语言分析器(ANALYZER)完毕。切分后的“单词”被注册到索引树上,供查询时用,此外也需要把其他不需要索引的内容入库,所有这些是文献操作均由STORAGE完毕。 Lucene倒排索引原理 假设有两篇文章1和2 文章1的内容为:Tom lives in Guangzhou,I live in Guangzhou too. 文章2的内容为:He once lived in Shanghai. 通过度词解决后 文章1的所有核心词为:tom live guangzhou i live guangzhou 文章2的所有核心词为:he live shanghai 加上“浮现频率”和“浮现位置”信息后,我们的索引构造为:非构造化数据中所存储的信息是每个文献涉及哪些字符串,也即已知文献,欲求字符串相对容易,也即是从文献到字符串的映射。而我们想搜索的信息是哪些文献涉及此字符串,也即已知字符串,欲求文献,也即从字符串到文献的映射。两者恰恰相反。于是如果索引总可以保存从字符串到文献的映射,则会大大提高搜索速度。由于从字符串到文献的映射是文献到字符串映射的反向过程,于是保存这种信息的索引称为反向索引。 反向索引的所保存的信息一般如下:假设我的文档集合里面有100篇文档,为了以便表达,我们为文档编号从1到100,得到下面的构造: 左边保存的是一系列字符串,称为词典。每个字符串都指向涉及此字符串的文档(Document)链表,此文档链表称为倒排表(Posting List)。有了索引,便使保存的信息和要搜索的信息一致,可以大大加快搜索的速度。2.2系统流程图2.2.1索引创立(Indexing) 全文检索的索引创立过程一般有如下几步:第一步:某些要索引的原文档(Document)。第二步:将原文档传给分词器(Tokenizer)。 分词器(Tokenizer)会做如下几件事情(此过程称为Tokenize): 1.将文档提成一种一种单独的单词。 2.清除标点符号。 3.清除停词所谓停词就是一种语言中最一般的某些单词,由于没有特别的意义,因而大多数 状况下不能成为搜索的核心词,因而创立索引时,这种词会被去掉而减少索引的大小。 英语中停词(Stop word)如:“the”,“a”,“this”等。对于每一种语言的分词组件(Tokenizer),均有一种停词(stop word)集合通过度词(Tokenizer)后得到的成果称为词元(Token).第三步:将得到的词元(Token)传给语言解决组件(Linguistic Processor)。语言解决组件(linguistic processor)重要是对得到的词元(Token)做某些同语言有关的解决。对于英语,语言解决组件(Linguistic Processor)一般做如下几点:1.变为小写(Lowercase)。2.将单词缩减为词根形式,这种操作称为:stemming.3.将单词转变为词根形式,这种操作称为:lemmatization.Stemming 和 lemmatization的异同:相似之处:Stemming和lemmatization都要使词汇成为词根形式。两者的方式不同:Stemming采用的是“缩减”的方式Lemmatization采用的是“转变”的方式.两者的算法不同:Stemming重要是采用某种固定的算法来做这种缩减Lemmatization重要是采用保存某种字典的方式做这种转变。Stemming和lemmatization不是互斥关系,是有交集的.语言解决组件(linguistic processor)的成果称为词(Term).也正是由于有语言解决的环节,才干使搜索drove,而drive也能被搜索出来。第四步:将得到的词(Term)传给索引组件(Indexer)。索引组件(Indexer)重要做如下几件事情:1. 运用得到的词(Term)创立一种字典。2.对字典按字母顺序进行排序。 2.1.2搜索索引(Search)第一步:顾客输入查询语句。查询语句同我们一般的语言同样,也是有一定语法的。不同的查询语句有不同的语法,如SQL语句就有一定的语法。查询语句的语法根据全文检索系统的实现而不同。最基本的有例如:AND, OR, NOT等。举个例子,顾客输入语句:lucene AND learned NOT hadoop。阐明顾客想找一种涉及lucene和learned然而不涉及hadoop的文档。第二步:对查询语句进行词法分析,语法分析,及语言解决。 1. 词法分析重要用来辨认单词和核心字。如上述例子中,通过词法分析,得到单词有lucene,learned,hadoop, 核心字有AND, NOT。如果在词法分析中发现不合法的核心字,则会浮现错误。如lucene AMD learned,其中由于AND拼错,导致AMD作为一种一般的单词参与查询。2. 语法分析重要是根据查询语句的语法规则来形成一棵语法树。如果发现查询语句不满足语法规则,则会报错。如lucene NOT AND learned,则会出错。3. 语言解决同索引过程中的语言解决几乎相似。第三步:搜索索引,得到符合语法树的文档一方面,在反向索引表中,分别找出涉及lucene,learn,hadoop的文档链表。另一方面,对涉及lucene,learn的链表进行合并操作,得到既涉及lucene又涉及learn的文档链表。然后,将此链表与hadoop的文档链表进行差操作,清除涉及hadoop的文档,从而得到既涉及lucene又涉及learn并且不涉及hadoop的文档链表.此文档链表就是我们要找的文档。第四步:根据得到的文档和查询语句的有关性,对成果进行排序虽然在上一步,我们得到了想要的文档,然而对于查询成果应当按照与查询语句的有关性进行排序,越有关者越靠前 2.3开发及运营环境 本次报告在MyEclipse Professional上搭建luncene平台实现全文检索jdk 使用1.6lucene版本为4.03Lucene平台搭建Lucene的系统由基本构造封装、索引核心、对外接口三大部分构成。其中直接操作索引文献的索引核心又是系统的重点。IndexWriter是在索引过程中的中心组件。 IndexWriter这个类创立一种新的索引并且添加文档到一种已有的索引中。 Directory类代表一种Lucene索引的位置。它是一种抽象类。其中的两个实现类:FSDirectory,它表达一种存储在文献系统中的索引的位置。RAMDirectory,它表达一种存储在内存当中的索引的位置Analyzer 在一种文档被索引之前,一方面需要对文档内容进行分词解决,并且而剔除某些冗余的词句(例如:a,the,they等),这部分工作就是由Analyzer来做的。Document文档类似数据库中的一条记录,可以由好几种字段(Field)构成,并且字段可以套用不同的类型。 一种Field代表与这个文档有关的元数据。元数据如作者、标题、主题、修改日期等等,分别做为文档的字段索引和存储。Field 对象是用来描述一种文档的某个属性的,例如一封电子邮件的标题和内容可以用两个 Field 对象分别描述。 IndexSearcher是用来在建立好的索引上进行搜索的它只能以只读的方式打开一种索引,因此可以有多种IndexSearcher的实例在一种索引上进行操作。第一种,Lucene-core-4.0.0.jar,其中涉及了常用的文档,索引,搜索,存储等有关核心代码。第二个,Lucene-analyzers-common-4.0.0.jar,这里面涉及了多种语言的词法分析器,用于对文献内容进行核心字切分,提取。第三个,Lucene-highlighter-4.0.0.jar,这个jar包重要用于搜索出的内容高亮显示。第四个和第五个,Lucene-queryparser-4.0.0.jar,提供了搜索有关的代码,用于多种搜索,例如模糊搜索,范畴搜索,等等。两个调用office文档的扩展包:4系统实现4.1建立luceneData luceneIndex的地址字符 private static String INDEX_DIR = luceneIndex;private static String DATA_DIR = luceneData;4.2创立索引管理器 public IndexManager getManager() if(indexManager = null) this.indexManager = new IndexManager(); return indexManager;4.3创立目前文献目录的索引 public static boolean createIndex(String path) Date date1 = new Date(); List fileList = getFileList(path); for (File file : fileList) content = ; /获取文献后缀 String type = file.getName().substring(file.getName().lastIndexOf(.)+1); if(txt.equalsIgnoreCase(type) content += txt2String(file); else if(doc.equalsIgnoreCase(type) content += doc2String(file); else if(xls.equalsIgnoreCase(type) content += xls2String(file); else if(html.equalsIgnoreCase(type) content += html2String(file); System.out.println(name :+file.getName(); System.out.println(path :+file.getPath(); System.out.println(); try analyzer = new StandardAnalyzer(Version.LUCENE_CURRENT); directory = FSDirectory.open(new File(INDEX_DIR); File indexFile = new File(INDEX_DIR); if (!indexFile.exists() indexFile.mkdirs(); IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_CURRENT, analyzer); indexWriter = new IndexWriter(directory, config); Document document = new Document(); document.add(new TextField(filename, file.getName(), Store.YES); document.add(new TextField(content, content, Store.YES); document.add(new TextField(path, file.getPath(), Store.YES); indexWriter.addDocument(document); indexWmit(); closeWriter(); catch(Exception e) e.printStackTrace(); content = ; Date date2 = new Date(); System.out.println(创立索引-耗时: + (date2.getTime() - date1.getTime() + msn); return true; 4.4实现代码读取数据文献内容BufferedReader br = new BufferedReader(new FileReader(file); String s = null; while(s = br.readLine()!=null)result = result + n +s; br.close(); catch(Exception e) e.printStackTrace()return result; tryFileInputStream fis = new FileInputStream(file);HWPFDocument doc = new HWPFDocument(fis); Range rang = doc.getRange(); result += rang.text(); fis.close(); catch(Exception e)e.printStackTrace() FileInputStream fis = new FileInputStream(file); StringBuilder sb = new StringBuilder(); jxl.Workbook rwb = Workbook.getWorkbook(fis); Sheet sheet = rwb.getSheets(); for (int i = 0; i sheet.length; i+) Sheet rs = rwb.getSheet(i); for (int j = 0; j rs.getRows(); j+) Cell cells = rs.getRow(j); for(int k=0;kcells.length;k+) sb.append(cellsk.getContents(); fis.close(); 4.5查找索引Date date1 = new Date(); try directory = FSDirectory.open(new File(INDEX_DIR); analyzer = new StandardAnalyzer(Version.LUCENE_CURRENT); DirectoryReader ireader = DirectoryReader.open(directory); IndexSearcher isearcher = new IndexSearcher(ireader); QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, content, analyzer); Query query = parser.parse(text); ScoreDoc hits = isearcher.search(query, null, 1000).scoreDocs; for (int i = 0; i hits.length; i+) Document hitDoc = isearcher.doc(hitsi.doc); System.out.println(_); System.out.println(hitDoc.get(filename); System.out.println(hitDoc.get(content); System.out.println(hitDoc.get(path); System.out.println(_); ireader.close(); directory.close(); catch(Exception e) e.printStackTrace(); Date date2 = new Date(); System.out.println(查看索引-耗时: + (date2.getTime() - date1.getTime() + msn);4.6过滤目录下的文献 File files = new File(dirPath).listFiles(); List fileList = new ArrayList(); for (File file : files) if (isTxtFile(file.getName() fileList.add(file); return fileList;4.7判断与否为目的文献if (fileName.lastIndexOf(.txt) 0) return true; else if (fileName.lastIndexOf(.xls) 0) return true; else if (fileName.lastIndexOf(.doc) 0) return true; else if (fileName.lastIndexOf(.html)0) return true; return false;4.8删除文献目录下的所有文献if(file.isDirectory() File files = file.listFiles(); for(int i=0; ifiles.length; i+) deleteDir(filesi); file.delete();4.9主函数编写 public static void main(String args) File fileIndex = new File(INDEX_DIR); Scanner input=new Scanner(System.in); System.out.print(enter key word:); String key=input.nextLine(); if(deleteDir(fileIndex) fileIndex.mkdir(); else fileIndex.mkdir(); createIndex(DATA_DIR); searchIndex(key);4.10测试截图:全文检索核心词“苹果”全文检索本地数据库:建立索引:检索成果:5总结Lucene是一种高性能、可伸缩的全文检索工具包。可以使用她为应用程序添加索引和搜索能力。Lucene是开源的免费的纯java语言的全文索引检索工具包。使用lucene计算机索引程序通过扫描文章中的每一种词,对每一种词建立一种索引,指明该词在文章中浮现的次数和位置,当顾客查询时,检索程序就根据事先建立的索引进行查找,并将查找的成果反馈给顾客的检索方式。 搜索的目的是为了在大量的信息中发现自己感爱好的信息。但是,当有了足够的资料(例如网页、Word文档、Pdf文档,或数据库中的资料等)之后,并不能立即开始搜索,在此之前,必须先对信息建立索引。就好比在图书馆里寄存着大量书籍,当我们想查找有关某个主题的书籍时,不能一本一本的翻阅,而是要先查阅书籍的索引卡,根据索引卡上的信息找到相应的书籍。因此,当一本书进入到图书馆后,最重要的工作就是要立即建立索引卡。同样,对于我们所拥用的信息,也需要为其建立索引。建立索引,就是看待搜索的信息进行一定的分析,并将分析成果按照一定的组织方式存储起来,一般将这些成果存储在文献中。存储分析成果的文献的集合就是索引。在查询时,先从索引中查找,由于索引是按照一定的构造组织的,因此查询的速度非常快。通过本次报告我对整个lucene的构架有了一定的理解,并且学习了lucene中的构建索引和核心词分析的算法,掌握了在Java环境下运用lucene构架搭建全文检索应用程序的措施和环节。对搜索技术有了更多的结识。
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!