论坛首页 Java企业应用论坛

有关Lucene的问题(6):Lucene的事务性

浏览 2548 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-06-07  

所谓事务性,本多指数据库的属性,包括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);

   发表时间:2010-06-30  
forfuture兄:不知道你研究过lucene的锁机制么?
比如在很多情况下indexreader和indexwriter同时持有一个索引文件,这个时候有什么具体的限制么?
0 请登录后投票
   发表时间:2010-07-01  
wwty 写道
forfuture兄:不知道你研究过lucene的锁机制么?
比如在很多情况下indexreader和indexwriter同时持有一个索引文件,这个时候有什么具体的限制么?

我的印象中对于同一个索引文件同时只能用一个写的线程对文件进行修改,但是对于读线程是没有限制的,也就是说多线程读一个索引文件或者边读边写(只有一个线程在写)都是可以的。
ps:我已经3、4年没搞lucene了不知道现在新版本有哪些改变。
0 请登录后投票
   发表时间:2010-07-02  
SeanHe 写道
wwty 写道
forfuture兄:不知道你研究过lucene的锁机制么?
比如在很多情况下indexreader和indexwriter同时持有一个索引文件,这个时候有什么具体的限制么?

我的印象中对于同一个索引文件同时只能用一个写的线程对文件进行修改,但是对于读线程是没有限制的,也就是说多线程读一个索引文件或者边读边写(只有一个线程在写)都是可以的。
ps:我已经3、4年没搞lucene了不知道现在新版本有哪些改变。

嗯,是的,老版本的原理确实是这样,我也是对3版本的锁机制不是很了解,呵呵,看来还是得自己抽时间查查代码了
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics