并发阅读&写在Lucene

时间:2014-02-28 08:48:16

标签: java concurrency lucene

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

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 个答案:

答案 0 :(得分:1)

正如我们所看到的,两个狙击手之间的主要区别在于你从IndexWriter获得读者的时间,第一个是在writer.commit()之后。


当我们有一个读者时,这意味着我们有一个当前索引文件的一次性快照,第二个readerIndexWriter.commit之前获得了一个“快照”,它将转向基于IndexSearcher的{​​{1}}将找不到刚刚发生的更改reader或者索引未处于一致状态。

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