我有一个应用程序,需要能够同时读写搜索索引。我在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吗?
发布于 2014-06-28 15:20:33
正如我们所看到的,两个片段的主要区别在于您从IndexWriter获得一个阅读器的时间,第一个是在writer.commit()之后。
当我们有一个阅读器时,这意味着我们已经得到了当前索引文件的一次快照,第二个reader在IndexWriter.commit之前得到了一个“快照”,结果是基于该reader的IndexSearcher不会找到IndexWriter刚才所做的更改,或者索引没有处于一致状态。
所以你应该重新打开DirectoryReader。希望这些能帮上忙!:D
https://stackoverflow.com/questions/22090256
复制相似问题