背景

我假设以下代码是完全线程安全的:

// Called from a servlet when a user action results in the index needing to be updated
public static void rebuildIndex() {
FSDirectory dir = new NIOFSDirectory(new File(Configuration.getAttachmentFolder()), null);
IndexWriter w = new IndexWriter(dir, analyzer, IndexWriter.MaxFieldLength.UNLIMITED);
.... build index ...
w.optimize();
w.commit();
w.close();
}


从搜索servlet调用以下代码:

// Called by the search servlet
public void search() {
FSDirectory dir = new NIOFSDirectory(new File(Configuration.getAttachmentFolder()), null);
IndexReader indexReader = IndexReader.open(dir,true);
IndexSearcher searcher = new IndexSearcher(indexReader);
.... do the search ...
}


问题

我正在尝试找出实现此问题的最佳/正确方法,以避免出现多线程问题:


应该将FSDirectory dir对象作为某种静态变量共享吗?
是将IndexSearcher searcher还是IndexReader indexReader对象存储为静态变量,然后在重建索引时简单地将其替换?

最佳答案

您应该将indexReader和searcher移到rebuildIndex()的末尾,并且当然要在rebuildIndex()和search()中的searcher上进行同步。但是根据必须重建索引的频率和必须返回的快速搜索结果的多少,您可能必须考虑对indexReader和searcher进行一些缓存,而不是每次重建索引时都等待搜索线程。

关于java - 在Tomcat中使用Lucene,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1712266/

10-14 09:47