Hi,
The context is that I've migrated from Lucene 3.6 to Lucene 4.0-BETA.
Lucene 3.6 had the convenient method IndexSearcher.isCurrent() for any
underlying IndexReader, including MultiReader. This is no more the case for
Lucene 4.0-BETA. I've been suffering in the last 48h until I came up with
this solution. I just want to share, and get feedbacks if any. The idea is
to create a new instance of MultiReader, add the old current SubReaders and
the new changed ones, refresh the IndexSearcher, then close the old
out-of-date SubReaders.
private IndexSearcher getIndexSearcher() {
try {
if (is == null || is.getIndexReader().getRefCount() == 0) {
DirectoryReader newReaders[] = new DirectoryReader[2];
for (int i = 0; i < 2; i++) {
newReaders[i] =
DirectoryReader.open(MyFSDirectories.get(i));
}
is = new IndexSearcher(new MultiReader(newReaders));
} else {
MultiReader mr = (MultiReader) is.getIndexReader();
List<DirectoryReader> oldReaders = (List<DirectoryReader>)
mr.getSequentialSubReaders();
DirectoryReader newReaders[] = new
DirectoryReader[oldReaders.size()];
Set<Integer> toClose = new HashSet<>();
for (int i = 0; i < oldReaders.size(); i++) {
DirectoryReader oldDirectoryReader = oldReaders.get(i);
if (oldDirectoryReader.isCurrent()) {
newReaders[i] = oldDirectoryReader;
} else {
toClose.add(i);
newReaders[i] =
DirectoryReader.openIfChanged(oldReaders.get(i));
}
}
is = new IndexSearcher(new MultiReader(newReaders));
for (int i : toClose) {
oldReaders.get(i).close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return is;
}
Regards,
Mossaab