IndexWriter合并索引

[flash=336,280]http://img.alimama.cn/bm/wrappler_swf/2009-11-26/2042702_0af5658d088e285c4ac474cd20865090_336x280.swf?v=1259240549[/flash]IndexWriter 提供一个接口

帮助开发者合并不同的索引。这并不是合并具体的目录,而是合并不同的Directory类型的对象。这样我们可以就将不同文件系统路径下的索引合并,还可以将内存中的索引与文件系统中的索引进行合并。


RAMDirectory ramDir=new RAMDirectory();
FSDirectory fsdir=new FSDirectory();

IndexWriter ramWriter=new IndexWriter()...
IndexWriter fsWriter=new IndexWriter()...

ramWriter.addDocument........
ramWriter.close();//必须先关闭。将缓存中的文档刷入RAMDirectory

fsWriter.addIndexes(new Directory[]{ramDir});

fsWriter.close;


[quote]IndexWriter.optimize[/quote]

对所有segment 做优化。使所有的segments合并为一个。即整个目录只出现一种文件前缀。原因是如果太多的文件,打开文件对系统资源消耗是致命的。很多系统都有最大打开文件数量限制。超过,操作系统会禁止打开最后的文件,导致检索失败。
当然优化的消耗也很大,Lucene在索引优化时,采用的策略是建立新的segment来取代那些被合并的segments,所以旧的segment还未被删除前,索引内的磁盘空间消耗会非常大,甚至2倍。IO也会非常高,优化只能在需要时进行,而非任意时刻。

[quote]删除索引中的文档[/quote]

IndexReader 负责对索引的各种读取和维护工作。打开索引,获得索引中文档,获得索引中总文档数量,删除某个文档。


//显示索引内所有的Document
IndexReader reader=IndexReader.open(..)
for(int i=0;i<reader.numDocs();i++){
reader.document(i);
}
//输出当前索引的版本信息
reader.getVersion();
//输出当前索引文档数量
reader.numDocs();

Term term1=new Term("bookname","女");
TermDocs docs=reader.termDocs(term1);

while(docs.next()){
docs.doc();//查找的term1的Document的编号
docs.freq();//term在文档中出现的次数
}

reader.close();


[quote]使用ID来删除文档[/quote]


reader.deleteDocument(0);
reader.close();//必须要关闭,以便将删除信息写入磁盘。
//如果未删除即开始读取
for(int i=0;i<reader.numDocs;i++){
reader.document(i);
}
//如果不关闭,直接执行上门的代码会发生错误。

//反删除,恢复刚才删除的内容
reader.undeleteAll();
reader.close();
//真正删除,只需要运行一下optimize(),就会重新分配ID.那就再也无法恢复了。


[quote]用Field信息来删除[/quote]
[code]
Term term=new Term("field","value");
reader.deleteDocuments(term);//批量删除
reader.close();
[/code]


[quote]同步问题[/quote]

处理并发问题,索引是一个关键资源。
1.同一时刻,只允许一个线程进行加入,删除,更新操作
2.任一时刻,系统只能有一个indexWriter实例对索引进行操作
3.任一时刻,只有一个indexReader对索引进行删除操作。删除后需要close后再启用新的reader
4.在写入时,必须先关闭删除操作。
5.在删除前,必须关闭indexWriter

[quote]lucene lock[/quote]

锁存放于临时文件夹。位置由 java.io.tempdir 属性定义

1.write.lock

添加文档,或者删除文档时。在IndexWriter初始化时创建,在close()时释放。
在IndexReader.delete时创建,在IndexWriter.close()时释放。

2.commit.lock
与segment合并和读取相关操作时出现。出现在IndexWriter初始化时候,但一旦segment信息被读取完毕,就立刻被释放。当调用IndexWriter.addIndexes()或mergeSegments()方法时,生成这个锁。
不能仅仅依赖Lucene锁机制来防止非法操作,需要编写具有良好同步特性的代码来实现高效

[quote]IndexModifier[/quote]
集成IndexWriter 添加功能,同时还提供了IndexReader的删除功能。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值