IndexWriter合并索引

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;


引用
IndexWriter.optimize


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

引用
删除索引中的文档


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();


引用
使用ID来删除文档


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

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


引用
用Field信息来删除

Term term=new Term("field","value");
reader.deleteDocuments(term);//批量删除
reader.close();



引用
同步问题


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

引用
lucene lock


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

1.write.lock

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

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

引用
IndexModifier

集成IndexWriter 添加功能,同时还提供了IndexReader的删除功能。

你可能感兴趣的:(工作,Flash,Lucene)