我正在使用Lucene 3.0.3。我已经制作了一个Spring bean,旨在将所有操作封装在同一个索引上。
public class IndexOperations {
private IndexWriter writer;
private IndexReader reader;
private IndexSearcher searcher;
public void init() {...}
public void destroy() {...}
public void save(Document d) {...}
public void delete(Document d) {...}
public List<Document> list() {...}
}
为了允许快速更改和搜索,我认为让作家,读者和搜索者保持开放可能是一个好主意。但问题是,在重新开放之前,读者不能看到作者的承诺变化。而且这种操作成本很高,因此快速搜索可能不是一个好主意。
这种典型情况的最佳方法是什么?
答案 0 :(得分:4)
你应该保持作者始终开放,但不要坚持读者/搜索者。当您需要搜索者时,只需执行IndexSearcher srch = new IndexSearcher(writer.getReader());
这样搜索者即可获得最新的更改,即使他们尚未刷新到磁盘(给您两全其美)。
答案 1 :(得分:2)
对于这种用例,我强烈推荐Compass,这是Lucene的高级抽象。特定于您的问题,它提供了更好的并发控制,以及交易,这消除了手动控制您拥有的读取器/写入器/搜索器问题的需要。这是非常聪明的东西,说实话它可以是非常巴洛克式的,但它是解决问题的好方法。
在缺点方面,它基于Lucene 2.9而不是3.0,所以它没有3.0那么快,并且不再主动维护,但它稳定,记录良好,并且比原始Lucene更容易使用