《Spring编程技术与应用》课件16_第1页
《Spring编程技术与应用》课件16_第2页
《Spring编程技术与应用》课件16_第3页
《Spring编程技术与应用》课件16_第4页
《Spring编程技术与应用》课件16_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

16.1.1Tika概述Tika是一个文档语义信息分析工具,用于实现对文档的元信息提取。它可自动识别文档类型,从各类文档中提取元信息,并可对内容进行分析生成文本串.Tika的parse方法接受要被解析的文档,并将分析结果写入元数据集合中。以下为parse方法的最简单形态:publicvoidparse(InputStreamstream,Metadatametadata);16.1.2Lucene索引和搜索概述Lucene提供查询和索引功能

Lucene采用倒排索引结构,以词作为索引的中心,建立词到文档的映射关系。Lucene自带有分词功能,lucene缺省提供了2个比较通用的分析器SimpleAnalyzer和StandardAnalyzer,中文分词则常用IKAnalyzer,最新的版本是IKAnalyzer2012.jar。可将下载的包中的IKAnalyzer.cfg.xml(配置文件)和stopword.dic(停用词典)放在工程的src路径下,将IKAnalyzer2012.jar复制到web工程的WEB-INF/lib目录下。Lucene的数据存储结构都很像数据库的表==>记录==>字段,Lucene索引文件中包含段(segment)、文档(document)、域(field)和项(term)。索引包含多个段,每个段包含多个文档,每个文档又包含多个域,而每个域又包含多个项。搜索时,搜索引擎首先会对搜索的关键词进行解析,然后再在建立好的索引上进行查找,最终返回和用户输入的关键词相关联的文档。16.1.3Lucene软件包分析Lucene软件包是lucene-core-3.1.0.jarorg.apache.lucene.document包:被索引的文档对象的结构管理。提供了所需要的类,比如Document,Field。每一个文档最终被封装成了一个Document对象。org.apache.lucene.analysis包:含语言分析器,也称分词器。用于把句子切分为单个的关键词,支持中文分词。org.apache.lucene.index包:索引管理,主要功能是建立和删除索引。其中有两个基础的类:IndexWriter和IndexReader。IndexWriter是用来创建索引并添加文档到索引中,IndexReader可打开索引,删除索引中的文档等。org.apache.lucene.search包:提供了对索引进行搜索所需要的类。常用的类有IndexSearcher类含有在指定的索引上进行搜索的方法;Hits类用来保存搜索得到的结果;TopDocs类则为首页的搜索结果。org.apache.lucene.queryParser:查询分析器。支持对查询关键词进行逻辑运算。org.apache.lucene.store:数据存储管理,用于实现底层的输入/输出操作。org.apache.lucene.util:含有一些工具类。16.1.4与索引创建相关的APIDocument:用来描述文档的,这里的文档可以是HTML页面,或者是文本文件等。Field:用来描述一个文档的某个属性,如标题和内容用两个Field对象分别描述。Analyzer:在一个文档被索引之前,首先需要对文档内容进行分词处理,该工作由Analyzer完成。Analyzer类是一个抽象类,针对不同的文档类型,它有多个具体实现类。Analyzer把分词后的内容交给IndexWriter进行索引。IndexWriter:是用来创建索引的核心类,它将各个Document对象加到索引中。Directory:代表索引存储位置的一个抽象类,其子类FSDirectory和RAMDirectory分别对应文件系统和内存位置。前者适合于大索引,后者适用于速度相对较快的小索引。16.1.5与内容搜索相关的APIIndexSearcher:是抽象类Searcher的一个常用子类,允许在给定的目录中搜索索引。其Search方法可返回一个根据计算分数排序的文档集合。Lucene在收集结果的过程中将匹配度低的结果自动过滤掉。Term:是搜索的基本单位。它由两部分组成:单词文本和出现该文本的字段名称。Query:是一个用于查询的抽象基类。它将用户输入的查询字符串封装成Lucene能够识别的Query对象。常见子类有:TermQuery、BooleanQuery、PhraseQuery、PrefixQuery、RangeQuery、MultiTermQuery、FilteredQuery等。TopDocs:封装最顶部的若干搜索结果以及ScoreDoc的总数。

