承诺改变Lucene的可见性。最佳做法

时间:2011-01-14 12:24:21

标签: java performance lucene

我正在使用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() {...}

}

为了允许快速更改和搜索,我认为让作家,读者和搜索者保持开放可能是一个好主意。但问题是,在重新开放之前,读者不能看到作者的承诺变化。而且这种操作成本很高,因此快速搜索可能不是一个好主意。

这种典型情况的最佳方法是什么?

2 个答案:

答案 0 :(得分:4)

你应该保持作者始终开放,但不要坚持读者/搜索者。当您需要搜索者时,只需执行IndexSearcher srch = new IndexSearcher(writer.getReader());这样搜索者即可获得最新的更改,即使他们尚未刷新到磁盘(给您两全其美)。

答案 1 :(得分:2)

对于这种用例,我强烈推荐Compass,这是Lucene的高级抽象。特定于您的问题,它提供了更好的并发控制,以及交易,这消除了手动控制您拥有的读取器/写入器/搜索器问题的需要。这是非常聪明的东西,说实话它可以是非常巴洛克式的,但它是解决问题的好方法。

在缺点方面,它基于Lucene 2.9而不是3.0,所以它没有3.0那么快,并且不再主动维护,但它稳定,记录良好,并且比原始Lucene更容易使用