lucene基础学习

上传人:飞****9 文档编号:130773644 上传时间:2020-05-01 格式:DOC 页数:14 大小:123.82KB
返回 下载 相关 举报
lucene基础学习_第1页
第1页 / 共14页
lucene基础学习_第2页
第2页 / 共14页
lucene基础学习_第3页
第3页 / 共14页
lucene基础学习_第4页
第4页 / 共14页
lucene基础学习_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《lucene基础学习》由会员分享,可在线阅读,更多相关《lucene基础学习(14页珍藏版)》请在金锄头文库上搜索。

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从索引中删除文档2.3.3.1索引的读取工具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();2.3.3.2使用Field信息来删除批量文档IndexReader的deleteDocuments()方法是一个能批量删除索引的方法,它删除索引是按照词条进行的,也就是说,每个词条都可以用其所在的Field和他的值来表示。2.3.4 Luc

15、ene同步法则开发人员容易忽略掉同步问题,一旦发生这种情况,索引的完整性和数据的一致性就遇到了挑战。2.3.4.1 write.lockwrite.lock出现在想索引中添加文档时或将文档从索引中删除时,write.Lock会在IndexWrite初始化时创建,然后在调用IndexWriter的close()方法是被释放。另外,会在Indexreader使用delete方法删除文档时创建,并在调用IndexReader的close()方法是被释放。2.3.4.2commit.lockcommit.lock主要是与segment合并和读取操作相关,例如,他出现在IndexWriter初始化时,但是一旦当segment的信息被读取完毕,他会立刻被释放。另外,当调用IndexWriter的addIndexes()或mergeSegments()方法时,都会生成这个锁。2.3.5 Luncene2.0的新类:IndexModifier类IndexModifier,它集成了IndexWriter的大部分功能和IndexReader中对索引的删除

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 其它中学文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号