Lucene六(IndexReader的设计)

IndexReader和IndexWriter的打开是非常消耗资源的,一般我们在项目中都将IndexReader设计为单例,有的项目中将IndexWriter也设计为单例。由于将IndexReader设计为单例,所以IndexReader不可以被关闭,只需要关闭IndexSearcher。而在用IndexReader的过程中,正因为由于单例的原因,如果索引发生了改变,不能即时的反映到IndexReader中,这时我们需要使用该对象的openIfChanged方法,请看代码:

private static IndexReader reader = null;

public IndexUtil() {
try {
setDates();
scores.put("itat.org",2.0f);
scores.put("zttc.edu", 1.5f);
directory = FSDirectory.open(new File("F:\\stady\\JAVA\\other\\Lucene\\test\\index02"));
//将reader设计为不是只读,这样可以使用reader来删除一个文档。 reader = IndexReader.open(directory,false);
} catch (IOException e) {
e.printStackTrace();
}
}

private IndexSearcher getSearcher(){
try {
if(reader == null){
reader = IndexReader.open(directory,false);
}else{
//如果改变会返回一个新的reader,没有改变返回null
IndexReader tr = reader.openIfChanged(reader);
if(tr != null) {
//关闭原来的reader
reader.close();
reader = tr;
}
}
return new IndexSearcher(reader);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}


public void search2() {
try {
IndexSearcher searcher = getSearcher();
TermQuery query = new TermQuery(new Term("content","like"));
TopDocs tds = searcher.search(query, 10);
for(ScoreDoc sd:tds.scoreDocs) {
Document doc = searcher.doc(sd.doc);
System.out.println("("+sd.doc+"-"+doc.getBoost()+"-"+sd.score+")"+
doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+
doc.get("attach")+","+doc.get("date"));
}
searcher.close();
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}


测试代码:

@Test
public void testSearch2(){
IndexUtil iu = new IndexUtil();
for(int i = 0; i < 5; i++){
iu.search2();
System.out.println("=================================");
try {
Thread.sleep(50000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

在测试的过程中,我们可以删除索引中的一条记录,可以看到测试代码testSearcher2中实时反映了出来,删除的记录已经不存在了,这就是openIfChanged方法的作用。如上所说,如果将IndexWriter也设计为单例,同样IndexWriter也是不能关闭的,而不关闭操作索引其实就像数据库事物没有提交一样,是无效的,此时我们可以使用IndexWriter的commit方法来解决这个问题。

IndexReader也可用于删除文档,调用deleteDocument方法,reader可以删除文档存在的意义在于这样做会即使的反映到reader中,而不需要像writer删除一样,reader需要使用openIfChanged方法去检测是否发生改变。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值