lucene基础学习.docx
《lucene基础学习.docx》由会员分享,可在线阅读,更多相关《lucene基础学习.docx(14页珍藏版)》请在冰豆网上搜索。
![lucene基础学习.docx](https://file1.bdocx.com/fileroot1/2022-11/16/d38a18e6-2dba-45aa-9d70-d213d3eed3b2/d38a18e6-2dba-45aa-9d70-d213d3eed3b21.gif)
lucene基础学习
搜索引擎Lucene
第一章Lucene简介
Lucene是apache软件基金会jakarta项目组的一个子项目,是一个开放源代码[的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。
Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。
第二章lucene索引的建立
2.1Lucene的五个基础类
索引的建立,Lucene提供了五个基础类,分别是Document,Field,IndexWriter,Analyzer,Directory。
以下是他们的用途:
●Document
Document的含义为文档,在Lucene中,它代表一种逻辑文件。
Lucene本身无法对物理文件建立索引,而只能识别并处理Document的类型文件。
Lucene从Document取出相关的数据源并根据属性配置进行相应的处理。
●Field
对象是用来描述一个文档的某个属性的
lucene中的field也具有一些特定的类型如
Field方法/参数类型
Tokenized
(编译器)
Indexed
(索引)
Store
(存储)
处理方式与用途
Field(String,String,
Store.Yes,Index.UN_TOKENIZED)
否
是
是
不分词,但是需要经过建立索引并存储比如;日期
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)
是
是
否
分词并经过倒排建立索引但是不存储,不用于返回显示,比如:
检索以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:
表示使用压缩方式来保存这个Field的值。
Index有4个公有的静态属性:
1.Index.NO:
表示该Field不需要索引,也就是用户不需要去查找该Field的值。
2.Index.TOKENIZED:
表示该Field先被分词再被索引。
3.Index.UN_TOKENIZED:
表示不对该Field进行分词,但是要对他进行索引,也就是该Field会被用户查找。
4.Index.NO_NORMS:
表示对该Field进行索引,但是不使用Analyzer,同时禁止它参加评分,主要是为了减少内存的消耗。
●Analyzer
在一个文档被索引之前,首先需要对文档内容进行分词处理,这部分工作就是由Analyzer来做的。
Analyzer类是一个抽象类,它有多个实现。
针对不同的语言和应用需要选择适合的Analyzer。
Analyzer把分词后的内容交给IndexWriter来建立索引。
●IndexWriter
IndexWriter是Lucene用来创建索引的一个核心的类,他的作用是把一个个的Document对象加到索引中来。
●Directory
这个类代表了Lucene的索引的存储的位置,这是一个抽象类,它目前有两个实现,第一个是FSDirectory,它表示一个存储在文件系统中的索引的位置。
第二个是RAMDirectory,它表示一个存储在内存当中的索引的位置。
2.2建立索引过程
2.2.1IndexWrite的初始化
在Lucene中,IndexWrite的主要作用是对索引进行创建,加入Document,合并各种索引段,以及控制与索引相关的各方面,它是Lucene的索引主要操作者。
3个公有的构造函数:
要获得一个IndexWrite的实例,就需要从它的构造函数入手尝试。
具体的构造函数如下:
publicIndexWrite(Stringpath,Analyzera,Booleancreate)
publicIndexWrite(Filepath,Analyzera,Booleancreate)
publicIndexWrite(Directoryd,Analyzera,Booleancreate)
第一个参数为索引存放路径,第二个参数Analyzer为分词器,第三个参数是一个Boolean类型的值,这个参数的含义是:
在由第一个参数所指定的路径处,删除原目录内的所有内容重新构建索引:
或是追加新的Document。
2.2.2像索引添加文档
IndexWrite准备好以后,就可以想索引目录中添加Document。
IndexWrite提供了很简单的接口以供开发人员进行Document的添加:
publicvoidaddDocument(Documentdoc)
publicvoidaddDocument(Documentdoc,Analyzeranalyzer)
注意:
在使用addDocument方法加入所有的Document后,一定要使用IndexWrite的close方法来关闭索引器,使所有在I/O缓存中的数据都写入到磁盘上,关闭各种流。
这样才能最终完成索引的建立。
如果没有关闭,就会发现索引目录中内除了一个segment文件外一无所有。
很多初学者在刚开始使用Lucene时经常忘记关闭IndexWrite,这样会导致索引的数据滞留在缓存中,未写入磁盘,有可能连目录的锁也没有去除。
在下次对同一个目录加入索引文件的时候可能会提示目录处于锁定状态而造成无法加入文件。
限制每个Field中词条的数量
有必要为Lucene限制每个Field内可以建立索引的词条数。
publicvoidsetMaxFieldLength(intmaxFieldLength)
2.3索引过程的优化
2.3.1合并因子mergeFactor
说明:
无论是磁盘上创建新segment还是将segment合并,都需要进行磁盘的I/O操作,相对于内存的操作来说,这种磁盘I/O操作是比较费时的。
因此,当mergeFactor取比较小的值时,内存中驻留的文档数量较少,向磁盘写入segment的操作较多,故此时将占用较小的内存,但是索引的建立由于I/O操作频繁所以会比较慢。
而当mergeFactor取较大值时,内存中驻留的Document数量较多,向磁盘写入segemnt的操作较少,故此时将占用较多的内存,但索引的建立速度会比较快。
maxMergeDocs
一个较大的MaxMergeDocs适用于应对大批量的文档索引建立,而增量式的索引则使用较小的MaxMergeDocs。
minMergeDocs
当索引将被存到磁盘中时,需要首先保存在内存中,minMergeDocs就是用来限制这个内存中的文档数量的。
索引的合并和优化
2.3.2FSDirectory与RAMDirectory
对于lucene来说这两种目录都可以作为索引的存储路径,FSDirectory指的是在文件系统中的一个路径。
当lucene向其中写入索引时,会直接将索引写到磁盘上,RAMDirectory是内存中的区域,虽然向其中添加document的过程与使用FSDirectory中的内存写入磁盘,当虚拟机退出后,里面的内容也会随之消失。
因此需要将RAMDirectory中的内容转移到FSDirectory中。
代码:
2.3.3从索引中删除文档
2.3.3.1索引的读取工具IndexReader删除
IndexReader主要负责对索引的各种读取和维护工作,如打开一个索引、取得索引中的某个文档、获取索引中的总文档的数量,甚至从索引中删除某个文档。
生成实例方法
IndexReaderreader=IndexReader.open(INDEX_STORE_PATH);
方法
reader.deleteDocument(0);
在luncene的内部使用类似回收站的机制来管理Document的删除,在每个Document被索引中删除时,它只相当于被扔进了回收站,并未实际删除。
既然是回收站,Lucene提供了undeleteAll()方法实现反删除。
真正的实现从一个索引中删除文档需要使用IndexWriter对索引optimize一次,luncene就会重新为每个文档分配ID值,这样那些标记为已删除的Document就真正的被无理删除了。
IndexWriterwriter=newIndexWriter(INDEX_STORE_PATH,newStandardAnalyzer(),false);
Writer.Optimize();
2.3.3.2使用Field信息来删除批量文档
IndexReader的deleteDocuments()方法是一个能批量删除索引的方法,它删除索引是按照词条进行的,也就是说,每个词条都可以用其所在的Field和他的值来表示。
2.3.4Lucene同步法则
开发人员容易忽略掉同步问题,一旦发生这种情况,索引的完整性和数据的一致性就遇到了挑战。
2.3.4.1write.lock
write.lock出现在想索引中添加文档时或将文档从索引中删除时,write.Lock会在IndexWrite初始化时创建,然后在调用IndexWriter的close()方法是被释放。
另外,会在Indexreader使用delete方法删除文档时创建,并在调用IndexReader的close()方法是被释放。
2.3.4.2commit.lock
commit.lock主要是与segment合并和读取操作相关,例如,他出现在IndexWriter初始化时,但是一旦当segment的信息被读取完毕,他会立刻被释放。
另外,当调用IndexWriter的addIndexes()或mergeSegments()方法时,都会生成这个锁。
2.3.5Luncene2.0的新类:
IndexModifier类
IndexModifier,它集成了IndexWriter的大部分功能和IndexReader中对索引的删除功能。
第三章Lucene的搜索
Lucene里与搜索相关的API多数被包含在org.apache.lucene.search包中。
其中最重要的是IndexSearch类。
在Lucene中,所有与搜索相关的操作都需要用到这个类。
3.1IndexSearch的构造方法
publicIndexSearch(Stringpath)throwsIOExcepti