Java 并发读与写;用Lucene书写

Java 并发读与写;用Lucene书写,java,concurrency,lucene,Java,Concurrency,Lucene,我有一个应用程序,需要能够读和写搜索索引同时进行。我注意到lucene不能同时使用IndexWriter和DirectoryReader。基本上: IndexWriter writer = new IndexWriter(directory, config); //Add documents here... writer.commit(); DirectoryReader reader = DirectoryReader.open(writer.getDirectory()); IndexSe

我有一个应用程序,需要能够读和写搜索索引同时进行。我注意到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?

因为我们可以看到两个snippies之间的主要区别是您从
索引编写器
获得一个读卡器的时间,第一个是在
writer.commit()之后


当我们有一个读卡器时,这意味着我们有一个当前索引文件的一次性快照,第二个
读卡器在
IndexWriter.commit之前有一个“快照”,结果是,基于
读卡器的
索引搜索器
不会找到刚刚进行的更改
索引编写器
,或者索引未处于一致状态


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

是的,您必须重新打开。另一种选择是近实时阅读器。查看此博客: