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

本文详细介绍了Zoie的索引构建流程,包括异步消费机制、RealtimeIndexDataLoader的工作原理及其内部组件的功能,揭示了Zoie如何通过多级消费者实现文档索引。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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写到索引中,但是并行也肯定会提高建索引的速度的。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值