Lucene实现全文检索_第1页
Lucene实现全文检索_第2页
Lucene实现全文检索_第3页
Lucene实现全文检索_第4页
Lucene实现全文检索_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

技术讲座之Lucene实现全文检索2全文检索介绍

索引 分词Lucene介绍Lucene应用详解

索引器 检索器

条件查询 实用工具及高亮器Lucene综合应用——仿 搜索引擎内容要点3什么是全文检索全文检索——是一种最具实用性和通用性的信息检索方式,它将用户的查询请求和全文中的每一个词进行比较,不考虑查询请求与文本语义上的匹配。全文检索的应用领域那是相当的多噢!4全文检索≠like数据库提供了like关键字让我们可以对信息进行模糊查询,但这样的查询结果并不准确。主要问题:

1.结果不准确 例如:like‘%luce%’=>lucene

2.没有相关度排序 3.效率低5全文检索的过程第一步:提取数据。 任何可提取出文本信息的资源都可作为搜索目标。〔如:本地文件系统、网页信息等〕

6全文检索的过程第二步:为数据创立索引。 搜索的目的是为了在大量的信息中发现自己感兴趣的信息。但是在浩渺的信息库中东寻西找,无异于大海捞针。如何才能更方便快捷的定位所需信息呢?

对信息创立索引,能更快找到我想要的7全文检索的过程第三步:分析检索条件,检索索引库,由索引找到所需信息资源。

8Lucene介绍Lucene是一个高性能、可伸缩的信息搜索(IR)库。它使你可以为你的应用程序添加索引和搜索能力。Lucene是用java实现的成熟的、免费的开源工程,是著名的ApacheJakarta大家庭的一员,并且基于在Apache软件许可[ASF,License]。同样,Lucene是当前与近几年内非常流行的免费的Java信息搜索(IR)库。

DougCutting

著名的全文搜索引擎Lucene和Nutch及Hadoop的创始人。

曾任雅虎架构师现就职于CLOUDERA〔优秀云计算效劳提供商〕9Lucene应用详解索引相关对象 Document〔文档〕——创立索引先要确定索引的目标。文本文件的文件名、文件内容、修改时间都可能成为我们创立索引的目标。Lucene提供的Document对象可以作为这些索引目标的集合,每个Document代表了一个文件的所有可索引信息。 //创立一个文档 Documentdoc=newDocument();

10Lucene应用详解索引相关对象 Field〔字段〕——与文档对象Document紧密相连,在Document中的每一个用来创立索引的信息就称为一个字段。Lucene提供了Field对象,并对该对象提供了三种可选的处理方式: 1-是否切词 2-是否索引 3-是否存储 //创立一个字段 Fieldfield=newField(……); doc.add(field);

11Lucene应用详解索引相关对象 Directory〔索引库〕——索引存入的位置。Lucene提供了两种索引存放的位置,一种是磁盘〔FSDirectory〕,一种是内存〔RAMDirectory〕。将索引存入在磁盘上是最正确的方案,但有时出于性能上的考虑也可将索引存入内存中。

//索引库DirectoryindexDir=FSDirectory.open(newFile(INDEXDIR));

12Lucene应用详解索引相关对象 Analyzer〔分析器〕——主要用于分析搜索引擎遇到的各种文本,具体说就是“分词”和“过滤”。 有些词在文本中出现的频率非常高,而且对文本所携带的信息根本不产生影响,如:英文“a、an、the、of”,中文“的、了、着”,以及标点符号等。这些词被称为停用词,经过分词后会被过滤掉,不会进行索引。演示例如:中英文分词13Lucene应用详解索引相关对象 IndexWriter〔索引创立器〕——是Lucene中最重要的类之一,它的功能就是将文档参加索引,同时控制索引过程中的各种参数。

索引文件14Lucene应用详解//1-索引编辑器DirectoryindexDir=FSDirectory.open(newFile(INDEXDIR));IndexWriterwriter=newIndexWriter(indexDir,analyzer,true,MaxFieldLength.LIMITED);//2-索引目标Filefile=newFile(FILENAME);//3-规定索引范围,目标写入Documentdoc=newDocument();doc.add(newField("name",file.getName(),Store.YES,Index.ANALYZED));doc.add(newField("content",IOUtils.readFileContent(file),Store.YES,Index.ANALYZED));doc.add(newField("size",NumericUtils.longToPrefixCoded(file.length()),Store.YES,Index.NOT_ANALYZED));doc.add(newField("path",file.getAbsolutePath(),Store.YES,Index.NOT_ANALYZED));writer.addDocument(doc);//4-优化索引writer.optimize();//5-生成索引writer.close();创立索引演示例如1:创立索引15Lucene应用详解搜索相关操作Query〔查询条件〕——指对于需要查询的字段采用什么样的方式进行查询,如:关键词查询、范围查询、通配符查询、短语查询、组合查询 //可以直接创立Query对象Queryquery=newXXXQuery(……); //也可借助QueryParser产生一个Query对象 QueryParserqueryParser=newQueryParser(); Queryquery=queryParser.parse(……);

16Lucene应用详解搜索相关操作 Searcher〔检索器〕——使用查询条件对索引进行检索 TopDocs〔结果集〕——检索器最终的工作成果

