lucene之得到当前线程对应的文档集处理对象DocumentsWriterThreadState

2012-06-04

DocumentsWriterThreadState state = getThreadState(doc, delTerm);
在Lucene中,对于同一个索引文件夹,只能够有一个IndexWriter打开它,在打开后,在文件夹中,生成文件
write.lock,当其他IndexWriter再试图打开此索引文件夹的时候,则会报
org.apache.lucene.store.LockObtainFailedException错误。
这样就出现了这样一个问题,在同一个进程中,对同一个索引文件夹,只能有一个IndexWriter打开它,因而如
果想多线程向此索引文件夹中添加文档,则必须共享一个IndexWriter,而且在以往的实现中,addDocument
函数是同步的(synchronized),也即多线程的索引并不能起到提高性能的效果。
于是为了支持多线程索引,不使IndexWriter成为瓶颈,对于每一个线程都有一个相应的文档集处理对象
(DocumentsWriterThreadState),这样对文档的索引过程可以多线程并行进行,从而增加索引的速度。

getThreadState函数是同步的(synchronized),DocumentsWriter有一个成员变量threadBindings,它是一
个HashMap,键为线程对象(Thread.currentThread()),值为此线程对应的DocumentsWriterThreadState
象。
DocumentsWriterThreadState DocumentsWriter.getThreadState(Document doc, Term delTerm)包含
下几个过程:
• 根据当前线程对象,从HashMap中查找相应的DocumentsWriterThreadState对象,如果没找到,则
生成一个新对象,并添加到HashMap中
DocumentsWriterThreadState state = (DocumentsWriterThreadState) threadBindings.get(Thread.cu
if (state == null) {
……

state = new DocumentsWriterThreadState(this);
……
threadBindings.put(Thread.currentThread(), state);
}
• 如果此线程对象正在用于处理上一篇文档,则等待,直到此线程的上一篇文档处理完。
DocumentsWriter.getThreadState() {
waitReady(state);
state.isIdle = false;
}

waitReady(state) {
while (!state.isIdle) {wait();}
}

显然如果state.isIdle为false,则此线程等待。
在一篇文档处理之前,state.isIdle = false会被设定,而在一篇文档处理完毕之后,
DocumentsWriter.finishDocument(DocumentsWriterThreadState perThread, DocWriter docWriter)中,会首
perThread.isIdle = true; 然后notifyAll()来唤醒等待此文档完成的线程,从而处理下一篇文档。
• 如果IndexWriter刚刚commit过,则新添加的文档要加入到新的段中(segment),则首先要生成新的段
名。
initSegmentName(false);
--> if (segment == null) segment = writer.newSegmentName();
• 将此线程的文档处理对象设为忙碌:state.isIdle = false;

 

作者:robotbird, 分类:关于代码 标签: lucene , 浏览(3463), 评论(1)
上一篇: lucene文档之DocumentsWriter
下一篇: 从今天开始坚持不刷技术类文章

相关文章

(1)条评论 订阅

  1. ${item.nickname} 惠头条 说:

    不错了,可以看看。

1

发表评论

电子邮件用于回复通知和avatar全球唯一头像 *

*