特定のディレクトリにあるインデックスを使用する方法があります。特定の状況で同期とIOファイル
public class TestSearchEngine implements SearchEngine<Tag> {
private static final String INDEX_PATH = "/test/index";
private Directory directory;
@Inject private TagDAO tagDAO;
private int organizationId;
@Override
public void add(Tag tag) {
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35));
IndexWriter indexWriter = getIndexWriter(indexWriterConfig);
//Create document
Document document = new Document();
document.add(new Field("id", String.valueOf(tag.getId()), Field.Store.YES, Field.Index.NOT_ANALYZED));
document.add(new Field("title", tag.getTitle(), Field.Store.NO, Field.Index.ANALYZED));
try {
indexWriter.addDocument(document);
indexWriter.close();
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public synchronized void setDirectory(int organizationId) throws IOException {
this.organizationId = organizationId;
File path = new File(INDEX_PATH + "/" + String.valueOf(organizationId));
//If path does not exist, create it and create new index for organization
if(!path.exists()) {
path.mkdirs();
buildCompleteIndex(organizationId, false);
}
this.directory = FSDirectory.open(path); //Open directory
}
private void buildCompleteIndex(int organizationId, boolean rebuildDir) {
if(rebuildDir) {
File path = new File(INDEX_PATH + "/" + String.valueOf(organizationId));
try {
Utils.deleteDirectory(path);
} catch (IOException e) {
throw new LuceneIndexException("Error rebuilding index directory.", e);
}
path.mkdirs();
}
List<Tag> tagList = tagDAO.findAll(organizationId);
for(Tag tag : tagList) {
add(tag);
}
}
private IndexReader getIndexReader() {
try {
return IndexReader.open(directory);
} catch (CorruptIndexException e) {
buildCompleteIndex(organizationId, true);
} catch (IOException e) {
throw new LuceneIndexException("IOException prevented IndexReader from opening Index.", e);
} catch(NullPointerException e) {
throw new LuceneIndexException("Index resource not available.", e);
}
return null;
}
}
インデックスが破損、またはそれは単にまだ作成されていないされている何らかの理由であれば、私は例外をキャッチします。その場合、ディレクトリを削除し、データソースからインデックスを再作成するbuildCompleteIndex()メソッドが呼び出されます。
マルチスレッド環境では、クラスのインスタンスを作成し、削除または再構築中にディレクトリを呼び出すメソッドを使用して別のスレッドから保護するにはどうすればよいですか?他のメソッドが動作する前にsetDirectory()メソッドを呼び出さなければならないので、このメソッドで同期を設定するとこれを解決すると仮定しますが、スレッドが既に存在する間にディレクトリが破損した場合、同時に方法?言い換えれば、私は、マルチスレッド環境でIOファイルを削除して更新する正しい方法についてちょっと混乱しています。いくつかのアドバイスをいただければ幸いです。
私は理解できます。ミューテックスオブジェクトのポイントは何ですか?どのように動作するか説明できますか? – ryandlf
あなたは何か共通のものを持っていなければなりません。どのようなスレッドがインスタンスを作成したかによって異なります。静的なミューテックスを使用すると、すべてのインスタンスが同じインスタンス(この場合はミューテックス)と同期します。これを実装するにはより良い方法があるかもしれませんが、これはあなたのユースケースでうまくいくと思います。 – tjg184
OK ...意味があります。説明ありがとう。 – ryandlf