版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、搜索引擎Lucene第一章Lucene简介Lucene是apache软件基金会 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。第二章lucene索引的建立2.1Lucene的五个基础类索引的建立,Lucene 提供了五个基础类,分别是 Document, Field, IndexWriter,
2、Analyzer, Directory。以下是他们的用途:l DocumentDocument的含义为文档,在Lucene中,它代表一种逻辑文件。Lucene本身无法对物理文件建立索引,而只能识别并处理Document的类型文件。Lucene从Document取出相关的数据源并根据属性配置进行相应的处理。l Field对象是用来描述一个文档的某个属性的lucene中的field也具有一些特定的类型如Field方法/参数类型Tokenized(编译器)Indexed(索引)Store(存储)处理方式与用途Field( String,String,Store.Yes,Index.UN_TOKENI
3、ZED )否是是不分词,但是需要经过建立索引并存储比如;日期Field( String,String,Store. YES,Index.NO )否否是不索引,只存储,比如:文件路径Field( String,String,Store.NO,Index.UN_TOKENIZED )是是否经过倒排建立全文检索,不存储,比如:检索以String方式录入的内容文本Field( String,String,Store.Yes,Index.YES )是是是分词并经过倒排建立索引并存储,比如:标题Field( String,Reader,Store.NO,Index.UN_TOKENIZED )是是否分词并
4、经过倒排建立索引但是不存储,不用于返回显示,比如:检索以reader方式录入的内容文本Field( String,byte,Store.YES)否否是只存储,不索引Field( String,Reader,TermVector)是是否尽力全文索引,不存储在lucene2.0中,Field内部包含两个静态的内部类分别是Store和Index详细的描述了Field的属性,它们分别表示Field的储存方式和索引方式。Store类有3个公有的静态属性:1. Store.NO:表示该Field不需要储存。2. Store.YES:表示该Field需要储存。3. Store.COMPRESS:表示使用压缩
5、方式来保存这个Field的值。Index有4个公有的静态属性:1. Index.NO:表示该Field不需要索引,也就是用户不需要去查找该Field的值。2. Index.TOKENIZED:表示该Field先被分词再被索引。3. Index.UN_ TOKENIZED:表示不对该Field进行分词,但是要对他进行索引,也就是该Field会被用户查找。4. Index.NO_NORMS:表示对该Field进行索引,但是不使用Analyzer,同时禁止它参加评分,主要是为了减少内存的消耗。l Analyzer在一个文档被索引之前,首先需要对文档内容进行分词处理,这部分工作就是由 Analyzer
6、 来做的。Analyzer 类是一个抽象类,它有多个实现。针对不同的语言和应用需要选择适合的 Analyzer。Analyzer 把分词后的内容交给 IndexWriter 来建立索引。l IndexWriterIndexWriter 是 Lucene 用来创建索引的一个核心的类,他的作用是把一个个的 Document 对象加到索引中来。l Directory这个类代表了 Lucene 的索引的存储的位置,这是一个抽象类,它目前有两个实现,第一个是 FSDirectory,它表示一个存储在文件系统中的索引的位置。第二个是 RAMDirectory,它表示一个存储在内存当中的索引的位置。2.2建
7、立索引过程2.2.1IndexWrite的初始化在Lucene中,IndexWrite的主要作用是对索引进行创建,加入Document,合并各种索引段,以及控制与索引相关的各方面,它是Lucene的索引主要操作者。3个公有的构造函数:要获得一个IndexWrite的实例,就需要从它的构造函数入手尝试。具体的构造函数如下:public IndexWrite(String path, Analyzer a, Boolean create)public IndexWrite(File path , Analyzer a, Boolean create)public IndexWrite(Direct
8、ory d, Analyzer a, Boolean create)创建新的segments文件,并写入版本号,修改次数等信息读取原来的segments文件,读出版本号,短信息等Writer对象初始化完毕初始化一个分析器对像,作为参数传入write对象传入建立索引的路径,即用户希望将索引建立的位置为该目录上锁用户希望把该索引目录原来的内容删去吗?第一个参数为索引存放路径,第二个参数Analyzer为分词器,第三个参数是一个Boolean类型的值,这个参数的含义是:在由第一个参数所指定的路径处,删除原目录内的所有内容重新构建索引:或是追加新的Document。2.2.2像索引添加文档IndexW
9、rite准备好以后,就可以想索引目录中添加Document。IndexWrite提供了很简单的接口以供开发人员进行Document的添加:public void addDocument(Document doc)public void addDocument(Document doc,Analyzer analyzer)注意:在使用addDocument方法加入所有的Document后,一定要使用IndexWrite的close方法来关闭索引器,使所有在I/O缓存中的数据都写入到磁盘上,关闭各种流。这样才能最终完成索引的建立。如果没有关闭,就会发现索引目录中内除了一个segment文件外一无所
10、有。很多初学者在刚开始使用Lucene时经常忘记关闭IndexWrite,这样会导致索引的数据滞留在缓存中,未写入磁盘,有可能连目录的锁也没有去除。在下次对同一个目录加入索引文件的时候可能会提示目录处于锁定状态而造成无法加入文件。限制每个Field中词条的数量有必要为Lucene限制每个Field内可以建立索引的词条数。public void setMaxFieldLength(int maxFieldLength)2.3索引过程的优化2.3.1合并因子mergeFactor说明:无论是磁盘上创建新segment还是将segment合并,都需要进行磁盘的I/O操作,相对于内存的操作来说,这种磁
11、盘I/O操作是比较费时的。因此,当mergeFactor取比较小的值时,内存中驻留的文档数量较少,向磁盘写入segment的操作较多,故此时将占用较小的内存,但是索引的建立由于I/O操作频繁所以会比较慢。而当mergeFactor取较大值时,内存中驻留的Document数量较多,向磁盘写入segemnt的操作较少,故此时将占用较多的内存,但索引的建立速度会比较快。maxMergeDocs一个较大的MaxMergeDocs适用于应对大批量的文档索引建立,而增量式的索引则使用较小的MaxMergeDocs。minMergeDocs当索引将被存到磁盘中时,需要首先保存在内存中,minMergeDoc
12、s就是用来限制这个内存中的文档数量的。索引的合并和优化2.3.2 FSDirectory 与RAMDirectory对于lucene来说这两种目录都可以作为索引的存储路径,FSDirectory指的是在文件系统中的一个路径。当lucene向其中写入索引时,会直接将索引写到磁盘上,RAMDirectory是内存中的区域,虽然向其中添加document的过程与使用FSDirectory中的内存写入磁盘,当虚拟机退出后,里面的内容也会随之消失。因此需要将RAMDirectory中的内容转移到FSDirectory中。代码:2.3.3从索引中删除文档索引的读取工具IndexReader删
13、除IndexReader 主要负责对索引的各种读取和维护工作,如打开一个索引、取得索引中的某个文档、获取索引中的总文档的数量,甚至从索引中删除某个文档。生成实例方法IndexReader reader = IndexReader.open( INDEX_STORE_PATH );方法reader.deleteDocument(0);在luncene的内部使用类似回收站的机制来管理Document的删除,在每个Document被索引中删除时,它只相当于被扔进了回收站,并未实际删除。既然是回收站,Lucene提供了undeleteAll()方法实现反删除。真正的实现从一个索引中删除文档需要使用In
14、dexWriter对索引optimize一次,luncene就会重新为每个文档分配ID值,这样那些标记为已删除的Document就真正的被无理删除了。IndexWriter writer = new IndexWriter( INDEX_STORE_PATH,new StandardAnalyzer(),false );Writer.Optimize();使用Field信息来删除批量文档IndexReader的deleteDocuments()方法是一个能批量删除索引的方法,它删除索引是按照词条进行的,也就是说,每个词条都可以用其所在的Field和他的值来表示。2.3.4 Luc
15、ene同步法则开发人员容易忽略掉同步问题,一旦发生这种情况,索引的完整性和数据的一致性就遇到了挑战。 write.lockwrite.lock出现在想索引中添加文档时或将文档从索引中删除时,write.Lock会在IndexWrite初始化时创建,然后在调用IndexWriter的close()方法是被释放。另外,会在Indexreader使用delete方法删除文档时创建,并在调用IndexReader的close()方法是被释放。commit.lockcommit.lock主要是与segment合并和读取操作相关,例如,他出现在IndexWriter初始化时,但
16、是一旦当segment的信息被读取完毕,他会立刻被释放。另外,当调用IndexWriter的addIndexes()或mergeSegments()方法时,都会生成这个锁。2.3.5 Luncene2.0的新类:IndexModifier类IndexModifier,它集成了IndexWriter的大部分功能和IndexReader中对索引的删除功能。第三章Lucene的搜索Lucene里与搜索相关的API多数被包含在org.apache.lucene.search包中。其中最重要的是IndexSearch类。在Lucene中,所有与搜索相关的操作都需要用到这个类。3.1IndexSearch
17、的构造方法public IndexSearch( String path )throws IOExceptionpublic IndexSearch(Directory directory)throws IOExceptionpublic IndexSearch( IndexReader r )3.2IndexSearch最简单的使用代码3.3IndexSearch的多种search方法/search的重载方法void search( Weight weight,Filter filter,HitCollector results )/关闭searcher,同时也关闭了IndexReaderv
18、oid close()throws IOException/计算索引中包含有指定的一个term信息的文档量int docFreq( Term term ) throws IOException/计算索引中包含有指定的一组term信息int docFreq( term terms ) throws IOException/返回索引中最大可能具有document的数量(再加1)int maxDoc()throws IOException/search的重载方法TopDocs search( weight weitght,Filter filter,int n ) throws IOExceptio
19、n/取出索引中id号为i的索引Document docint ithrows IOException;/对查询进行rewrite,使之成为原子查询Query rewrite( Query query ) throws IOException/对查询结果的权重进行翻译Explanation explain( Weight weight,int doc ) throws IOException/Searcha的重载方法TopFiledDocs search(Weight weight, Filter filter,int n,Sort sort ) throws IOException注:l Qu
20、ery:表示一次查询l Hits:表示一次查询的结果l Filter:表示对索引中文档集合的过滤器,它是检索在某一个文档集合的子集中进行l Sort:对索引的结果进行排序的工具l HitCollector:对检索结果进行选择的一个工具,并将选择后的结果保存在其中l Weight:就是”权重”表示一次查询时,索引中的某个文档的重要信息。Hits类详解Hits类可以帮助取得Lucene搜索的结果。并且,在Lucene2.0版本的Hits中,还提供了iterator,可以进行遍历Hits的公共接口/取得当前结果集的数量public final int length()/取得结果集中第n个docume
21、ntpublic final Document doc( int n ) throws IOException/取得当前结果集中第n个Document的得分public final score( int n )throws IOException/取得当前结果集中第n个Document的索引内部的id值public final int id( int n ) throws IOException/取得his集合的遍历对象public Iterator iterator()3.4Lucene内建的Query对象 TermQuery 词条搜索通过对某个固定词条的制定实现检索索引中存在该词条的所有文
22、档 BooleanQuery 布尔搜索布尔查询,由多个子句和子句间的布尔逻辑组成的查询代码Must和must表示取两个查询子句检索结果的交集Must和must_not表示查询的结果中不能包含must_not所对应的查询子句的检索结果Must 最终结果Must_not子句的查询结果must_not和must_not没有实际意义,可以理解为两个子句的检索结果都不要。should与 must 、should与 must_notShould是一个比较特殊的约束。当他与must联用时,它失去意义。检索结果为must子句的检索结果。当它与must_not联用时,should的功能就与must一样,就退变成
23、为must和must_not的查询结果should和 should 表示一种“或”的关系,为所有检索子句的检索结果的并集BooleanQuery 对查询子句是有限制的最大为1024超过这个数量会抛出TooManyClauses异常。但用户也可以通过public static void setMaxClauseCount( int maxClauseCount )改变最大数量 RangeQuery 范围搜索在某些情况下,用户需要查找一定范围内的文档。这种范围可以使时间、日期数字大小等,RangeQuery 就是来帮助用户进行这种查找false表示闭区间true开区间 PrefixQuery 前缀
24、搜索是一种前缀查找,在检索的时候,常常需要进行某种前缀查找。 PhraseQuery 短语搜索允许在在词之间加一个字 MultiPhraseQuery 多短语搜索 FuzzyQuery 模糊搜索 WildcardQuery 通配符搜索 SpanQuery 跨度搜索 RegxQuery 第三方提供的Query对象第四章 排序和过滤4.1使用score进行自然排序相关度排序是一种最简单的排序方式,所谓相关度就是文档的得分用法:说明:图中的排序时按照相关度自高像低排序,也就是说用户检索内容最为相近的排在前面通过改变boost值来改变文档的得分在进行相关度排序的时候,如果想人为的增加某个文档的相关度,
25、使其在搜索结果中排在更靠前的位置上,则可以使用boostdoc.setBoost(2f);4.2Sort排序sort是Lucene自带的一个排序工具,通过它,可以方便的对检索结果进行排序.在使用它时,需要实例化一个sort对象,并使用Searcher提供的search( Query,Sort )接口来实现。4.2.1Sort的构造方法public Sort();/按field进行查询public Sort( String field );/按field进行查询,reverse false升序 true 降序默认fasepublic Sort( String field,Boolean reve
26、rse );/按field数组进行查询public Sort( String fields );public Sort( SortField field );public Sort( SortField fields )4.2.2SortFieldSortField实际上是个包装类型,通过它的包装可以使Sort类清楚地了解进行排序的Field的各种信息构造函数Public SortField( String field )Public SortField( String field,Boolean reverse )Public SortField( String field ,int typ
27、e)Public SortField( String field,int type,Boolean reverse )String 类型的是Field的名称,Boolean升序还是降序,int型的值,用于指定当前Field的值类型 SortField.INT SortField.STRING4.2.3按文档得分进行排序Sort.RELEVANGEHits hits = searcher.search( query, Sort.RELEVANGE )4.2.4按文档的内部id号排序Sort.INDEXORDERHits hits = searcher.search( query, Sort. I
28、NDEXORDER)4.2.5按一个或多个Field来排序Sort sort = new Sort();SortField f1 = new SortField( ”bookNumber”,SortField.INT,false );SortField f2 = new SortField( ”publishdate”,SortField.INT,false );Sort.setSort( new SortFieldf1,f2 )Hits hits = searcher.search( q,sort )4.3搜索的过滤器搜索时过滤器是一种减少搜索范围的方式,即使搜索结果匹配,但是由于文档已经被
29、过滤,所以仍然不会返回给客户,有了这种特性就可以实现很多功能,比如可以用它来实现一种安全机制,既保护某些文档无法被检索到过滤器的基本结构Public abstract BitSet bits( IndexReader reader )throws IOException;BitSets是一种“位集合”队列,这个队列的每个元素都只有两种取值,即true或false,lucene以这种值来代表文档是否被过滤,也就是说,当lucene返回结果时,会先遍历BitSet,仅将那些对应值为true的文档返回。4.3.1RangeFilter 将检索结果限定在某个给定的Field值范围RangeFilte
30、filter = new RangeFilter( “publishdate”,”1970-01-01”,”1990-01-01”,”true”,”true” );Hits hits = search.search( q,filter );4.3.2QueryFilter 在结果中查询当一次检索完毕后,希望能从上一次检索的结果集合中进行二次检索第五章文本分析器5.1空格分词器5.1.1空格解析器(WhitespaceAnalyzer)空格解析器利用空格将文本中的各个单词分割解析出来。这种解析器对带有空格的印欧语系书写方式的文本都能处理 WhitespaceAnalyzer的结构简单。如下所示从
31、图科看出,WhitespaceAnalyzer继承自Analyzer。在继承的方法中创建了一个WhitespaceTokenizer实例。大部分解析的分词功能是由Tokenizer类实现的5.1.2空格分词器(WhitespaceTokenizer)WhitespaceTokenizer继承自抽象类CharTokenizer,WhitespaceTokenizer的next方法也继承自CharTokenizer类5.2标准分词器5.2.1标准解析器标准解析器依靠标准分次器(StandardTokenizer)将输入的文本解析为token流。我们对其内部有特色的属性与方法深入剖析。该解析器特有属
32、性与方法为:属性;停用表(stopwords)停用表中存放的是一些高频率出现的英文单词,中文文字,高频此信息量小会带来索引文件增大方法:tokenStream 方法,TokenStream 的层次结构StopFilterProterStemfilterLowerCaseFilterStandardFilterTokenStreamTokenFilterTokenizerCharTokenizerStandardTokenizerletterTokenizerWhitespaceTokenizerLowerCaseTokenizer 标准过滤 转换为小写字符 去除高频词5.2.2标准分词器(StandTokenizer)标准分次器构造简单,包含的方法复杂。它的主要方法是next方法,这个方法被创建索引的过程调用。5.2.3标准
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025农村回迁房买卖合同(含税费处理)
- 2025年度养猪场养殖环境优化与改造合同3篇
- 二零二五年度借调人员工作培训与职业成长协议3篇
- 二零二五年度教育培训机构教师聘用与教学质量监控合同2篇
- 二零二五年度子女对父母赡养与老年旅游服务合同3篇
- 二零二五年度国际能源资源勘探开发合同3篇
- 2025年度养猪场产业链上下游供应链合作合同3篇
- 二零二五年度企业劳动合同解除与员工离职经济补偿及离职证明协议3篇
- 2025年度口腔医院与医疗器械制造商战略合作合同3篇
- 2025年度美国大学本科预科班入学合同3篇
- 医疗废物转移实施方案
- 工程师个人年终总结
- GB 17353-2024摩托车和轻便摩托车防盗装置
- 学校膳食管理委员会工作制度和职责
- 房租收条格式(3篇)
- 期末试卷(试题)2024-2025学年培智生活语文二年级上册
- 2024伊利在线测评题
- 红色简约中国英雄人物李大钊课件
- 小学师德考评细则
- 软件定义网络(SDN)实战教程课件
- 上海市住院医师规范化培训公共科目考试题库-重点传染病防治知识
评论
0/150
提交评论