Java Lucene NRT搜索无法正常工作

时间:2012-02-06 14:53:59

标签: java lucene lucene-nrt

和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仍然指向旧索引。

3 个答案:

答案 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)

如果删除此行,一切正常。不知道为什么