`
qindongliang1922
  • 浏览: 2188493 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117659
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:126069
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:60013
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71398
社区版块
存档分类
最新评论

Lucene4.3进阶开发之二渡天劫( 五)

阅读更多
转载请务必注明,原创地址,谢谢配合!
http://qindongliang1922.iteye.com/blog/1998532


散仙,在上篇文章,分析了IndexWriterConfig的作用以及一些功能,今天在这开始之前,我们再来简单回顾下,IndexWriterConfig的作用。

IndexWriterConfig保存了一些运行时的配置参数,这些参数会在程序运行期间一直存在,所以在大多数时候我们只需要一份单例的IndexWriterConfig即可,而IndexWriterConfig又是Lucene内部实现的线程安全的类,所以在一些需要同步的场景时,我们没必要给IndexWriterConfig在应用外围,在加上自己的线程安全逻辑,IndexWriterConfig里面的IndexWriterConfig.setRAMBufferSizeMB(double)方法和IndexWriterConfig.setMaxBufferedDocs(int)).方法,是2个比较重要的调优方法,一般情况下,我们可以根据自己服务器的配置,来适当的加大这个参数的比值,通过更大的参数,来实现更给力的批处理添加,当然这个也得根据我们的实际环境以及磁盘IO等等来定。



IndexWriter是负责创建和维护索引的重要的类,一些配置信息的获取主要来自IndexWriterConfig类,另外我们还需要一个文件目录来存放索引,所以我们经常看见如下的一行代码:

IndexWriter writer=new IndexWriter(directory, writerConfig);


之所以说IndexWriter是一个重要的索引管理类,不仅仅是因为它提供基于操作索引的增删改查的能力,而且一个很重要的表现就是,它具有二阶段提交的事务功能,看源码我们就会发现它实现2个接口,一个Closeable接口和TwoPhaseCommit接口:
public class IndexWriter implements Closeable, TwoPhaseCommit{

正是由于 TwoPhaseCommit接口,所以IndexWriter 才具备了2阶段的事务功能,以及可恢复的回滚功能,这个功能,在某些突发的意外情况里可以正确的保证索引结构的安全和稳定,即使是索引添加失败,也可以通过回滚功能,恢复上一次提交前的状态。
下面给出一些IndexWriter里面,比较常用和重要的几个方法:

方法名描述
addDocument(Iterable<? extends IndexableField> doc)添加一个doc
addDocument(Iterable<? extends IndexableField> doc, Analyzer analyzer) 添加一个doc,使用指定的分词器
addDocument(Iterable<? extends IndexableField> doc, Analyzer analyzer) 基于Directory的合并索引
addIndexes(IndexReader... readers) 基于IndexReader的合并索引
deleteAll() 删除所有的索引
deleteDocuments(Query... queries) 删除doc数据,来自多个query的结果
deleteDocuments(Query query) 删除doc数据,来自一个query的结果
deleteDocuments(Term term) 删除doc数据,来自一个term
flush(boolean triggerMerge, boolean applyAllDeletes) 刷新缓冲区到磁盘上
forceMerge(int maxNumSegments) 合并段文件
maxDoc() 返回文档总数不包含已经删除的
numDocs() 返回文档总数包含已经删除的
rollback() 在没有进行最终提交前,回滚数据
updateDocument(Term term, Iterable<? extends IndexableField> doc) 更新一个doc,实际上是先删除后添加的策略
tryDeleteDocument(IndexReader readerIn, int docID) 基于docid的删除方法,注意indexreader必须使用的是最新的,也就是基于近实时的,这样保证删除不会发生意外
waitForMerges() 阻塞程序直至合并完成


最后,在唠叨几句,在上面的一些方法中,有几个方法时非常有用的,基本的增删改的那个就不多说了,除此之外还要注意的是,addIndexes(IndexReader... readers) 这个方法,因为lucene默认的任何时候都只能单线程写的局限性,所以在大批量建索引的时候,这可能是一个影响的性能的环节,所以建议使用多个线程建索引,分别建在不同的目录,那么最后就存在一个问题,我们怎么合并索引? 这个时候就是这个方法大显身手的时候了,使用它可以建多份索引合并成一份索引,或许你还想提升性能,你也可以开启复合索引,但这个针对少写多读的场景是非常适合 的,如果更新频繁,那么并不适合使用复合索引。另外一个forceMerge(int maxNumSegments) 这个方法,是合并索引里面段文件的方法,通过合并一些小段,可以用来,压缩空间,同样的对于提升性能也是有一定效果的,注意这个参数并不是意味着越小越好,当我们索引很大的时候,合并成多个段,也是一个不错的选择。



今天,就写到这里吧,最后感谢各位道友,耐心看完此篇,文章若有不足之处,欢迎指正交流!

转载请务必注明,原创地址,谢谢配合!
http://qindongliang1922.iteye.com/blog/1998532
分享到:
评论
2 楼 qindongliang1922 2014-02-25  
背着家走 写道
//请教一个问题  在lucene4.0+里面 ,我用以下的方法可以获取到每个域下面有多少个term

()
Terms terms = atomicReader.terms(field);

count = (int) terms.size();

在lucene3对应的版本里可以类似的方法?



3.x的lucene不太熟悉,你看下API变化吧,应该可以获取。
1 楼 背着家走 2014-02-25  
//请教一个问题  在lucene4.0+里面 ,我用以下的方法可以获取到每个域下面有多少个term

()
Terms terms = atomicReader.terms(field);

count = (int) terms.size();

在lucene3对应的版本里可以类似的方法?

相关推荐

Global site tag (gtag.js) - Google Analytics