和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仍然指向旧的索引。
发布于 2012-02-07 01:56:58
您不需要打开自己的IndexReader;只需(从您的IndexWriter)创建SearcherManager,然后使用acquire/release来获取搜索器/阅读器。
在使用编写器添加/删除文档之后,您应该调用maybeReopen,然后下次调用SearcherManager.acquire时,返回的搜索器将反映这些更改。最好使用后台线程(即,不是执行搜索的线程)来索引文档并调用maybeReopen。
您不需要调用IndexWriter.commit来使更改可见--只有当您需要持久性时才调用它(即,所有更改都安全地保存在磁盘上,并且可以在OS/JVM崩溃、断电、kill -9等情况下幸存下来)。
发布于 2012-02-06 22:58:57
如果要使用NRT搜索,请使用以IndexWriter为参数不同的SearcherManager构造函数。查看这篇文章http://blog.mikemccandless.com/2011/11/near-real-time-readers-with-lucenes.html
发布于 2012-02-06 23:34:43
看起来,我不应该创建IndexReader。
indexReader = IndexReader.open(w, true)如果我删除这一行,一切都会正常。还不知道为什么
https://stackoverflow.com/questions/9161992
复制相似问题