bobo zoie的IndexReaderDecorator

  zoie是linkedin的一个基于lucene的实时搜索系统,zoie的实时搜索原理参考 http://rabbit9898.iteye.com/blog/831676 或者

http://www.cnblogs.com/forfuture1978/archive/2010/11/29/1891476.html 。

 

1. BoboIndexReaderDecorator 注入到zoie中

 

在ZoieSystem.java中一个参数  IndexReaderDecorator<R> indexReaderDecorator,表示Reader的修饰者。

 这里使用的装饰者模式。被包装的IndexReader是直接打开Lucene索引的IndexReader,IndexReaderFactory在得到这些IndexReader后,都会经过此类封装一下,再返回给用户。

 

<bean id="idxDecorator1" class="proj.zoie.impl.indexing.DefaultIndexReaderDecorator" />

默认的装饰者idxDecorator1什么都不做,将原IndexReader返回。

 

 

 <bean id="idxDecorator2" class="com.browseengine.bobo.service.impl.BoboIndexReaderDecorator">
  <constructor-arg ref="handlers" />
 </bean>

 

  基本的Lucene的IndexReader打开,会加载和初始化一些基本的东西,然而有时候,用户需要在IndexReader打开的时候,同时加载一些自己的东西,此类给了用户这样一个机会,用户只要实现自己的装饰者就可以了。在和Zoie另一个项目Bobo实现了BoboIndexReaderDecorator(即上面的idxDecorator2),其作用就是在IndexReader打开的时候,将Facet信息加载到内存中形成某种数据结构,从而在收集Facet的时候快速的使用。

 

BoboIndexReaderDecorator.java 在 bobo-service/src目录下 package com.browseengine.bobo.service.impl 中。

 

2. BoboIndexReaderDecorator的注入后的调用过程

现在分析一下:



 发现是只由ZoieSegmetReader来调用。

 

idxDecorator2   注入到ZoieSytem.java中,通过参数传递到SearchIndexManager中

 

    public ZoieSystem(DirectoryManager dirMgr,ZoieIndexableInterpreter<V> interpreter,IndexReaderDecorator<R> indexReaderDecorator,DocIDMapperFactory docidMapperFactory,Analyzer analyzer,Similarity similarity,int batchSize,long batchDelay,boolean rtIndexing,int maxBatchSize)
    {
    ...
      _searchIdxMgr=new SearchIndexManager<R>(_dirMgr,indexReaderDecorator,docidMapperFactory);

 

 

SearchIndexManager中是如何调用ZoieSegmetReader的呢?

 

在SearchIndexManager中,把_indexReaderDecorator传到DiskSearchIndex中:

_diskIndex = new DiskSearchIndex<R>(_dirMgr, _indexReaderDecorator,this);

 

在DiskSearchIndex中 又赋值给 IndexReaderDispenser:

  public DiskSearchIndex(DirectoryManager dirMgr, IndexReaderDecorator<R> decorator,SearchIndexManager<R> idxMgr){
    super(idxMgr, true);  
    _dirMgr = dirMgr;
    _mergePolicyParams = new MergePolicyParams();
    _dispenser = new IndexReaderDispenser<R>(_dirMgr, decorator,this);
    _mergeScheduler = new SerialMergeScheduler();
    _deletionPolicy = new ZoieIndexDeletionPolicy();
  }

 

在IndexReaderDispenser 中,通过传递到它的类间类InternalIndexReader:

 

  public IndexReaderDispenser(DirectoryManager dirMgr, IndexReaderDecorator<R> decorator,DiskSearchIndex<R> idx)
  {
      _idx = idx;
    _dirMgr = dirMgr;
    _decorator = decorator; 

 

 public ZoieIndexReader<R> getNewReader() throws IOException
    {
        int numTries=INDEX_OPEN_NUM_RETRIES;   
        InternalIndexReader<R> reader=null;
              
        while(reader==null)
    {
          ... ...     
        if (_currentReader==null){ //在newReader 返回的是InternalIndexReader 
          reader = newReader(_dirMgr, _decorator, sig);
            break;
        }
        else{
          reader = (InternalIndexReader<R>)_currentReader.reopen(true);
          _currentSignature = sig;
        }
      }

 

   再看一下InternalIndexReader,原来继承实现了 ZoieMultReader.

 

static final class InternalIndexReader<R extends IndexReader> extends ZoieMultiReader<R>

 

 

而 ZoieMultReader中调用了ZoieSegmetReader。

	public ZoieMultiReader(IndexReader in,IndexReaderDecorator<R> decorator) throws IOException
	{
	  super(in,decorator);
	  _readerMap = new HashMap<String,ZoieSegmentReader<R>>();
	  _decoratedReaders = null; 
	  IndexReader[] subReaders = in.getSequentialSubReaders();
	  init(subReaders);
	}

 
 绕来绕去,终于调用着了 :)

 

ZoieIndexReader的继承关系:



 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值