lucene的事务性引发的问题

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

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

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

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

        原文如下:

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

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

          
        }  
        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;
}
}

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

  痛苦的领悟

          学习东西,基础才是王道!

你可能感兴趣的:(Lucene)