/*
This is the current indexing chain:
DocConsumer / DocConsumerPerThread
--> code: DocFieldProcessor
--> DocFieldConsumer / DocFieldConsumerPerField
--> code: DocFieldConsumers / DocFieldConsumersPerField
--> code: DocInverter / DocInverterPerField
--> InvertedDocConsumer / InvertedDocConsumerPerField
--> code: TermsHash / TermsHashPerField
--> TermsHashConsumer / TermsHashConsumerPerField
--> code: FreqProxTermsWriter / FreqProxTermsWriterPerField
--> code: TermVectorsTermsWriter / TermVectorsTermsWriterPerField
--> InvertedDocEndConsumer / InvertedDocConsumerPerField
--> code: NormsConsumer / NormsConsumerPerField
--> StoredFieldsConsumer
--> TwoStoredFieldConsumers
-> code: StoredFieldsProcessor
-> code: DocValuesProcessor
*/
DocumentsWriterPerThread 中具体负责索引工作的是IndexingChain,这些类跟持久化到磁盘上得索引文件都存在对应关系。
DocFieldProcessor 继承DocConsumer ,负责收集所有的field的信息,然后传给相应的per-field consumers , 来处理这些信息,具体的事情由他的成员变量,真正干实事的是:
NormsConsumer: 写 _X.nrm 文件,写归一化的文件。
FreqProxTermsWriter:写_X.tim,_X.tip, _X.doc, _X.pos文件。
TermsVectorConsumer:写_X.tvx ,_X.tvd, _X.tvf 文件。
StoredFieldsProcessor: 写_X.fnm, _X.fdt,_X.fdx 文件。
在DocFieldProcessor中,用一个DocFieldProcessorPerField[]的数组来保存每一个field对应的处理对象,因为每一个对象都是复用的。