zoie初窥手记

zoie是linkedIn开发的基于lucene的搜索组件,主要目的是支持近实时搜索,虽然后续的lucene也提供了近实时搜索的功能,但是相比来说,zoie还是具备一些优势的。

senseidb的索引管理,近实时搜索等服务都是基于zoie的。通过阅读senseidb的源代码,可以理解senseidb和zoie的一些整合。

zoie系统的核心概念:
ZoieSystem - 既实现了DataConsumer接口(用来接收事件,添加/更改/删除索引),又实现了IndexReaderFactory<ZoieIndexReader<R extends IndexReader>>(完成搜索功能)

DataProvider - 用户要自定义DataProvier,它会生成DataEvent, 将ZoieSystem实例传给它,它会调用ZoieSystem实例的consume方法进行消费。

IndexableInterpreter - 构造ZoieSystem实例的时候需要这个解释器,它的作用就是把从DataProvider获取的对象转换成lucene的document

IndexReaderDecorator - IndexReader的装饰器,通过ZoieSystem请求IndexReader实例的时候,会调用此包装器对它进行包装。在和Zoie同一个项目Bobo(实现Facet搜索,使用过Solr的同学可能会比较熟悉)中,实现了BoboIndexReaderDecorator,其作用就是在IndexReader打开的时候,将Facet信息加载到内存中形成某种数据结构,从而在收集Facet的时候快速的使用。

构建ZoieSystem的时候还需要指定Analyzer(分词), Similarity(相似度评分器),batchSize和batchDelay(数量上和时间上触发索引)和是否开启实时索引的标志位。


[b]ZoieSystem的构造函数是如何使用这些参数进行初始化的:[/b]

(1) 其根据制定的索引文件夹${index.directory}生成一个DefaultDirectoryManager _dirMgr,用于管理索引文件夹及索引的版本号IndexSignature。

(2) 生成一个SearchIndexManager _searchIdxMgr,它是实现实时搜索的关键类,包含如下的成员变量:

第一步中生成的DefaultDirectoryManager
spring配置文件中传进来的IndexReader的装饰器IndexReaderDecorator _indexReaderDecorator
DefaultDocIDMapperFactory _docIDMapperFactory用来维护Zoie的文档ID同Lucene的文档ID号之间的对应关系
DiskSearchIndex _diskIndex用于操作硬盘上的索引,此时便得到一个指向硬盘索引的IndexReader
Status _diskIndexerStatus当前索引的状态,共两种状态Sleeping和Working,所谓的Sleeping就是新添加的文档仅仅进入内存索引,所谓的Working即其中一个内存索引正在和硬盘上的索引进行合并,下一节实时机制的时候,我们会详细讨论
Mem _mem结构,是利用两个内存索引,一个硬盘索引配合实现实时索引的关键,详细的机制,我们下一节会讨论。Mem结构包含以下部分:
RAMSearchIndex<R> _memIndexA用于操作内存索引A
RAMSearchIndex<R> _memIndexB用于操作内存索引B
RAMSearchIndex<R> _currentWritable根据索引所处的状态,有时候A是用于添加新文档的内存索引,有时候B是用于添加新文档的索引
RAMSearchIndex<R> _currentReadOnly同上一个相反,这是当前不会被添加新文档的内存索引,从下面的讨论中我们可以知道,此内存索引此时正在和硬盘上的索引进行合并。
ZoieIndexReader<R> _diskIndexReader硬盘索引的IndexReader

(3) 将参数赋值成员变量ZoieIndexableInterpreter _interpreter,Analyzer _analyzer,Similarity _similarity

(4) 创建DiskLuceneIndexDataLoader _diskLoader对象,用于索引到硬盘索引

(5) 如果实时索引_realtimeIndexing设置为true,则创建RealtimeIndexDataLoader _rtdc,第四步中的_diskLoader作为其成员变量。将其设置为ZoieSystem的父类AsyncDataConsumer的成员变量setDataConsumer(_rtdc)

[b]zoie实现实时搜索的机制[/b]
zoie维护两份mem index和一份disk index,初始的时候有一个活跃的mem index和disk index,查询的时候,它们都会返回IndexReader,而新增/删除/更新的时候都只操作活跃的mem index。当mem index到达一定触发点的时候,会新建第二个mem index,这时候第一个mem index会把docuemnt和disk index进行merge,在此期间所有的update都会进入到No.2 mem index,而查询则会返回所有三个index的IndexReader。当No.1 mem index整合完毕后,又会马上回到初始状态。采用mem index的目的就是能够实时反应索引的变化。

zoie和sensei整合的部分在下个博客!

参考:
[quote]http://www.cnblogs.com/forfuture1978/archive/2010/11/29/1891476.html[/quote]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值