优化IndexModifier失败
之前曾经写了一个FastIndexModifier,直接继承的Lucene的IndexModifier,使用RAMDirectory进行索引,然后flush的时候回写到
FS目录中,之前的索引一直很正常,但今天在对论坛的帖子进行索引中,发现磁盘写入总是失败,没有任何异常抛出,但是没有实际
的数据被写入磁盘,只有一个Segments。写了几个UnitTest,不论如何测试,总是不能成功。很奇怪以前为什么跑得很正常。
最后只能换回IndexModifier,通过调整MaxBufferDocs来增大IndexWriter的RAM的使用。
虽然如此,还是不满意Lucene的IndexModifier的实现,缺乏一些灵活性。明天自己重写一个类吧,其实按说很简单:
创建1个RAMDirectory的IndexWriter,addDocument时对其进行操作,打开一个IndexReader,deleteDocument时使用它对FSDirectory操作,
flush的时候,关闭IndexReader,此时新打开一个IndexWriter用于实际的fs,将RAMDirectory加入到indexs中,回写,关闭,ok。
挺简单的,当初太懒,想少写几行代码,就直接继承了IndexModifier,现在好,被搞晕了,呵呵。
updated:问题找到了,在回写的时候,顺序出现了小小的问题。必须先关闭ramWriter,否则RAMDirectory里面没有数据.代码如下:
public void flushIndexWriter() throws IOException {
if(ramWriter!=null) {
logger.info("flush ram indexwriter... ");
ramWriter.close();
ramWriter=null;
IndexWriter index = new IndexWriter(directory,analyzer,created);
created=false;
index.addIndexes(new Directory[] {this.ramDir});
index.close();
index=null;
}
}
不过最后还是自己重新写了一个IndexModifier.
Comments
Leave a Reply