Как синхронизировать RAMDirectory с FSDirectory в Apache Lucene 6.5

Мой плохой за плохо составленный вопрос я пытаюсь сделать резервную копию индекса 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 в файловую систему. Но ничего не получалось. Это порядок, в котором я вызываю commit, затем close, это неправильно? В RAMDirectory есть метод Sync(Collection), чей javadoc - именно то, что мне нужно, но я не знаю, как его использовать. Каков наилучший подход для решения этой проблемы. После ответов я проверил на SO, но ничего не получалось.. Directory.copy подход

1 ответ

Подход, который работал в моем случае, заключается в том, что я использовал тот же экземпляр indexWriter, переинициализировав его и указав на FSDirectory, где я хотел, чтобы он сделал резервную копию RAMIndex. Используйте один и тот же экземпляр анализатора для RAMDirectory и FSDirectory. Определите отдельный экземпляр IWC(конфигурация модуля записи индекса) для задачи SYNC up. Код выглядит следующим образом

    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();
Другие вопросы по тегам