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(数量上和时间上触发索引)和是否开启实时索引的标志位。
ZoieSystem的构造函数是如何使用这些参数进行初始化的:
(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)
zoie实现实时搜索的机制
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整合的部分在下个博客!
参考:
引用
http://www.cnblogs.com/forfuture1978/archive/2010/11/29/1891476.html
分享到:
相关推荐
《Zoie实时搜索架构:基于Lucene的高效解决方案》 在信息爆炸的时代,快速、准确地检索数据已经成为各类业务的必备能力。Zoie实时搜索架构,作为一款基于Apache Lucene构建的系统,旨在提供分布式、实时和高性能的...
《深入理解Lucene5增量索引与Zoie系统》 在信息检索领域,Lucene是一个广泛使用的全文搜索引擎库,其强大的索引能力和高效的搜索性能为开发者提供了强大的支持。然而,随着数据量的不断增长,如何高效地进行增量...
zoie, 实时搜索/索引系统 什么是 ZoieZoie是用Java编写的实时搜索/索引系统。维基维基在以下位置可用:http://linkedin.jira.com/wiki/display/ZOIE/Home问题问题在以下位置跟踪:http://link
《Lucene 5 + Zoie 实现近实时索引详解》 在当今大数据时代,搜索引擎技术扮演着至关重要的角色,而Lucene作为一款强大的全文搜索引擎库,被广泛应用于各种信息检索系统。然而,传统的Lucene在处理大规模数据时,...
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" 暗示这是一个个人或项目的GitHub Pages网站,通常用于展示个人作品、博客或项目代码。描述同样简洁,没有提供额外信息,所以我们主要依据标签“CSS”来展开讨论。...
Zoie 是 LinkedIn 支持的一个开源实时搜索引擎项目,专门针对需要高时效性的搜索场景,如 Twitter 消息和新闻搜索。Zoie 在 Lucene 的基础上进行了优化,确保了以下特性: 1. **即时索引**:一旦文档加入索引,就...
- 搜索索引和检索引擎基于开源项目Lucene构建,而实时索引采用了Zoie技术。 - 数据接入可能利用DataStream进行同步,支持HTTP/REST API和Java SDK等多种服务接口。 - 系统配置管理使用了Zookeeper工具,以实现...
这个项目可能包含了用户Zoie Boyd的个人信息、作品集、博客文章或者其他相关的内容。 【描述】"zoieboyd.github.io" 的描述没有给出具体的细节,但从一般的GitHub网页实践来看,这可能是Zoie Boyd利用GitHub Pages...
例如FeedSystem是基于开源的key-value数据库Redis构建的,而Instantsearchserver是基于zoie进行开发的。NoticeSystem则利用了mochiweb的高效通信特性,采用了Erlang编程语言。MQserver使用了RabbitMQ作为基础的异步...
这可能涉及到软提交(SoftCommit)和硬提交(HardCommit),以及使用像Zoie这样的系统来管理多个索引版本。 8. **数据处理模型**: - 数据模型设计包括将产品数据分解成列,简化操作和重用。例如,将数据按列粒度处理...
- **Zoie**:基于Lucene构建,来自LinkedIn,适用于中小规模的实时搜索需求。 - **Sphinx**:自1.10-beta版本起支持实时搜索功能,被广泛应用于craigslist、netlog等网站。 通过以上分析可以看出,实时搜索不仅是一...
3. **实时搜索设计**:如Zoie系统,结合内存和磁盘,提供快速的搜索响应。 4. **Lucene TF/IDF公式**:TF(Term Frequency)衡量词频,IDF(Inverse Document Frequency)衡量词的重要性,共同决定文档相关性。 5....
- **Solr**、**Elasticsearch**、**Zoie**、**BoCo**等:基于Lucene开发的搜索引擎解决方案,各有特色。 - **Sphinx**:一款高性能的全文检索引擎,适用于大数据量的实时搜索。 - **Xapian**:一种高度可扩展的全文...
计算机网络 实验1 常用网络命令的使用 1. 实验目的 (1) 掌握 ping、ipconfig、tracert、netstat、ARP、nslookup、net 等命令含义和基本用法; (2) 学会运用 ping、ipconfig、tracert、netstat、ARP、nslookup、net ...
javascript封装一个模态框:头(标题、关闭按钮)、内容、尾(操作按钮:取消和确定)。标题可以自定义,默认值是“标题”; 内容区域可以是文本或者富文本,操作按钮可以控制显隐和显示文案; ...
实验2 Wireshark的安装与基本操作 1. 实验目的 学习 Wireshark 的基本操作,抓取和分析有线局域网的数据包,熟悉一些应用层命令和协议。
当表格数据太多时,通常需要做成分页。本资源使用javascript实现了一个页码器,满足常规要求:切换页码、分页、上一页/下一页、页码超出时显示省略号,点击省略号往前/后显示几个隐藏的页码,使用方法见...