4

私は動作中の 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()。任意のcommitIdentifierID を指定し、スナップショットのリリースが完了したらそれを使用する必要があります。

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コミットはゼロであると常に考えています。

誰が私が間違っているのか教えてもらえますか? 詳細を投稿する必要がある場合はお知らせください。

4

1 に答える 1

4

これと同じ質問を Lucene java-user メーリング リストに投稿したところ、すぐに回答が得られました。問題は、IndexWriter最初に構成するために使用する SnapshotDeletionPolicy が、IndexWriter が使用するものと同じではないことです。構築時に、 は渡されIndexWriterたものを実際に複製するSnapshotDeletionPolicyため、上記のコードの最初のブロックは次のようになります。

public Indexer(Directory indexDir, PrintStream printStream) throws IOException {
    IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_43, new Analyzer());
    writerConfig.setIndexDeletionPolicy(new SnapshotDeletionPolicy(new KeepOnlyLastCommitDeletionPolicy()));
    indexWriter = new IndexWriter(indexDir, writerConfig);
    snapshotter = (SnapshotDeletionPolicy) indexWriter.getConfig().getIndexDeletionPolicy();
} 

IndexDeletionPolicyスナップショットをIndexWriter 構成からに設定している最後の行に注意してください。それが鍵です。その後、元の質問で詳述されているコードの 2 番目のチャンクは完全に機能します。

参考までに、Apache Lucene メーリング リストから得た回答を次に示します。

于 2013-07-31T21:09:03.003 に答える