我有多个线程在 lucene 索引中执行搜索。每次搜索之前,都会检查内容是否已编入索引,如果没有,则将其添加到索引中。如果同时对未索引的内容进行两次并行搜索,则会出现重复的文档,并且猜测搜索结果会变得困惑。
我找到了以下方法:IndexWriter.updateDocument
但我认为这并不能解决我面临的多线程问题。
如有任何解决此问题的建议,我们将不胜感激。
最佳答案
首先确保一次只有一个方法(IndexWriter#updateDocument()
)调用,您可以使用属于您线程的共享对象来实现它,就像这样
class Search implements Runnable{
private Object lock=new Object();
private volatile boolean found=false;
public void run(){
//business
if(<<found something!>> && !found){
synchronized(lock){/*call the related-method*/found=true;}
}
//business
}
}
其次,您需要跟踪搜索过程中找到的每个键以避免重复,可以检查键或使用简单的 boolean 检查。
并且请通过向其他线程发出有关中止搜索过程的信号来提防无用的过程,如果您只需要第一个创建的 key ,这取决于业务。
关于java - Lucene:多线程文档复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19187976/