我有一个应用程序需要能够同时读取和写入搜索索引。我注意到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?
答案 0 :(得分:1)
正如我们所看到的,两个狙击手之间的主要区别在于你从IndexWriter
获得读者的时间,第一个是在writer.commit()
之后。
当我们有一个读者时,这意味着我们有一个当前索引文件的一次性快照,第二个reader
在IndexWriter.commit
之前获得了一个“快照”,它将转向基于IndexSearcher
的{{1}}将找不到刚刚发生的更改reader
或者索引未处于一致状态。
所以你应该重新打开DirectoryReader。希望这些会有所帮助!:D