lucene2.4源码学习3 写文件的装饰者 + 责任链 模式

lucene 写文件的装饰者 + 责任链 模式,当时看的我是一头雾水。
其实本来是很简单的,写的文件无非就是字段信息和term信息,但是lucene要保证多线程,所以很多方法后面有个PerThread。为了保证功能的单一和可扩展性,用了很多的Consumer,而这些Consumer的源头是Processor。最后问了实现filed的重用,有很多的类是以PerField结尾的。

链同基本索引链有相似的树形结构,由基本索引链中每个层次的对象调用addThreads
进行创建的,负责每个线程的对文档的处理。
DocFieldProcessorPerThread 是线程索引链的源头,由DocFieldProcessor.addThreads(…)创建
DocFieldProcessorPerThread 对象结构如下:
 对索引域进行处理
 DocFieldConsumerPerThread consumer 类型为 DocInverterPerThread , 由
DocInverter.addThreads 创建
 InvertedDocConsumerPerThread consumer 类型为TermsHashPerThread , 由
TermsHash.addThreads 创建
 TermsHashConsumerPerThread consumer 类型为
FreqProxTermsWriterPerThread,由FreqProxTermsWriter.addThreads 创建,
负责每个线程的freq,prox 信息处理
 TermsHashPerThread nextPerThread
 TermsHashConsumerPerThread consumer 类型
TermVectorsTermsWriterPerThread,由TermVectorsTermsWriter 创建,
负责每个线程的tvx,tvd,tvf 信息处理
 InvertedDocEndConsumerPerThread endConsumer 类型为
NormsWriterPerThread,由NormsWriter.addThreads 创建,负责nrm 信息的处理
114
 对存储域进行处理
 StoredFieldsWriterPerThread fieldsWriter 由StoredFieldsWriter.addThreads 创建,负责
fnm,fdx,fdt 的处理。
 FieldInfos fieldInfos;




域索引链:
每个域也有自己的索引链,称为域索引链,每个域的索引链也有同线程索引链有相似的树形结
构,由线程索引链中每个层次的每个层次的对象调用addField 进行创建,负责对此域的处理。
和基本索引链及线程索引链不同的是,域索引链仅仅负责处理索引域,而不负责存储域的处
理。
DocFieldProcessorPerField 是域索引链的源头,对象结构如下:
DocFieldConsumerPerField consumer 类型为DocInverterPerField,由
DocInverterPerThread.addField 创建
118
InvertedDocConsumerPerField consumer 类型为TermsHashPerField,由
TermsHashPerThread.addField 创建
TermsHashConsumerPerField consumer 类型为FreqProxTermsWriterPerField,由
FreqProxTermsWriterPerThread.addField 创建,负责freq, prox 信息的处理
TermsHashPerField nextPerField
TermsHashConsumerPerField consumer 类型为TermVectorsTermsWriterPerField,由
TermVectorsTermsWriterPerThread.addField 创建,负责tvx, tvd, tvf 信息的处理
InvertedDocEndConsumerPerField endConsumer 类型为NormsWriterPerField,由
NormsWriterPerThread.addField 创建,负责nrm 信息的处理。


用图来表示就是这链:








猜你喜欢

转载自huangyunbin.iteye.com/blog/1830512