Lucene IndexWriter updateDocument()过程源码详解 接上一篇SolrUpdateRequest请求更新文档 1.DocumentsWriter-updateDocument() |-->DocumentsWriterThreadState state = getThreadState(doc, delTerm); |获取DocumentsWriterThreadState处理对象 |-->DocumentsWriterThreadState[] threadStates; | 初始值为0 |-->state = (DocumentsWriterThreadState) threadBindings.get(Thread.currentThread()); |从threadBindings中获取当前线程的state对象 |-->if(state == null) |-->minThreadState |根据threadState线程的numThreads值,选择最小的线程 |--> DocumentsWriterThreadState ts = threadStates[i]; if (minThreadState == null || ts.numThreads < minThreadState.numThreads) { minThreadState = ts; } |--> if (minThreadState != null && (minThreadState.numThreads == 0 || threadStates.length >= MAX_THREAD_STATE)) { state = minThreadState; |当minThreadState不为空,且计数为0,并且threadStates值不超过5个的限定值 } |--> else |此时要创造一个新的DocumentsWriterThreadState |--> DocumentsWriterThreadState[] newArray = new DocumentsWriterThreadState[1+threadStates.length]; |创建新的数祖对象 |--> System.arraycopy(threadStates, 0, newArray, 0, threadStates.length); |--> state = newArray[threadStates.length] = new DocumentsWriterThreadState(this); |--> threadStates = newArray; |--> threadBindings.put(Thread.currentThread(), state); |放至线程HashMap当中 |-->waitReady(state); |-->initSegmentName(false); |-->if (delTerm != null) { |如果存在需要删除的Term,添加到DeleteTerm当中 addDeleteTerm(delTerm, state.docState.docID); state.doFlushAfter = timeToFlushDeletes(); } |-->docState.doc = doc; |设置文档状态 docState.analyzer = analyzer; |-->final DocWriter perDoc = state.consumer.proc