所谓事务性,本多指数据库的属性,包括ACID四个基本要素:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
     我们这里主要讨论隔离性,Lucene的IndexReader和IndexWriter具有隔离性。
     当IndexReader.open打开一个索引的时候,相对于给当前索引进行了一次snapshot,此后的任何修改都不会被看到。
     仅当IndexReader.open打开一个索引后,才有可能看到从上次打开后对索引的修改。
     当IndexWriter没有调用Commit的时候,其修改的内容是不能够被看到的,哪怕IndexReader被重新打开。
     欲使最新的修改被看到,一方面IndexWriter需要commit,一方面IndexReader重新打开。
     下面我们举几个例子来说明上述隔离性:
     (1) 首先做准备,索引十篇文档
     File indexDir = new File("TestIsolation/index");
    IndexWriter
    writer = new IndexWriter(FSDirectory.open(indexDir), new
    StandardAnalyzer(Version.LUCENE_CURRENT), true,
    IndexWriter.MaxFieldLength.LIMITED);
    for(int i =0; i < 10; i++){
    indexDocs(writer);
    }
    writer.close();  
     (2) 然后再索引十篇文档,并不commit
     writer
    = new IndexWriter(FSDirectory.open(indexDir), new
    StandardAnalyzer(Version.LUCENE_CURRENT),
    IndexWriter.MaxFieldLength.LIMITED);
    for(int i =0; i < 10; i++){
    indexDocs(writer);
    } 
     (3) 打开一个IndexReader,但是由于IndexWriter没有commit,所以仍然仅看到十篇文档。
     IndexReader reader = IndexReader.open(FSDirectory.open(indexDir));
    IndexSearcher searcher = new IndexSearcher(reader);
    TopDocs docs = searcher.search(new TermQuery(new Term("contents","hello")), 50);
    System.out.println(docs.totalHits); 
     (4) IndexWriter进行提交commit
     writer.commit();
     (5) 不重新打开IndexReader,进行搜索,仍然仅看到十篇文档。
     docs = searcher.search(new TermQuery(new Term("contents","hello")), 50);
    System.out.println(docs.totalHits);  
     (6) IndexReader重新打开,则可以看到二十篇文档。
     reader = IndexReader.open(FSDirectory.open(indexDir));
    searcher = new IndexSearcher(reader);
    docs = searcher.search(new TermQuery(new Term("contents","hello")), 50);
    System.out.println(docs.totalHits);