`

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的继承关系:



 

 

 

  • 大小: 28.8 KB
  • 大小: 10.7 KB
  • 大小: 7.1 KB
0
0
分享到:
评论

相关推荐

    Zoie实时搜索架构

    《Zoie实时搜索架构:基于Lucene的高效解决方案》 在信息爆炸的时代,快速、准确地检索数据已经成为各类业务的必备能力。Zoie实时搜索架构,作为一款基于Apache Lucene构建的系统,旨在提供分布式、实时和高性能的...

    Lucene5学习之增量索引(Zoie)

    《深入理解Lucene5增量索引与Zoie系统》 在信息检索领域,Lucene是一个广泛使用的全文搜索引擎库,其强大的索引能力和高效的搜索性能为开发者提供了强大的支持。然而,随着数据量的不断增长,如何高效地进行增量...

    zoie, 实时搜索/索引系统.zip

    zoie, 实时搜索/索引系统 什么是 ZoieZoie是用Java编写的实时搜索/索引系统。维基维基在以下位置可用:http://linkedin.jira.com/wiki/display/ZOIE/Home问题问题在以下位置跟踪:http://link

    lucene5+zoie实现近实时索引

    《Lucene 5 + Zoie 实现近实时索引详解》 在当今大数据时代,搜索引擎技术扮演着至关重要的角色,而Lucene作为一款强大的全文搜索引擎库,被广泛应用于各种信息检索系统。然而,传统的Lucene在处理大规模数据时,...

    lucene of lietu

    **Lucene 概述** Lucene 是一个高性能、全文本搜索库,由 Doug Cutting 创建并在 2001 年...开发者可以利用 Lucene 构建自己的搜索引擎,而 LinkedIn 通过支持 Bobo 和 Zoie 等项目,进一步推动了实时搜索技术的发展。

    ewhine_search:ewhine 搜索系统使用 zoie

    The ewhine search system use zoie. #安装 git clone :jimrok/ewhine_search.git cd ewhine_search java -jar server.jar 如果在Mac的控制台下,使用 java -Dfile.encoding=UTF-8 -jar server.jar #索引 在ewhine_...

    zoieleung0309.github.io

    标题 "zoieleung0309.github.io" 暗示这是一个个人或项目的GitHub Pages网站,通常用于展示个人作品、博客或项目代码。描述同样简洁,没有提供额外信息,所以我们主要依据标签“CSS”来展开讨论。...

    吴一男:网易通用搜索优化之道

    - 搜索索引和检索引擎基于开源项目Lucene构建,而实时索引采用了Zoie技术。 - 数据接入可能利用DataStream进行同步,支持HTTP/REST API和Java SDK等多种服务接口。 - 系统配置管理使用了Zookeeper工具,以实现...

    zoieboyd.github.io

    这个项目可能包含了用户Zoie Boyd的个人信息、作品集、博客文章或者其他相关的内容。 【描述】"zoieboyd.github.io" 的描述没有给出具体的细节,但从一般的GitHub网页实践来看,这可能是Zoie Boyd利用GitHub Pages...

    张琨:教育社交平台的web架构分享

    例如FeedSystem是基于开源的key-value数据库Redis构建的,而Instantsearchserver是基于zoie进行开发的。NoticeSystem则利用了mochiweb的高效通信特性,采用了Erlang编程语言。MQserver使用了RabbitMQ作为基础的异步...

    搜索实时更新系统架构介绍.pptx

    这可能涉及到软提交(SoftCommit)和硬提交(HardCommit),以及使用像Zoie这样的系统来管理多个索引版本。 8. **数据处理模型**: - 数据模型设计包括将产品数据分解成列,简化操作和重用。例如,将数据按列粒度处理...

    CSDN TUP第二期:王鹏云演讲PPT

    - **Zoie**:基于Lucene构建,来自LinkedIn,适用于中小规模的实时搜索需求。 - **Sphinx**:自1.10-beta版本起支持实时搜索功能,被广泛应用于craigslist、netlog等网站。 通过以上分析可以看出,实时搜索不仅是一...

    j2ee面试考察点.pdf

    3. **实时搜索设计**:如Zoie系统,结合内存和磁盘,提供快速的搜索响应。 4. **Lucene TF/IDF公式**:TF(Term Frequency)衡量词频,IDF(Inverse Document Frequency)衡量词的重要性,共同决定文档相关性。 5....

    垂直搜索-您不知道的秘密 -solr中国-风雨V1.1

    - **Solr**、**Elasticsearch**、**Zoie**、**BoCo**等:基于Lucene开发的搜索引擎解决方案,各有特色。 - **Sphinx**:一款高性能的全文检索引擎,适用于大数据量的实时搜索。 - **Xapian**:一种高度可扩展的全文...

    javascript写一个页码器,包括切换页码、分页、上一页/下一页、省略页码等功能

    当表格数据太多时,通常需要做成分页。本资源使用javascript实现了一个页码器,满足常规要求:切换页码、分页、上一页/下一页、页码超出时显示省略号,点击省略号往前/后显示几个隐藏的页码,使用方法见...

    计算机网络 实验2 Wireshark的安装与基本操作

    实验2 Wireshark的安装与基本操作 1. 实验目的 学习 Wireshark 的基本操作,抓取和分析有线局域网的数据包,熟悉一些应用层命令和协议。

    计算机网络 实验5 传输介质 双绞线

    实验5 传输介质 1. 实验目的 (1) 了解双绞线的结构; (2) 了解制作双绞线的标准; (3) 熟悉双绞线的制作。 2. 实验内容简要描述 (1) 阅读有关双绞线制作的文档,明确双绞线制作要求;...(2) 双绞线制作直通线,用专用...

    web前端+javascript+模态框

    javascript封装一个模态框:头(标题、关闭按钮)、内容、尾(操作按钮:取消和确定)。标题可以自定义,默认值是“标题”; 内容区域可以是文本或者富文本,操作按钮可以控制显隐和显示文案; ...

Global site tag (gtag.js) - Google Analytics