2014-02-28 37 views
2

我有一个应用程序需要能够同时读取和写入搜索索引。我在lucene中注意到的是,你不能同时使用IndexWriter和DirectoryReader。基本上是:Lucene并发读写

IndexWriter writer = new IndexWriter(directory, config); 
//Add documents here... 
writer.commit(); 

DirectoryReader reader = DirectoryReader.open(writer.getDirectory()); 
IndexSearcher searcher = new IndexSearcher(reader);  
QueryParser qp = new QueryParser(Version.LUCENE_46,"field", new StandardAnalyzer(Version.LUCENE_46)); 
qp.setAllowLeadingWildcard(true); 
Query q = qp.parse("field:*"); 

正常工作,而

IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_46, new StandardAnalyzer(Version.LUCENE_46)); 
IndexWriter writer = new IndexWriter(directory, config); 
writer.commit(); 
DirectoryReader reader = DirectoryReader.open(writer.getDirectory()); 

//Add documents here 

writer.commit(); 
IndexSearcher searcher = new IndexSearcher(reader);  
QueryParser qp = new QueryParser(Version.LUCENE_46,"field", new StandardAnalyzer(Version.LUCENE_46)); 
qp.setAllowLeadingWildcard(true); 
Query q = qp.parse("field:*"); 

不会在所有的工作。

每次提交后我都必须重新打开DirectoryReader吗?

+1

是的,你必须重新打开。另一种方法是近实时阅读器。看看这个博客条目:http://blog.mikemccandless.com/2011/11/near-real-time-readers-with-lucenes.html –

回答

1

正如我们可以看到两个snippies之间的主要区别是你从IndexWriter得到一个读者的时间,第一个是在writer.commit()之后。


时,我们得到了一个阅读器,这意味着我们已经拿到了当前指数文件的一次性快照,第二reader得到IndexWriter.commit前的“快照”,它会变成了IndexSearcher根据该reader将找不到更改IndexWriter只是作出或索引不处于一致的状态。

所以你应该重新打开DirectoryReader。希望这些会有所帮助!:D