`
yangfuchao418
  • 浏览: 165989 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

实时检索系统Zoie实现分析【转】

阅读更多

实时检索的核心原理
通常的检索系统 中,建索引和查询是分开的,即建索引是离线的,新的 索引会以一定频率(比如每隔5分钟)供查询端使用。对于一些站内检索来说,这种延迟性使得:不需要建索引的速度足够快(只要能跟的上提交频率就行),查询 的效果不必完全精确。而要取得实时检索效果,典型的思路是:建索引和查询是在一个进程内,这样每一次的添加索引都会被下一次的查询用到,但这里面的细节还 是需要好好琢磨解决 的,下面就给出Zoie的基于Lucene的解决方案 :索引分两种,ram index和disk index。建索引的过程是:首先建立ram index,因为是内存操作,这个过程通常较快,建完后会重新打开IndexReader,使查询端能看到最新的索引;当内存中的索引文档 数达到阈值(10000)或者间隔时间达到阈值(自 定义),一个后台线程就将ram index合并到disk index里去,完成后清空已经无用的ram index,并重新打开disk index的IndexReader供查询使用(这里面有个autowarm IndexReader的过程)。特别指出的是,Zoie的ram index有两个,这使得当一个ram index在和disk index做合并操作时(这个过程可能会很耗时),另一个ram index仍能提供建索引的操作。对于查询,使用的索引就包括两个ram index和一个disk index,所以只要索引在内存里建好,就能查询到最新的数据

实现概览
下面简要说明Zoie的核心接口和类。

ZoieSystem:这个类是对外的核心类,它提供了诸多方法供外界使用,但它本身就像个Facade,封装了其成员的一系列方法。

DataConsumer:顾名思义,这个接口是用来消费数据也就是建索引的。实时建索引时,ZoieSystem默认使用的DataConsumer是 RealtimeIndexDataLoader。在consume数据时,RealtimeIndexDataLoader主要是将数据转换成内部结构 后交给另一个DataConsumer即RAMLuceneIndexDataLoader真正在内存里建索引,之后如果当前处理的索引数达到阈 值,RealtimeIndexDataLoader会notify LoaderThread,而LoaderThread会调用DiskLuceneIndexDataLoader来合并索引。

DiskSearchIndex和RAMSearchIndex:这两个类是Zoie操作索引结构的,比如获取或打开指定目录的IndexReader、 IndexWriter,更新索引写盘等操作。

DataProvider:这个结构表示数据提供者。查看Zoie代码 ,发现如果在索引的过程中程序 挂掉,内存中的索引就有可能丢失,解决这个问题的方 法可以是,在DataProvider端做控制,最直接的,当重启程序时,重放之前一段时间的数据即可(因为Zoie能做到定期刷数据,所以可计算出需要 回放的时间点)。

建索引的过程
上面已经对建索引过程做了一些说明,下面配上Zoie wiki上的图再形象化些。分析它的实现时,有个RAM需要重点关注,它包含了两个RAMSearchIndex(Ram A和Ram B)和一个DiskSearchIndex对象 成员,并且Ram A和Ram B也同时扮演Ram writable和Ram readable,建索引时用的是Ram writable,查询时用的是Ram readable。通过下面的图可以看到,Ram A和Ram B有个交换和清空的过程:1)RAM交换发生在Ram A要合并到Disk Index前,把A的数据挪到Ram B,使新的Ram A开始接收处理客户端 建索引请求,而Ram B不再接收数据而专心合并索引。2)在合并索引完成后,Ram B就需要清空了。
timeline.jpg

下载 (32.71 KB)
前天 20:34



删除数据
Zoie没有提供删除索引的接口,它认为每一次的提交或者是add或者是update。在建索引时,Zoie先将document的uid映射成 docid,如果发现docid已存在,就需要标记删除该doc。lucene里表示删除标记的文件 是xx.del,Zoie当然会最终将标记更新到这 个文件,但因为索引结构有两个Ram index和一个disk index,并且不能每一次标记删除就更新disk index,所以Zoie在两种SearchIndex对象里记录了删除标记。当建索引,Zoie同时更新三个SearchIndex内存索引的删除标 记,而在查询时会过滤掉被删除的doc。Zoie还提供了expungeDeletes方法来清除disk index中垃圾索引数据,这个操作因为耗时长而适合在凌晨进行,但查看Zoie的代码,这个操作只提供了通过JMX手动实现而没有自动执行的时机。

ZoieMergePolicy
Zoie的索引合并策略实现可以说是它的很大亮点。lucene中默认使用的MergePolicy是LogByteSizeMergePolicy,这 个MergePolicy在选择合并的segment时,是计算segment的总的字节大小。这种方式的一个缺陷是,像用户 profile这种如果update操作多的话(每 次update会有一次delete操作),会使得一些segment看起来很大,实际上其中有效的索引数据会很少,这些无用索引数据会给查询带来负担。 ZoieMergePolicy在计算索引大小时就去除了已删除的doc,使计算更加精确,下图是Zoie给出的两种MergePolicy的性能 对比,随着时间的增长,因为被标记delete的 doc越来越多,LogByteSizeMergePolicy的查询性能就下降的很厉害了。但是,如果每天低峰期做一次expungeDeletes操 作,并且每天提交的delete操作不多的话,LogByteSizeMergePolicy的问题也不是很大。还有一点,Zoie对segment的数 量处理上,默认是最多大段10个、小段20个(可通过合并引子控制),通常段数保持在十几个,因为段数比较多,查询时的性能会受些影响,好处是一些旧的大 段不会被频繁合并。

mergeperf.png

http://johnnyhg.iteye.com/blog/663888

 

分享到:
评论

相关推荐

    lucene5+zoie实现近实时索引

    在当今大数据时代,搜索引擎技术扮演着至关重要的角色,而Lucene作为一款强大的全文搜索引擎库,被广泛应用于各种信息检索系统。然而,传统的Lucene在处理大规模数据时,由于其索引构建的离线特性,往往无法满足实时...

    Zoie实时搜索架构

    Zoie实时搜索架构,作为一款基于Apache Lucene构建的系统,旨在提供分布式、实时和高性能的搜索服务,满足了大数据背景下对搜索效率的高要求。尽管Zoie的文档可能不够详尽,但其核心技术和优势依然值得我们深入探讨...

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

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

    Lucene5学习之增量索引(Zoie)

    Lucene本身并不直接支持增量索引,因此,开发者们开发了Zoie系统,它是基于Lucene的一个扩展,旨在解决大数据量场景下的实时索引问题。Zoie的名字来源于“Zero Indexing Overhead”,即零索引开销,它的核心思想是...

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

    搜索实时更新系统是现代互联网平台的关键组成部分,它确保用户能够...这个搜索实时更新系统架构旨在实现高效、准确且个性化的搜索体验,通过各种技术和策略确保数据的实时性和一致性,同时满足大规模数据处理的需求。

    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_...

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

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

    lucene of lietu

    Zoie 是 LinkedIn 支持的一个开源实时搜索引擎项目,专门针对需要高时效性的搜索场景,如 Twitter 消息和新闻搜索。Zoie 在 Lucene 的基础上进行了优化,确保了以下特性: 1. **即时索引**:一旦文档加入索引,就...

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

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

    zoieleung0309.github.io

    3. **布局技术**:包括流体布局、网格系统(CSS Grid)和Flexbox。这些技术可以帮助我们创建响应式和动态的网页布局。 4. **响应式设计**:随着移动设备的普及,CSS媒体查询@media用于根据设备特性调整样式,确保...

    j2ee面试考察点.pdf

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

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

    张琨分享的内容涉及了“三人行网络教育平台”的Web架构设计和实现,本文将围绕这一主题,深入讲解服务器拓扑结构、缓存系统设计、存储设计架构以及具体服务与应用的设计。 首先,总体架构的设计应考虑满足当前业务...

    计算机网络 实验6-7 交换机及其VLAN的配置-协议分析-ARP协议

    实验6_7 交换机及其VLAN的配置_协议分析—ARP协议 1. 实验目的 (1) 熟悉交换机的配置环境; (2) 了解交换机基于端口的 VLAN 的设置。 (3) 掌握 Wireshark 的安装; (4) 熟练并掌握 Wireshark 的基本使用; (5) 分析...

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

    - **Sphinx**:一款高性能的全文检索引擎,适用于大数据量的实时搜索。 - **Xapian**:一种高度可扩展的全文搜索引擎库,支持多种语言。 - **默认相似度算法**:如VSM(Vector Space Model)、BM25等,用于计算文档与...

    zoieboyd.github.io

    通过分析这些文件,我们可以深入了解Zoie Boyd的网页结构、设计风格以及可能的技术实现。HTML代码中可能包含了对个人品牌的表述,页面布局的逻辑,以及交互元素的设计。如果存在JavaScript代码,那还涉及到动态功能...

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

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

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

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

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

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

Global site tag (gtag.js) - Google Analytics