和Lucene一起玩。试图让我的更改对其他阅读主题可见。没有重建索引。为此,我使用SearcherManager类。
创建经理
Directory index = new SimpleFSDirectory(new File(LUCENE_INDEX_PATH));
w = new IndexWriter(index, config);
indexReader = IndexReader.open(w, true);
manager = new SearcherManager(w, true, null, null);
更新请求
w.updateDocument(t, document);
manager.maybeReopen(); // openIfChanged same behavior
w.commit();
搜索请求
IndexSearcher searcher = manager.acquire();
try {
return performSearch(query, searcher, skip, limit);
} finally {
manager.release(searcher);
searcher = null;
}
更改将刷新到光盘,但新的搜索请求仅在应用程序重新启动(重新创建索引)后才会看到它们。看起来像IndexSearcher仍然指向旧索引。
答案 0 :(得分:4)
您无需打开自己的IndexReader;只需创建SearcherManager(来自你的IndexWriter),然后使用它获取/释放,以获得一个搜索者/读者。
在使用编写器添加/删除文档后,您应该调用maybeReopen,然后在下次调用SearcherManager.acquire时,返回的搜索器将反映更改。最好使用后台线程(即不是搜索的线程)索引文档并调用maybeReopen。
您不需要调用IndexWriter.commit来使更改可见 - 只有在您需要持久性时才调用它(即,所有更改都安全地存在于磁盘上并且将在OS / JVM崩溃,断电,kill -9之后生效等等。)。
答案 1 :(得分:0)
如果要使用NRT搜索,请使用不同的SearcherManager构造函数,该构造函数将IndexWriter作为参数。查看此文章http://blog.mikemccandless.com/2011/11/near-real-time-readers-with-lucenes.html
答案 2 :(得分:0)
看起来,我不应该创建IndexReader。
indexReader = IndexReader.open(w, true)
如果删除此行,一切正常。不知道为什么