16.2创建索引1.文件项的封装设计packagechapter16;publicclassFileItem{ Stringfilename; Stringcontent; Stringtitle;

….//构造方法和各属性的Setter和Getter方法略}2.对指定目录的文档建立索引FileindexDir=newFile("e:\\index2");//索引存储位置AnalyzerTextAnalyzer=newIKAnalyzer();//用IKAnalyzer分词工具IndexWriterConfigfsConfig=newIndexWriterConfig(Version.LUCENE_31, TextAnalyzer);fsConfig.setOpenMode(OpenMode.CREATE);IndexWriterwriter=newIndexWriter(newSimpleFSDirectory(indexDir), fsConfig);//见说明(1)FiledataDir=newFile("f:\\cai\\java");//对该目录下文件建立索引File[]dataFiles=dataDir.listFiles();//所有文件列表

try{ LuceneIndexerExtendedie=newLuceneIndexerExtended(writer, newTika()); for(inti=0;i<dataFiles.length;i++){ Stringfiletype=FileType(dataFiles[i].getName()); System.out.println(dataFiles[i].getName()); Stringallowtype="txt,html,doc,pdf,ppt";//限制要索引文档类型

if(allowtype.indexOf(filetype)!=-1) ie.indexContent(dataFiles[i]);//对各文件建立索引

}对指定文件建索引publicvoidindexContent(Filefile){//对指定文件建索引

Metadatamet=newMetadata(); InputStreamis; try{ is=newFileInputStream(file); tika.parse(is,met);//用Tika分析提取文档的元数据

Documentdocument=newDocument(); document.add(newField("filename",file.getName(),Store.YES, Index.ANALYZED));//文档名称

document.add(newField("title",met.get("title"), Store.YES,Index.NOT_ANALYZED));//文档标题

document.add(newField("content",tika.parseToString(file), Store.YES,Index.ANALYZED));//文档内容

writer.addDocument(document); is.close(); }catch(Exceptione){ } }

16.3建立基于Web的搜索服务publicclassSearcherService{ staticIndexSearchersearcher; staticHighlighterhighlighter; staticAnalyzerme; publicstaticTopDocssearch(StringqueryStr){ TopDocstopDocs=null; try{ FileindexDir=newFile("e:\\index2"); FSDirectorydirectory=FSDirectory.open(indexDir); searcher=newIndexSearcher(directory); me=newIKAnalyzer(); QueryParserm=newQueryParser(Version.LUCENE_31,

"content",me);

QueryluceneQuery; luceneQuery=m.parse(queryStr); Filterfilter=null; //以下创建高亮显示模板

SimpleHTMLFormattershf=newSimpleHTMLFormatter( "<spanstyle=\"color:red\">","</span>"); //以下构造高亮对象

highlighter=newHighlighter(shf,newQueryScorer(luceneQuery)); highlighter.setTextFragmenter(newSimpleFragmenter(200)); topDocs=searcher.search(luceneQuery,filter,50); }catch(IOExceptione){ System.out.println(e); }catch(Exceptione){ System.out.println(e); } returntopDocs; }publicstaticList<FileItem>getPage(TopDocstopDocs,Stringkey,intpage){ List<FileItem>items=newArrayList<FileItem>(); intpageSize=5; try{ intstart=(1)*pageSize; intend=page*pageSize; ScoreDocscoreDoc[]=topDocs.scoreDocs; if(end>topDocs.scoreDocs.length) end=topDocs.scoreDocs.length; for(intindex=start;index<end;index++){ Documentdoc=searcher.doc(scoreDoc[index].doc); Stringtitle=doc.get("title");//文档标题 Stringsummary=highlighter.getBestFragment(me,"content", doc.get("content"));//提取文档摘要,并对搜索词用高亮显示 items.add(newFileItem(doc.get("filename"),summary,title)); } }catch(CorruptIndexExceptione){ }catch(IOExceptione){ }catch(InvalidTokenOffsetsExceptione){ } returnitems;}3.MVC控制器的代码@RequestMapping(value="/index",method=RequestMethod.POST) publicModelAndViewdisp( @RequestParam("keyword")Stringkey){ ModelMapdataModel=newModelMap();TopDocstopDocs=SearcherService.search(key);List<FileItem>items=SearcherService.getPage(topDocs, key,1);dataModel.put("pages",(int)(Math.ceil(topDocs.scoreDocs.length/5.0)));dataModel.put("keyword",key); dataModel.put("result",items); returnnewModelAndView("/result",dataModel); } //分页@RequestMapping(value="/index/{pageid}/{key}",method=RequestMethod.GET) publicModelAndViewdisp(@PathVariable("pageid")Stringpageid, @PathVariable("key")Stringkey){ ModelMapdataModel=newModelMap();try{ key=newString(key.getBytes("ISO-8859-1"),"UTF-8"); }catch(UnsupportedEncodingExceptione){}TopDocstopDocs=SearcherService.search(key);intpage=Integer.parseInt(pageid);List<FileItem>items=SearcherService.getPage(topDocs,key,page);dataModel.put("pages",(int)(Math.ceil(topDocs.scoreDocs.length/5.0)));dataModel.put("keyword",key); dataModel.put("result",items); returnnewModelAndView("/result",dataModel); }4.显示视图<formmethod="POST"action="<%=request.getContextPath()%>/index"><tableborder

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论