私は動作中の Lucene 4.3.1 クラスターを持っており、自動ホット バックアップ プロセスを追加しています。これは、Manning の「Lucene in Action」という本やいくつかのブログ記事で説明されているものと似ています。ただし、この本は Lucene 2.3 に基づいており、API は 4.3.1 でわずかに変更されています。この本は、次のようにインスタンス化するIndexWriter
ように言っています:
IndexDeletionPolicy policy = new KeepOnlyLastCommitDeletionPolicy();
SnapshotDeletionPolicy snapshotter = new SnapshotDeletionPolicy(policy);
IndexWriter writer = new IndexWriter(dir, analyzer, snapshotter,
IndexWriter.MaxFieldLength.UNLIMITED);
そして、バックアップを行うとき:
try {
IndexCommit commit = snapshotter.snapshot();
Collection<String> fileNames = commit.getFileNames();
/*<iterate over & copy files from fileNames>*/
} finally {
snapshotter.release();
}
ただし、これはある時点で Lucene 4.x で変更されたようです。SnapshotDeletionPolicy は IndexWriterConfig で構成され、IndexWriter の作成時に渡されます。これは私が今まで持っているコードです:
public Indexer(Directory indexDir, PrintStream printStream) throws IOException {
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_43, new Analyzer());
snapshotter = new SnapshotDeletionPolicy(new KeepOnlyLastCommitDeletionPolicy());
writerConfig.setIndexDeletionPolicy(snapshotter);
indexWriter = new IndexWriter(indexDir, writerConfig);
}
そして、バックアップを開始するときは、ただ行うことはできませんsnapshotter.snapshot()
。任意のcommitIdentifier
ID を指定し、スナップショットのリリースが完了したらそれを使用する必要があります。
SnapshotDeletionPolicy snapshotter = indexer.getSnapshotter();
String commitIdentifier = generateCommitIdentifier();
try {
IndexCommit commit = snapshotter.snapshot(commitIdentifier);
for (String fileName : commit.getFileNames()) {
backupFile(fileName);
}
} catch (Exception e) {
logger.error("Exception", e);
} finally {
snapshotter.release(commitIdentifier);
indexer.deleteUnusedFiles();
}
ただし、これは機能していないようです。索引付けされたドキュメントがあるかどうかに関係なく、コミットしたかどうかに関係なく、への呼び出しはsnapshotter.snapshot(commitIdentifier)
常にIllegalStateException
ことわざをスローしますNo index commit to snapshot
。コードを見ると、5 秒ごとにディスクにコミットしているにもかかわらず、SnapshotDeletionPolicy はコミットがないと考えているようです。私が確認したところ、常にドキュメントが作成され、インデックスにコミットされていますが、snapshotter
コミットはゼロであると常に考えています。
誰が私が間違っているのか教えてもらえますか? 詳細を投稿する必要がある場合はお知らせください。