如何在Apache Lucene 6.5中将RAMDirectory与FSDirectory同步

时间:2018-04-07 12:44:20

标签: java exception lucene ramdirectory

我对糟糕起草的问题不好我试图将RAMDirectory索引备份到文件系统目录路径中以便在发生任何崩溃时恢复索引。

我尝试过这些方法

 Directory.copy(ramDir, FSDirectory.open(indexDir), false);

但是这种方法甚至没有在较新版本的Lucene中显示。

我使用的第二种方法是indexwriter.addIndexes()但它抛出此异常

org.apache.lucene.index.IndexNotFoundException: no segments* file found in MMapDirectory

这是源代码

BufferedReader reader=new BufferedReader(new FileReader("hash.txt"));
 RAMDirectory idx=new RAMDirectory();
    String str=reader.readLine();
    while(str!=null)
    {
        Document doc = new Document();
        doc.add(new StringField("SPAM",str, Field.Store.YES));  
        str=reader.readLine();
        dcmnts.add(doc);
    }
    String indexDir="C:\\Users\\xyz\\Desktop\\cmengine\\src\\com\\company\\lucene";
    Directory dir = FSDirectory.open(Paths.get(indexDir));
    writer.addDocuments(dcmnts);//here dcmnts is ArrayList<Documents>
    writer.commit();
    //  writer.addIndexes(dir); i even tried this didnt worked so i took 
    //seprate index writer 
    writer.close();
    IndexWriterConfig iwc2 = new IndexWriterConfig(analyzer);
    iwc.setOpenMode(OpenMode.CREATE_OR_APPEND);

    IndexWriter writer2=new IndexWriter(idx, iwc2);
    writer2.addIndexes(dir);

在这里,我甚至尝试使用相同的IndexWriter将RAMDirectory添加到文件系统。但没有任何效果。它是我调用提交的顺序然后关闭是这个错误? RAMDirectory有一个方法Sync(Collection),其javadoc正是我需要的,但我不知道如何使用它。 什么是解决这个问题的最佳方法。 以下答案我检查了SO但没有任何工作.. Directory.copy approach

1 个答案:

答案 0 :(得分:2)

在我的案例中有效的方法是 我使用了indexWriter的相同实例,重新初始化并将其指向FSDirectory,我希望它能够备份RAMIndex。 对RAMDirectory和FSDirectory使用相同的Analyzer实例。 为SYNC up任务定义IWC的独立实例(索引编写器配置)。 代码如下

    IndexWriterConfig iwc2 = new IndexWriterConfig(analyzer);
    iwc.setOpenMode(OpenMode.CREATE_OR_APPEND);
    Directory dir = FSDirectory.open(Paths.get(indexDir));
    writer=new IndexWriter(dir,iwc2);
    writer.addIndexes(idx);
    writer.close();