17Lucene应用详解综合查询关键词查询范围查询通配符查询短语查询组合查询

Termterm=newTerm(“name”,“room”);//关键词Queryquery=newTermQuery(term);TermlowerTerm=newTerm("size",NumberTools.longToString(50));TermupperTerm=newTerm("size",NumberTools.longToString(1000));Queryquery=newRangeQuery(lowerTerm,upperTerm,false);Termterm=newTerm("name","roo?");//Termterm=newTerm("name","roo*");Queryquery=newWildcardQuery(term);PhraseQueryphraseQuery=newPhraseQuery();phraseQuery.add(newTerm("content","绅士"));phraseQuery.add(newTerm("content","饭店"));//条件1PhraseQueryquery1=newPhraseQuery();query1.add(newTerm("content","绅士"));query1.add(newTerm("content","饭店"));//条件2TermlowerTerm=newTerm("size",NumberTools.longToString(500));TermupperTerm=newTerm("size",NumberTools.longToString(1000));Queryquery2=newRangeQuery(lowerTerm,upperTerm,true);//组合BooleanQueryboolQuery=newBooleanQuery();boolQuery.add(query1,Occur.MUST);boolQuery.add(query2,Occur.SHOULD);18Lucene应用详解//1-划定检索范围String[]fields=newString[]{"name","content"};QueryParserqueryParser=newMultiFieldQueryParser(Version.LUCENE_29,fields,analyzer);//2-检索关键字Stringkey="Lucene";Queryquery=queryParser.parse(key);//3-检索结果DirectoryindexDir=FSDirectory.open(newFile(INDEXDIR));Searchersearcher=newIndexSearcher(indexDir,true);TopDocstopDocs=searcher.search(query,100);检索信息演示例如2:检索信息19Lucene应用详解实用工具及高亮器 NumericUtils〔数字转化器〕——当索引的目标为数字时,Lucene会以字节文本形式创立索引,如:文件大小。如果直接以数字为检索条件是无法得到正确结果的,所以需要使用转化器进行处理。 如:100=>“@,@” Highlighter〔高亮器〕——为了让检索条件在最终的结果中更加明显,使用高亮器对其显示格式进行处理,以到达醒目。

20Lucene应用详解排序 按相关度排序:关键字所出现的位置不同,决定了文档与此关键字的相关程序也不同。例如:出现在文档标题中的关键字应该比出现在文档内容中的更加重要。

Document.setBoost(flostboost);//给某个文档设置相关度

Field.setBoost(flostboost);//给某个字段设置相关度

*相关度是搜索排名的主要手段。

按指定字段排序:按某字段排序检索结果,让最有价值的信息受到关注。Sortsort=newSort();

sort.setSort(new

SortField("size"));//默认为升序

21Lucene应用详解//过滤——文件大小100bt~2000btFilterfilter=newRangeFilter("size",NumericUtils.longToPrefixCoded(100),NumericUtils.longToPrefixCoded(2000),true,true);//排序——按大小降序Sortsort=newSort();sort.setSort(newSortField("size",SortField.LONG,true));//准备高亮器Formatterformatter=newSimpleHTMLFormatter("<fontcolor='red'><b>","</b></font>");Scorerscorer=newQueryScorer(query);Highlighterhighlighter=newHighlighter(formatter,scorer);Fragmenterfragmenter=newSimpleFragmenter(500);//高亮影响范围highlighter.setTextFragmenter(fragmenter);检索信息2〔高亮器+关注度+指定字段〕演示例如3:检索信息222综合应用——仿“百度”搜索引擎仿“百度”搜索引擎

23综合应用——仿“百度”搜索引擎需求描述:模拟“百度”搜索引擎的检索效果,以JDK5.0中文API为数据源,建立索引。实现对其中的中、英文关键字快速查询及相关网页搜索。实现思路: 获取数据源——JDK5中文版API〔html格式〕 创立索引——对所有html文档创立索引 编写检索程序——对标题、关键字等信息进行检索处理 运行程序——发布工程,使用搜索功能查询所需信息。

24Lucene应用详解仿“百度”搜索引擎——第一步准备数据源25Lucene应用详解/***按数据源和索引地址创立索引**@paramsourcePath*@paramindexPath*/publicvoidbuildIndex(StringsourcePath,StringindexPath){try{//1-索引编辑器DirectoryindexDir=FSDirectory.open(newFile(indexPath));IndexWriterwriter=newIndexWriter(indexDir,analyzer,true,MaxFieldLength.LIMITED);//2-数据源FilesourceDir=newFile(sourcePath);//3-写入文档writeDocument(writer,sourceDir);//4-优化索引writer.optimize();//5-创立索引writer.close();}catch(IOExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}仿“百度”搜索引擎——第二步创立索引业务biz

数据dao

测试test

工具utils

实体entity

控制Servlet

视图Web

26Lucene应用详解publicList<Document>search(StringindexPath,String[]fields,WebPagewebPage,Stringkey){DirectoryindexDir=FSDirectory.open(newFile(indexPath));Searchersearcher=newIndexSearcher(indexDir,true);QueryParserqueryParser=newMultiFieldQueryParser(

温馨提示

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

评论

0/150

提交评论