2021SC@SDUSC
按照基本索引链的结构将索引结果写入段
代码为:
consumer(DocFieldProcessor).flush(threads, flushState);
//回收 fieldHash,以便用于下一轮的索引,为提高效率,索引链中的对象是被复用的。
Map<DocFieldConsumerPerThread, Collection>
childThreadsAndFields = new HashMap<DocFieldConsumerPerThread,
Collection>();
for ( DocConsumerPerThread thread : threads) {
DocFieldProcessorPerThread perThread = (DocFieldProcessorPerThread) thread;
childThreadsAndFields.put(perThread.consumer, perThread.fields());
perThread.trimFields(state);
}
//写入存储域
–> fieldsWriter(StoredFieldsWriter).flush(state);
//写入索引域
–> consumer(DocInverter).flush(childThreadsAndFields, state);
//写入域元数据信息,并记录写入的文件名,以便以后生成 cfs 文件
–> final String fileName = state.segmentFileName(IndexFileNames.FIELD_INFOS_EXTENSION);
–> fieldInfos.write(state.directory, fileName);
–> state.flushedFiles.add(fileName);
此过程也是按照基本索引链来的:
consumer(DocFieldProcessor).flush(…);
consumer(DocInverter).flush(…);
consumer(TermsHash).flush(…);
consumer(FreqProxTermsWriter).flush(…);
if (nextTermsHash != null) nextTermsHash.flush(…);
consumer(TermVectorsTermsWriter).flush(…);
endConsumer(NormsWriter).flush(…);
fieldsWriter(StoredFieldsWriter).flush(…);