zoie建索引的过程以及多线程建索引的一点想法

zoie的原理在之前转载的文章 中介绍过 现在介绍一下zoie建索引的过程。

zoie建索引是一个异步消费过程,ZoieSystem使用的是父类AsyDataConsumer的consume()函数,这个类保持一个类型为List的_batch用来装载将要进行索引的doc。AsyDataConsumer的consume函数,只是负责将doc插入到这个_batch中,并不进行具体的索引工作。

在AsyDataConsumer的后台有一个消费线程(ConsumerThread),监控_batch中是否有数据,如果没有,那么wait(1000),否则就将_batch交给_consumer去消费。这里的_consumer的类型是RealtimeIndexDataLoader _rtdc;

RealtimeIndexDataLoader.consume() 函数分为以下几步:

 

 1、 调用_interpreter的convertAndInterpret()函数,将所有的DataEvent转换成ZoieIndexable,放入链表IndexableList(ZoieIndexable中封装了Lucene的Document)

 

 2、RealtimeIndexDataLoader的成员_ramConsumer调用consume()函数。

 

 3、上边的_ramConsumer的类型是RAMLuceneIndexDataLoader,继承于LuceneIndexDataLoader类,cosume函数是它的成员函数。在这个consume函数中,将ZoieIndexable转换成IndexingReq类型,IndexingReq封装了Document和Analyzer。

 

4、最后_ramConsumer再将转换成的List<IndexReq>交给它的类型为RamSearchIndex的成员idx,idx调用父类BaseSeachIndex的函数updateIndex继续消费数据。这才发现,BaseSeachIndex才是最终的消费者,BaseSeachIndex持有IndexWriter,调用addDocument来建索引。

 

 

lucene是支持多线程建索引的, zoie这里建索引实际上是单线程的,建索引的速度无法达到最快。

 

线上跑的系统建索引的速度就不够理想,曾经想过要对zoie进行些修改来提高建索引的速度。但是以暂时系统的增量索引的

 

量,现在的速度也完全可以支撑了,所以也就没有做这个事,等以后有需求的时候再做了。

 

看过zoie的代码,要改的话,最简单直接就是updateIndex这个函数了。

 

可以做一个线程池,将每次抛进来的List<IndexingReq>队列中的doc分配给每个线程去消费。这样至少算是并行来消费

 

了,虽然IndexWriter要按顺序的将doc写到索引中,但是并行也肯定会提高建索引的速度的。

 

 

 

你可能感兴趣的:(多线程)