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的注入后的调用过程
现在分析一下:
![](http://dl.iteye.com/upload/attachment/463905/e903b8ee-58b5-35e6-8276-5247162bc201.png)
发现是只由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>
![](http://dl.iteye.com/upload/attachment/463965/acf22552-958d-33d1-b07f-4e22d3292205.png)
而 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的继承关系:
![](http://dl.iteye.com/upload/attachment/463967/281c8132-32b4-393c-af7f-d86c18328d5a.png)
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0046/3905/e903b8ee-58b5-35e6-8276-5247162bc201-thumb.png)
- 大小: 28.8 KB
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0046/3965/acf22552-958d-33d1-b07f-4e22d3292205-thumb.png)
- 大小: 10.7 KB
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0046/3967/281c8132-32b4-393c-af7f-d86c18328d5a-thumb.png)
- 大小: 7.1 KB
分享到:
相关推荐
基于Lucene的实时搜索架构,支持分布式、实时、高性能检索。不过目前文档不是很全面。
zoie, 实时搜索/索引系统 什么是 ZoieZoie是用Java编写的实时搜索/索引系统。维基维基在以下位置可用:http://linkedin.jira.com/wiki/display/ZOIE/Home问题问题在以下位置跟踪:http://link
NULL 博文链接:https://iamyida.iteye.com/blog/2199848
lucene+zoie近实时索引demo lucene+zoie近实时索引demo
基于lucene的实时搜索引擎zoie 实时搜索成为了目前搜索引擎发展的重要方向。越来越多的开发者开始关注搜索的实时性,比如twitter的信息或者新闻的搜索要求很高的时效性。 Zoie是linkedin支持的开源实时搜索引擎项目...
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
javascript封装一个模态框:头(标题、关闭按钮)、内容、尾(操作按钮:取消和确定)。标题可以自定义,默认值是“标题”; 内容区域可以是文本或者富文本,操作按钮可以控制显隐和显示文案; ...
当表格数据太多时,通常需要做成分页。本资源使用javascript实现了一个页码器,满足常规要求:切换页码、分页、上一页/下一页、页码超出时显示省略号,点击省略号往前/后显示几个隐藏的页码,使用方法见...