lucene的事务性引发的问题

终于ok了。。先开心一下。

[b]我的问题和调试经历。[/b]
我使用lucene 为数据库建立索引,在初期的测试中,对数据进行增删改查我并没有使用缓存,而是直接用indexWriter进行commit。结果每一次commit后我马上进行搜索,结果就是不出来。我查看index 文件,每一次都已进行了更新。于是我确定commit后,index已经同步了。可是为什么就是搜索不到结果了?????

我每一次重新启动程序,上一次修改的结果都能被搜索得到,这就说明了搜索本身没有问题,。问题的关键就是,存在某个问题,使索引更新的效果对我不可以见,宝贵的周五就这样浪费了。由于周六周日要兼职。没空。。所以问题一直搁浅到现在。

[b]救赎之道[/b]
我现在发现学习一样东西基础越来越重要,要不然一个小小的错误会耽误你N多的时间,并且你毫无头绪下手。于是我决定看 lucence3.0 原理分析这个神级 pdf(网络上有下)。看完关于lucene事物性的解析后,。我相信我找到了救赎之道。

原文如下:

所谓事务性,本多指数据库的属性,包括ACID四个基本要素:原子性(Atomicity)、一致性
(Consistency)、隔离性(Isolation)、持久性(Durability)。
我们这里主要讨论隔离性,Lucene的IndexReader和IndexWriter具有隔离性。
• 当IndexReader.open打开一个索引的时候,相对于给当前索引进行了一次snapshot,此后的任何修改
都不会被看到。
• 仅当IndexReader.open打开一个索引后,才有可能看到从上次打开后对索引的修改。
• 当IndexWriter没有调用Commit的时候,其修改的内容是不能够被看到的,哪怕IndexReader被重新
打开。
• [color=darkred]欲使最新的修改被看到,一方面IndexWriter需要commit,一方面IndexReader重新打开。 [/color]

我查看我的元代码:

public static TopDocs search(String queryStr){
TopDocs docs = null;
try{
[color=darkred] if(searcher == null) {
indexFile = new File(index_dir);
searcher = new IndexSearcher(FSDirectory.open (indexFile));


} [/color] searcher.setSimilarity(new IKSimilarity());

QueryParser parser = new QueryParser(Version.LUCENE_30,"content",new IKAnalyzer());
Query query = parser.parse(queryStr);
TopDocs topDocs = searcher.search(query, 100);

return topDocs;
}catch(Exception e){
logger.error(SearchService.class+" search "+e.getMessage());
e.printStackTrace();
return docs;
}
}


[color=darkred]private static Searcher searcher = null; [/color]
问题就是出在这里,第一次搜索的结果总是正确的。。之后要是做了修改都搜索不到,因为全局变量维护着search,而search 只是第一次打开index时候的snapshot.

[b]痛苦的领悟[/b]

学习东西,基础才是王道!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值