Java 并发读与写;用Lucene书写
我有一个应用程序,需要能够读和写搜索索引同时进行。我注意到lucene不能同时使用IndexWriter和DirectoryReader。基本上: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
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是的,您必须重新打开。另一种选择是近实时阅读器。查看此博客: