《尚学堂科技张志宇luceneppt课件》由会员分享,可在线阅读,更多相关《尚学堂科技张志宇luceneppt课件(96页珍藏版)》请在金锄头文库上搜索。
1、手把手教程V3.0版权所有:尚学堂科技http:/尚学堂尚学堂科技张志宇luceneppt课件Stillwatersrundeep.流静水深流静水深,人静心深人静心深Wherethereislife,thereishope。有生命必有希望。有生命必有希望手把手教程V3.0版权所有:尚学堂科技http:/尚学堂课程内容第一章:第一章:lucene简介简介第二章:入门实例第二章:入门实例第三章:内建第三章:内建Query对象对象第四章:分析器第四章:分析器Analyzer第五章:第五章:QueryParser第六章:索引第六章:索引第七章:排序第七章:排序第八章:过滤第八章:过滤项目实践:构建一个
2、简单的项目实践:构建一个简单的WEB搜索程序搜索程序手把手教程V3.0版权所有:尚学堂科技http:/尚学堂第一章:Lucene简介搜索引擎的历史什么是Lucene全文检索系统的结构全文检索系统的结构为什么使用LuceneLucene倒排索引原理倒排索引原理LuceneImplementations基于Lucene的搜索程序CompassNutch开源搜索引擎列表全球商用搜索市场Heritrix介绍课堂练习:Heritrix简单抓取任务的设置手把手教程V3.0版权所有:尚学堂科技http:/尚学堂搜索引擎的历史萌芽:Archie、Gopher起步:Robot(网络机器人)的出现与Spider(
3、网络爬虫)发展:Excite、Galaxy、Yahoo等繁荣:Infoseek、AltaVista、Google和Baidu手把手教程V3.0版权所有:尚学堂科技http:/尚学堂什么是LuceneLucene是非常优秀的成熟的开源开源的免费免费的纯纯java语言语言的全文索引检索工具包。全文检索全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反询时,检索程序
4、就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。馈给用户的检索方式。Lucene是一个高性能、可伸缩的信息搜索(IR)库。InformationRetrieval(IR)library.它使你可以为你的应用程序添加索引和搜索能力。Lucene的作者DougCutting是资深的全文索引/检索专家,最开始发布在他本人的主页上,2001年10月贡献给APACHE,成为APACHE基金的一个子项目。http:/jakarta.apache.org/lucene/Lucene是一个IR库而不是现成的产品,当然也不是Lucene的初识者常常认为的web爬行器手把手教程V3.0版权所有:
5、尚学堂科技http:/尚学堂全文检索系统的结构全文检索系统的结构.手把手教程V3.0版权所有:尚学堂科技http:/尚学堂为什么使用LuceneLucene作为一个全文检索引擎,其具有如下突出的优点:(1)索引文件格式独立于应用平台索引文件格式独立于应用平台。Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。(2)在传统全文检索引擎的倒排索引倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引的合并,达到优化的目的。(3)优秀的面向对象的系统架构优秀的面向对象的系统架构,使得对于Lucene
6、扩展的学习难度降低,方便扩充新功能。(4)设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展扩展新的语言和文件格式,只需要实现文本分析的接口。(5)已经默认实现了一套强大的查询引擎查询引擎,用户无需自己编写代码即使系统可获得强大的查询能力,Lucene的查询实现中默认实现了布尔操作、模糊查询(FuzzySearch)、分组查询等等。开源,可扩展能力强可扩展能力强,有各种语言版本,适合各种平台,手把手教程V3.0版权所有:尚学堂科技http:/尚学堂Lucene倒排索引原理倒排索引原理假设有两篇文章1和2文章1的内容为:TomlivesinGuang
7、zhou,IliveinGuangzhoutoo.文章2的内容为:HeoncelivedinShanghai.经过分词处理后文章1的所有关键词为:tomliveguangzhouiliveguangzhou文章2的所有关键词为:heliveshanghai加上“出现频率”和“出现位置”信息后,我们的索引结构为:关键词文章号出现频率出现位置guangzhou123,6he211i114live12,212,5,2shanghai213tom111手把手教程V3.0版权所有:尚学堂科技http:/尚学堂Lucene只关注文本的索引和搜索手把手教程V3.0版权所有:尚学堂科技http:/尚学堂Luc
8、eneImplementationsLuceneimplementationsinlanguagesotherthanJava:CLucene-LuceneimplementationinC+dotLucene-Luceneimplementationin.NETLucene4c-LuceneimplementationinCLuceneKit-LuceneimplementationinObjective-C(Cocoa/GNUstepsupport)Lupy-LuceneimplementationinPython(RETIRED)NLucene-anotherLuceneimplemen
9、tationin.NET(outofdate)ZendSearch-LuceneimplementationintheZendFrameworkforPHP5Plucene-LuceneimplementationinPerlKinoSearch-anewLuceneimplementationinPerlPyLucene-GCJ-compiledversionofJavaLuceneintegratedwithPythonMUTIS-LuceneimplementationinDelphiFerret-LuceneimplementationinRuby手把手教程V3.0版权所有:尚学堂科技
10、http:/尚学堂基于Lucene的搜索程序ApplicationsandwebapplicationsusingLuceneinclude(alphabetically):ActiveMath-auseradaptive,interactiveandweb-basedlearningenvironmentformathematicsAdunaAutoFocus-avisualdesktopsearchtoolAdunaMetadataServer-RDF-basedindexingserverformetadataandfulltextAhahi-asearchengine(web,news
11、,image,forum,crawler)AffiliateRanker-anaffiliateprogramsearchengineBigsearch.ca-usesnutch,basedonluceneopensourcesoftwaretodeliveritssearchresults.BibleDesktop-ABiblestudyprogramusinglucenetosearchBiblesBixee-SearchEngineforJobsinIndia.BNCFOpac-OnlinePublicAccessCatalog,indexingdatainunimarcslimform
12、atAustraliaUnclassified-Australias100%FREEonlineclassifiedsserviceCeloxis-webbasedprojectmanagementtoolCodeCrawler-isasmart,web-basedsearchenginespecificallybuiltforusebydevelopersforsearchingsourcecode.Coolposting-asearchenginefordiscussionforums.Coolpostinghelpsyoufindtherealsolutions,experiencesa
13、ndopinionspeoplehavepostedindifferentdiscussionforums.CorinisCCM-awebcontentmanagementandcommunitysystemCvMail-webbasedtoolforrecruiters(tomanagejob-applicationsbymail)http:/wiki.apache.org/jakarta-lucene/PoweredBy手把手教程V3.0版权所有:尚学堂科技http:/尚学堂Compass已加入Opensymphony的Compass是对Lucene搜索引擎在企业应用(数据库应用)中的增强
14、。DataMirror会把数据库的增删改变化实时映射到索引文件中,如果没有Compass,我们一般会在每天深夜重建一次索引Compass对查询的对查询的API也作了一定简化,可以考虑使用也作了一定简化,可以考虑使用将Lucene的索引文件放入数据库或内存。对索引文件根据不同的主题分开subIndex。对XML数据进行映射和索引手把手教程V3.0版权所有:尚学堂科技http:/尚学堂Nutch你能大概给我们讲解一下你能大概给我们讲解一下Nutch吗?以及你将在哪方面运用它?吗?以及你将在哪方面运用它?我还是先说一下Lucene吧。Lucene其实是一个提供全文文本搜索的函数库,它不是一个应用软件
15、。它提供很多API函数让你可以运用到各种实际应用程序中。现在,它已经成为Apache的一个项目并被广泛应用着。这里列出一些已经使用Lucene的系统。Nutch是一个建立在是一个建立在Lucene核心之上的核心之上的Web搜索的实现搜索的实现,它是一个真正的应用程序。也就是说,你可以直接下载下来拿过来用。它在Lucene的基础上加了网络爬虫和一些和Web相关的东东。其目的就是想从一个简单的站内索引和搜索推广到全球网络的搜索上,就像Google和Yahoo一样。当然,和那些巨人竞争,你得动一些脑筋,想一些办法。我们已经测试过100M的网页,并且它的设计用在超过1B的网页上应该没有问题。当然,让它
16、运行在一台机器上,搜索一些服务器,也运行的很好。手把手教程V3.0版权所有:尚学堂科技http:/尚学堂开源搜索引擎列表1EgothorEgothor是一个用Java编写的开源而高效的全文本搜索引擎。借助Java的跨平台特性,Egothor能应用于任何环境的应用,既可配置为单独的搜索引擎,又能用于你的应用作为全文检索之用。NutchNutch是一个开源Java实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬虫。LuceneApacheLucene是一个基于Java全文搜索引擎,利用它可以轻易地为Java软件加入全文搜寻功能。Lucene的最主要工作是替文件的
17、每一个字作索引,索引让搜寻的效率比传统的逐字比较大大提高,Lucen提供一组解读,过滤,分析文件,编排和使用索引的API,它的强大之处除了高效和简单外,是最重要的是使使用者可以随时应自已需要自订其功能。Oxyus是一个纯java写的web搜索引擎。BDDBotBDDBot是一个简单的易于理解和使用的搜索引擎。它目前在一个文本文件(urls.txt)列出的URL中爬行,将结果保存在一个数据库中。它也支持一个简单的Web服务器,这个服务器接受来自浏览器的查询并返回响应结果。它可以方便地集成到你的Web站点中。ZilverlineZilverline是一个搜索引擎,它通过web方式搜索本地硬盘或in
18、tranet上的内容。Zilverline可以从PDF,Word,Excel,Powerpoint,RTF,txt,java,CHM,zip,rar等文档中抓取它们的内容来建立摘要和索引。从本地硬盘或intranet中查找到的结果可重新再进行检索。Zilverline支持多种语言其中包括中文。XQEngineXQEngine用于XML文档的全文本搜索引擎.利用XQuery做为它的前端查询语言.它能够让你查询XML文档集合通过使用关键字的逻辑组合.有点类似于Google与其它搜索引擎搜索HTML文档一样.XQEngine只是一个用Java开发的很紧凑的可嵌入的组件.MG4JMG4J可以让你为大量
19、的文档集合构建一个被压缩的全文本索引,通过使内插编码(interpolativecoding)技术.http:/www.open- ChineseAnalyzer, CJKAnalyzer, CzechAnalyzer,DutchAnalyzer, FrenchAnalyzer, GermanAnalyzer, GreekAnalyzer,KeywordAnalyzer,PatternAnalyzer,PerFieldAnalyzerWrapper,RussianAnalyzer,SimpleAnalyzer,SnowballAnalyzer,StandardAnalyzer,StopAnal
20、yzer,ThaiAnalyzer,WhitespaceAnalyzer针对不同的语言和应用需要选择适合的Analyzer。Analyzer把分词后的内容交给IndexWriter来建立索引。手把手教程V3.0版权所有:尚学堂科技http:/尚学堂Documentorg.apache.lucene.document.DocumentDocument文档类似数据库中的一条记录,可以由好几个字段(Field)组成,并且字段可以套用不同的类型。一个Field代表与这个文档相关的元数据。元数据如作者、标题、主题、修改日期等等,分别做为文档的字段索引和存储。Document的方法:voidadd(Fie
21、ldablefield)添加一个字段(Field)到Document中Stringget(Stringname)从文档中获得一个字段对应的文本doc.add(newField(path,f.getPath(),Field.Store.YES,Field.Index.UN_TOKENIZED);手把手教程V3.0版权所有:尚学堂科技http:/尚学堂Fieldorg.apache.lucene.document.FieldField对象是用来描述一个文档的某个属性的,比如一封电子邮件的标题和内容可对象是用来描述一个文档的某个属性的,比如一封电子邮件的标题和内容可以用两个以用两个Field对象分别
22、描述。对象分别描述。Field(Stringname,bytevalue,Field.Storestore)Createastoredfieldwithbinaryvalue.Field(Stringname,Readerreader)Createatokenizedandindexedfieldthatisnotstored.Field(Stringname,Readerreader,Field.TermVectortermVector)Createatokenizedandindexedfieldthatisnotstored,optionallywithstoringtermvector
23、s.Field(Stringname,Stringvalue,Field.Storestore,Field.Indexindex)Createafieldbyspecifyingitsname,valueandhowitwillbesavedintheindex.Field(Stringname,Stringvalue,Field.Storestore,Field.Indexindex,Field.TermVectortermVector)Createafieldbyspecifyingitsname,valueandhowitwillbesavedintheindex.Field(Strin
24、gname,TokenStreamtokenStream)Createatokenizedandindexedfieldthatisnotstored.Field(Stringname,TokenStreamtokenStream,Field.TermVectortermVector)Createatokenizedandindexedfieldthatisnotstored,optionallywithstoringtermvectors.手把手教程V3.0版权所有:尚学堂科技http:/尚学堂静态内部类Field.Index表示Field的索引方式NO表示该Field不需要索引,也就是用户
25、不需要去查找该Field的值NO_NORMS表示对该Field进行索引,但是不使用Analyzer,同时禁止它参加评分,主要是为了减少内存的消耗TOKENIZED表示该Field先被分词再索引UN_TOKENIZED像链接地址URL、文件系统路径信息、时间日期、人名、居民身份证、电话号码等等通常将被索引并且完整的存储在索引中,但一般不需要切分词Field.Store表示Field的存储方式COMPRESS压缩存储NO原文不存储在索引文件中,搜索结果命中后,再根据其他附加属性如文件的Path,数据库的主键等,重新连接打开原文,适合原文内容较大的情况。YES索引文件本来只存储索引数据,此设计将原文
26、内容直接也存储在索引文件中,如文档的标题。手把手教程V3.0版权所有:尚学堂科技http:/尚学堂创建一个索引的大致过程1.IndexWriterwriter=newIndexWriter(INDEX_DIR,newStandardAnalyzer(),true);2.Documentdoc=newDocument();3.doc.add(newField(*);4.writer.addDocument(doc);5.writer.optimize();/合并索引并优化6.writer.close();手把手教程V3.0版权所有:尚学堂科技http:/尚学堂课堂练习:建立一个索引org.apa
27、che.lucene.demo.html.HTMLParserFilef=newFile(root);FileInputStreamfis=newFileInputStream(f);HTMLParserparser=newHTMLParser(fis);doc.add(newField(contents,parser.getReader();doc.add(newField(summary,parser.getSummary(),Field.Store.YES,Field.Index.NO);doc.add(newField(title,parser.getTitle(),Field.Sto
28、re.YES,Field.Index.TOKENIZED);手把手教程V3.0版权所有:尚学堂科技http:/尚学堂java.lang.OutOfMemoryErrorExceptioninthreadmainjava.lang.OutOfMemoryError:Javaheapspaceatorg.apache.lucene.demo.html.SimpleCharStream.(SimpleCharStream.java:245)atorg.apache.lucene.demo.html.SimpleCharStream.(SimpleCharStream.java:292)atorg.a
29、pache.lucene.demo.html.SimpleCharStream.(SimpleCharStream.java:298)atorg.apache.lucene.demo.html.HTMLParser.(HTMLParser.java:490)atIndexHTML.indexDoc(IndexHTML.java:35)atIndexHTML.indexDocs(IndexHTML.java:30)atIndexHTML.indexDocs(IndexHTML.java:27)atIndexHTML.indexDocs(IndexHTML.java:27)atIndexHTML.
30、indexDocs(IndexHTML.java:27)atIndexHTML.indexDocs(IndexHTML.java:27)atIndexHTML.indexDocs(IndexHTML.java:27)atIndexHTML.indexDocs(IndexHTML.java:27)atIndexHTML.indexDocs(IndexHTML.java:27)atIndexHTML.main(IndexHTML.java:18)-Xmx512m手把手教程V3.0版权所有:尚学堂科技http:/尚学堂理解核心搜索类只需要几个类来执行基本的搜索操作:publicclassIndexS
31、earcherorg.apache.lucene.search.IndexSearcherextendsSearcherpublicfinalclassTermorg.apache.lucene.index.TermpublicabstractclassQueryorg.apache.lucene.search.QuerypublicclassTermQueryorg.apache.lucene.search.TermQueryextendsQuerypublicfinalclassHitsorg.apache.lucene.search.Hits手把手教程V3.0版权所有:尚学堂科技http
32、:/尚学堂IndexSearcherIndexSearcher是用来在建立好的索引上进行搜索的它只能以只读的方式打开一个索引,所以可以有多个IndexSearcher的实例在一个索引上进行操作。它提供几个搜索方法,其中一些在抽象基类Searcher中实现;手把手教程V3.0版权所有:尚学堂科技http:/尚学堂Search方法1返回值为Hits型的对象:publicfinalHitssearch(Queryquery)throwsIOExceptionReturnsthedocumentsmatchingquery.publicHitssearch(Queryquery,Filterfilte
33、r)throwsIOExceptionReturnsthedocumentsmatchingqueryandfilter.publicHitssearch(Queryquery,Sortsort)throwsIOExceptionReturnsdocumentsmatchingquerysortedbysort.publicHitssearch(Queryquery,Filterfilter,Sortsort)throwsIOExceptionReturnsdocumentsmatchingqueryandfilter,sortedbysort.手把手教程V3.0版权所有:尚学堂科技http:
34、/尚学堂Search方法2(Lower-levelsearchAPI.)返回索引中得分较高的文档集合,这些方法中,都带有一个int形式参数,表示取出置于TopDocs集合中的文档数量publicTopDocssearch(Queryquery,Filterfilter,intn)throwsIOExceptionpublicabstractTopDocssearch(Weightweight,Filterfilter,intn)throwsIOExceptionpublicTopFieldDocssearch(Queryquery,Filterfilter,intn,Sortsort)thro
35、wsIOExceptionpublicabstractTopFieldDocssearch(Weightweight,Filterfilter,intn,Sortsort)throwsIOException手把手教程V3.0版权所有:尚学堂科技http:/尚学堂Search方法3(Lower-levelsearchAPI.)publicvoidsearch(Queryquery,Filterfilter,HitCollectorresults)throwsIOExceptionpublicvoidsearch(Queryquery,HitCollectorresults)throwsIOExc
36、eptionpublicabstractvoidsearch(Weightweight,Filterfilter,HitCollectorresults)throwsIOException手把手教程V3.0版权所有:尚学堂科技http:/尚学堂TermTerm是搜索的基本单元搜索的基本单元。一个Term对象有两个String类型的域组成:字段的名称和字段的值。在搜索时,你可能创建Term对象并和TermQuery同时使用。其中第一个参数代表了要在文档的哪一个Field上进行查找,第二个参数代表了要查询的关键词。Queryq=newTermQuery(newTerm(“fieldName”,“q
37、ueryWord”);Hitshits=sercher.search(q);这段代码使Lucene找出在fieldName字段中含有单词queryWord的所有文档。因为TermQuery对象继承自它的抽象父类Query,你可以在等式的左边用Query类型。手把手教程V3.0版权所有:尚学堂科技http:/尚学堂QueryQuery是一个抽象类,这个类的目的是把用户输入的查询字符串封装成Lucene能够识别的Query。Lucene中包含一些Query的具体子类。DirectKnownSubclasses:BooleanQuery,BoostingQuery,ConstantScoreQuer
38、y,ConstantScoreRangeQuery,CustomScoreQuery,DisjunctionMaxQuery,FilteredQuery,FuzzyLikeThisQuery,MatchAllDocsQuery,MoreLikeThisQuery,MultiPhraseQuery,MultiTermQuery,PhraseQuery,PrefixQuery,RangeQuery,SpanQuery,TermQuery,ValueSourceQuery手把手教程V3.0版权所有:尚学堂科技http:/尚学堂TermQueryTermQuery是抽象类Query的一个子类,它同时也
39、是Lucene支持的最为基本的一个查询类。生成一个TermQuery对象由如下语句完成:它的构造函数只接受一个参数,那就是一个Term对象。TermQuerytermQuery=newTermQuery(newTerm(“fieldName”,”queryWord”);手把手教程V3.0版权所有:尚学堂科技http:/尚学堂HitsHits是用来保存搜索的结果的。基于性能考虑,Hits的实例并不从索引中加载所有匹配查询的所有文档,而是每次一小部分。publicfinalintlength()publicfinalDocumentdoc(intn)publicfinalfloatscore(in
40、tn)publicfinalintid(intn)publicIteratoriterator()手把手教程V3.0版权所有:尚学堂科技http:/尚学堂关键词搜索的大致过程最简单的接受单个Query对象做为参数并返回一个Hits对象。这个方法的典型应用类似这样:IndexSearchersercher=newIndexSearcher(INDEX_DIR);Queryq=newTermQuery(newTerm(“contents”,“lucene”);Hitshits=sercher.search(q);for(inti=0;ihits.length();i+)Documentdoc=hi
41、ts.doc(i);Stringsummary=doc.get(“title);手把手教程V3.0版权所有:尚学堂科技http:/尚学堂课堂练习:简单的关键词搜索手把手教程V3.0版权所有:尚学堂科技http:/尚学堂项目实践:构建一个简单的WEB搜索程序手把手教程V3.0版权所有:尚学堂科技http:/尚学堂第三章:内建Query对象手把手教程V3.0版权所有:尚学堂科技http:/尚学堂BooleanQuery布尔搜索BooleanQuery是实际开发过程中经常使用的一种Query。它其实是一个组合的Query,在使用时可以把各种Query对象添加进去并标明它们之间的逻辑关系。Boolea
42、nQuery是可以嵌套的(BooleanQuery是一个布尔子句的容器)一个BooleanQuery可以成为另一个BooleanQuery的条件子句。布尔型Query的子句数目不能超过1024。手把手教程V3.0版权所有:尚学堂科技http:/尚学堂BooleanClause布尔搜索publicvoidadd(Queryquery,BooleanClause.Occuroccur)BooleanClause用于表示布尔查询子句关系的类,包括:BooleanClause.Occur.MUST,BooleanClause.Occur.MUST_NOT,BooleanClause.Occur.SHO
43、ULD。有以下6种组合:1MUST和MUST:取得连个查询子句的交集。2MUST和MUST_NOT:表示查询结果中不能包含MUST_NOT所对应得查询子句的检索结果。3MUST_NOT和MUST_NOT:无意义,检索无结果。4SHOULD与MUST、SHOULD与MUST_NOT:SHOULD与MUST连用时,无意义,结果为MUST子句的检索结果。SHOULD与MUST_NOT连用时,SHOULD功能同MUST,相当于MUST和MUSTNOT的检索结果。5SHOULD与SHOULD:表示“或”关系,最终检索结果为所有检索子句的并集。TestBooleanQuery.java手把手教程V3.0版
44、权所有:尚学堂科技http:/尚学堂RangeQuery范围搜索publicRangeQuery(TermlowerTerm,TermupperTerm,booleaninclusive)布尔型的参数表示是否将2个临界值也加入到搜索中查找所有书号在000001到000005之间的图书,并且不包括000001和000005IndexSearchersearcher=newIndexSearcher(PATH);Termbegin=newTerm(booknumber,000001);Termend=newTerm(booknumber,000005);RangeQueryquery=newRan
45、geQuery(begin,end,false);Hitshits=searcher.search(query);TestRangeQuery.java手把手教程V3.0版权所有:尚学堂科技http:/尚学堂PrefixQuery前缀搜索钢铁是怎样炼成的英雄儿女篱笆女人和狗女人是水做的我的兄弟和女儿白毛女钢的世界钢铁战士钢铁是怎样炼成的钢的世界钢铁战士IndexSearchersearcher=newIndexSearcher(PATH);Termprefix=newTerm(bookname,钢);PrefixQueryquery=newPrefixQuery(prefix);Hitshit
46、s=searcher.search(query);TestPrefixQuery.java手把手教程V3.0版权所有:尚学堂科技http:/尚学堂PhraseQuery短语搜索钢铁是怎样炼成的,钢铁战士,钢和铁是两种金属元素,钢要比铁有更多的碳元素,铁和钢是两种重要的金属,铁钢是两种重要的金属钢铁战士,钢铁是怎样炼成的IndexSearchersearcher=newIndexSearcher(PATH);PhraseQueryquery=newPhraseQuery();query.add(newTerm(bookname,钢);query.add(newTerm(bookname,铁);H
47、itshits=searcher.search(query);可以看出,搜索的结果都是“钢”和“铁”两字相连,而且顺序也一致的文档,即严格包含有“钢铁”这个短语的文档PhraseQuery提供了一种为“坡度”的参数,用于表示词组的两个字之间可以插入无关单字的个数。PublicvoidsetSlop(ints)如果坡度值为1,则钢和铁是两种重要的金属也被搜索出来了TestPhraseQuery.javaTtestMultiPhraseQuery.java手把手教程V3.0版权所有:尚学堂科技http:/尚学堂FuzzyQuery模糊搜索word,work,world,seed,sword,for
48、dworkwork,wordFuzzyQuery(Termterm)CallsFuzzyQuery(term,0.5f,0).FuzzyQuery(Termterm,floatminimumSimilarity)CallsFuzzyQuery(term,minimumSimilarity,0).minimumSimilarity参数代表:最小相似度。默认为0.5。数值越小,文档数量越多。相似度为1时,FuzzyQuery变成了TermQuery。FuzzyQuery(Termterm,floatminimumSimilarity,intprefixLength)prefixLength参数代表
49、:要有多少个前缀字母必须完全其配。TestFuzzyQuery.java手把手教程V3.0版权所有:尚学堂科技http:/尚学堂WildcardQuery通配符搜索*代表0到多个字符,?代表一个单一的字符IndexSearchersearcher=newIndexSearcher(PATH);Termt=newTerm(content,?o*);WildcardQueryquery=newWildcardQuery(t);Hitshits=searcher.search(query);TestWildcardQuery.java手把手教程V3.0版权所有:尚学堂科技http:/尚学堂SpanQ
50、uery跨度搜索跨度搜索Manalwaysrememberlovebecauseofromanceonly每个每个term均有一个位置:均有一个位置:Man是是1,always是是2,remember是是3如果跨度为如果跨度为3,则应该包括,则应该包括Manalwaysremember3个个term。在某种跨度范围内,查找关键词并匹配文档,称为跨度搜索在某种跨度范围内,查找关键词并匹配文档,称为跨度搜索SpanQuery是一个抽象类,实际的搜索功能由它的子类完成。是一个抽象类,实际的搜索功能由它的子类完成。手把手教程V3.0版权所有:尚学堂科技http:/尚学堂_RegexQuery正则表达式
51、搜索涉及涉及2个包:个包:Packageorg.apache.lucene.search.regexPackageorg.apache.regexp注意:注意:/contrib/regex/lucene-regex-2.2.0.jar放入工程。放入工程。jakarta-regexp-1.5.jarhttp:/jakarta.apache.org/site/downloads/downloads_regexp.cgiStringregex=http:/a-z1, FTFTTFTTFFTTFF手把手教程V3.0版权所有:尚学堂科技http:/尚学堂一个简单的Filter共设置3中安全级别,要求将安
52、全级别最高的文档过滤掉SECURITY_ADVANCED=0,SECURITY_MIDDLE1,SECURITY_NORMAL=2,publicclassAdvancedSecurityFilterextendsFilterpublicstaticfinalintSECURITY_ADVANCED=0;/安全级别的常量publicBitSetbits(IndexReaderreader)throwsIOExceptionfinalBitSetbits=newBitSet(reader.maxDoc();/首先初始化一个BitSet对象bits.set(0,bits.size()-1);/先将整
53、个集合置为true,表示当前集合内的所有文档都是可以检索到的.Termterm=newTerm(securitylevel,SECURITY_ADVANCED+);/最高安全级别.TermDocstermDocs=reader.termDocs(term);/从索引中取出最高安全级别的文档while(termDocs.next()bits.set(termDocs.doc(),false);/遍历每一个文档,将相应的set置为falsereturnbits;手把手教程V3.0版权所有:尚学堂科技http:/尚学堂一个简单的Filter的另一种实现方法上一个例子中,使用了IndexReader的
54、较底层的API,还可以在bits方法中进行一次查询,来获得想要的结果.publicclassAdvancedSecurityFilterextendsFilterpublicstaticfinalintSECURITY_ADVANCED=0;/安全级别的常量publicBitSetbits(IndexReaderreader)throwsIOExceptionfinalBitSetbits=newBitSet(reader.maxDoc();/首先初始化一个BitSet对象bits.set(0,bits.size()-1);/先将整个集合置为true,表示当前集合内的所有文档都是可以检索到的.
55、Termterm=newTerm(securitylevel,SECURITY_ADVANCED+);/最高安全级别./初始化一个IndexSearcher对象,/查找securitylevel这个field的值是SECURITY_ADVANCED的文档IndexSearchersearcher=newIndexSearcher(reader);Hitshits=searcher.search(newTermQuery(term);for(inti=0;ihits.length();i+)bits.set(hits.id(i),false);/遍历每一个文档,将相应的set置为falseret
56、urnbits;手把手教程V3.0版权所有:尚学堂科技http:/尚学堂一个简单的Filter:在搜索时应用过滤器org.apache.lucene.search.Searcher提供了在检索中应用Filter的方法publicHitssearch(Queryquery,Filterfilter)publicHitssearch(Queryquery,Filterfilter,Sortsort)Hitshits=searcher.search(q,newAdvancedSecurityFilter();手把手教程V3.0版权所有:尚学堂科技http:/尚学堂内置的过滤器org.apache.l
57、ucene.search.Filter提供了几个内置的过滤器DirectKnownSubclasses:BooleanFilter,CachingWrapperFilter,ChainedFilter,ModifiedEntryFilter,PrefixFilter,QueryWrapperFilter,RangeFilter,RemoteCachingWrapperFilter,TermsFilter手把手教程V3.0版权所有:尚学堂科技http:/尚学堂RangeFilterRangeFilter用于将检索结果限定在某个给定的Field值的范围内publicRangeFilter(Stri
58、ngfieldName,StringlowerTerm,StringupperTerm,booleanincludeLower,booleanincludeUpper)fieldName-field名称lowerTerm范围下界upperTerm范围上届includeLower下届是否包含在范围内includeUpper上届是否包含在范围内RangeFilter提供了静态方法来得到”无上边界/无下边界”的RangeFilter.publicstaticRangeFilterLess(StringfieldName,StringupperTerm)publicstaticRangeFilterM
59、ore(StringfieldName,StringlowerTerm)RangeFilterfilter=newRangeFilter(publishdate,1970-01-01,1990-01-01,true,true);手把手教程V3.0版权所有:尚学堂科技http:/尚学堂QueryFilter结果中查询结果中查询QueryFilter使用很简单使用很简单,其构造函数接受一个其构造函数接受一个Query对象对象,该该Query对象可对象可以看作是前一次查询以看作是前一次查询,只要在本次查询时将所构造的只要在本次查询时将所构造的QueryFilter对象作为对象作为参数传入即可参数传入
60、即可Deprecated.use a CachingWrapperFilter with QueryWrapperFilterTermbegin=newTerm(publishdate,1970-01-01);Termend=newTerm(publishdate,1990-01-01);RangeQueryq=newRangeQuery(begin,end,true);QueryFilterfilter=newQueryFilter(q);Termnormal=newTerm(securitylevel,SECURITY_ADVANCED+);TermQueryquery=newTermQuery(normal);IndexSearchersearcher=newIndexSearcher(PATH);Hitshits=searcher.search(query,filter);