在lucenne的使用中IndexReader和IndexWriter的打开和关闭都是非常耗时的,特别是IndexReader的操作,
(IndexReader 将磁盘上的索引信息读入到内存)
所以在使用时我们一般把IndexReader创建成单实例的,以减少消耗。
看下面的这个例子:
private IndexReader reader;
public IndexSearcher getSearcher(Directory directory) {
try {
if(reader==null) {
reader = IndexReader.open(directory);
} else {
IndexReader tr = IndexReader.openIfChanged(reader);
if(tr!=null) {
reader.close();
reader = tr;
}
}
return new IndexSearcher(reader);
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
此时reader我们就不关闭,在使用时检查reader是不是存在,那么我们又看到一个函数openIfChanged
看文档的解释:
如果当索引打开时,发现reader有了改变就返回一个新的reader,否则返回null,所以在上面的这个方法中我们使用openIfChanged
来判断是不是原来的reader。