构建列存储索引的方法、装置及系统的制作方法

文档序号:6522730阅读:232来源:国知局
构建列存储索引的方法、装置及系统的制作方法
【专利摘要】本发明公开了一种构建列存储索引的方法、装置及系统。其中,该方法包括:获取即时生效文档,即时生效文档包括:标识数据和标识数据关联的动态数据;在内存中根据即时生效文档创建列存储式索引结构的文档,生成柱状索引文件,柱状索引文件包括标识列和数据存储列,其中,标识列用于保存标识数据,数据存储列用于保存标识数据关联的动态数据;在内存中保存柱状索引文件。其中,在动态数据发生变化的情况下,将更新后的动态数据更新至内存中的柱状索引文件。通过本发明,能够实现缩短动态数据的更新周期,并减少消耗系统资源。
【专利说明】构建列存储索引的方法、装置及系统
【技术领域】
[0001]本发明涉及计算机数据处理领域,具体而言,涉及一种构建列存储索引的方法、装置及系统。
【背景技术】
[0002]目前,现有技术所提供的搜索引擎中的数据更新都是行式更新索引,行式更新索引用于表示文档的一个字段索引的更新,需要对整个文档进行更新,而不能只对某一字段进行更新。在使用行式更新索引的过程中,需要解析整个文档,因此,更新索引的过程中需要较长的更新周期,而且更新索引的时候,磁盘10,cpu带宽将成为系统的瓶颈。
[0003]在使用行式更新功能完成系统中日常的全文索引更新功能的过程中,通常包括一部分字段效短,但是更新频率较高,更新量较大的数据,可以称之为动态数据(DynamicData),该动态数据是动态易变数据,需要频繁变更的字段,比如点击数字段。下面就以广告系统、旅游信息搜索、论坛、度假产品等场景下为例进行详细说明:
[0004]在按点击付费的广告系统中,需要保存每个广告文档的点击数,用于进行实时的CTR计算,在该过程中的点击字段就是动态数据(Dynamic Data)。需要理解的是,CTR(Click-Through-Rate)是指网络广告(图片广告/文字广告/关键词广告/排名广告/视频广告等)的点击到达率,即该广告的点击量(严格的来说,可以是到达目标页面的数量)除以广告的浏览量(PV-Page View)。
[0005]在旅游信息搜索系统的应用中,所有提供用户检索的信息都抓取自互联网,其中部分数据可能涉及反动,涉黄的文章,当上述文章被发现时,需要及时更新;或者文章是一篇软文,需要一个标志位来标识信息是否合规,此时,用于标识文章的标识字段就是动态数据(Dynamic Data)。
[0006]在论坛中,在采用关键词来搜索帖子的过程中,系统通常情况下会按照帖子的点击数,或者帖子的最后访问时间进行排序,而点击数,最后访问时间更新非常频繁。
[0007]在度假产品中,每个度假产品都会有很多标记tag,代理商可以更新产品的标记tag,来影响用户搜索结果中对应产品的排名,而标记tag的更新也非常频繁。而且,在度假产品中,代理商经常会调整商品的价格,价格的高低直接影响到用户购买欲,所以要求价格也尽可能的实时更新。
[0008]对于上述应用场景中,对于更新频繁且即时生效的动态数据(Dynamic Data),由于这类数据的更新效率比较一般的字段数据较高,从而使得在索引更新过程中,动态数据索引的更新速度远远快于普通的文本类全文索引。
[0009]由于目前普通的文本类全文索引的更新是通过行式更新的方式,整个更新过程需要更新整个文档,特别对于文档中有一个超长字段,诸如度假产品中,度假产品的详细描述字段,这时候归档定位装置Indexer的开销将非常大。
[0010]目前针对相关技术的由于动态数据更新频率高,导致全文索引的更新过程更新周期长且系统资源耗费较大的问题,目前尚未提出有效的解决方案。
【发明内容】

[0011]针对相关技术的由于动态数据更新频率高,导致全文索引的更新过程更新周期长且系统资源耗费较大的问题,目前尚未提出有效的解决方案,为此,本发明的主要目的在于提供一种构建列存储索引的方法、装置及系统,以解决上述问题。
[0012]为了实现上述目的,根据本发明的一个方面,提供了一种构建列存储索引的方法,该方法包括:获取即时生效文档,即时生效文档包括:标识数据和标识数据关联的动态数据;在内存中根据即时生效文档创建列存储式索引结构的文档,生成柱状索引文件,柱状索引文件包括标识列和数据存储列,其中,标识列用于保存标识数据,数据存储列用于保存标识数据关联的动态数据;在内存中保存柱状索引文件。
[0013]为了实现上述目的,根据本发明的一个方面,提供了一种构建列存储索引的系统,该系统包括:归档定位装置,用于生成即时生效文档;查询器,保存在内存中,与即时生效文档建立通讯,用于获取即时生效文档,在内存中根据即时生效文档创建列存储式索引结构的文档,生成柱状索引文件,并在内存中保存柱状索引文件,其中,柱状索引文件包括标识列和数据存储列,即时生效文档包括:标识数据和标识数据关联的动态数据,标识列用于保存标识数据,数据存储列用于保存标识数据关联的动态数据。
[0014]为了实现上述目的,根据本发明的另一方面,提供了一种构建列存储索引的装置,该装置包括:获取模块,用于获取即时生效文档,即时生效文档包括:标识数据和标识数据关联的动态数据;创建模块,用于在内存中根据即时生效文档创建列存储式索引结构的文档,生成柱状索引文件,柱状索引文件包括标识列和数据存储列,其中,标识列用于保存标识数据,数据存储列用于保存标识数据关联的动态数据;保存模块,用于在内存中保存柱状索引文件。
[0015]通过本发明,采用获取即时生效文档,即时生效文档包括:标识数据和标识数据关联的动态数据;在内存中根据即时生效文档创建列存储式索引结构的文档,生成柱状索引文件,柱状索引文件包括标识列和数据存储列,其中,标识列用于保存标识数据,数据存储列用于保存标识数据关联的动态数据;在内存中保存柱状索引文件,解决了相关技术的由于动态数据更新频率高,导致全文索引的更新过程更新周期长且系统资源耗费较大的问题,进而实现缩短动态数据的更新周期,并减少消耗系统资源的效果。
【专利附图】

【附图说明】
[0016]此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
[0017]图1是根据本发明实施例的构建列存储索引的方法的流程示意图;
[0018]图2是根据本发明实施例的柱状索引文件的结构示意图;
[0019]图3是根据本发明实施例的构建列存储索引的系统结构示意图;以及
[0020]图4是根据本发明实施例的构建列存储索引的装置结构示意图。
【具体实施方式】
[0021]需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本发明。
[0022]在其最基本的配置中,图1是根据本发明实施例的构建列存储索引的方法的流程示意图;图2是根据本发明实施例的柱状索引文件的结构示意图。
[0023]如图1所示,该构建列存储索引的方法包括如下步骤:
[0024]步骤S10,获取即时生效文档,即时生效文档包括:标识数据和标识数据关联的动态数据。
[0025]步骤S30,将在内存中根据上述即时生效文档创建列存储式索引结构的文档,生成柱状索引文件,柱状索引文件包括标识列和数据存储列,其中,标识列用于保存标识数据,数据存储列用于保存标识数据关联的动态数据。
[0026]步骤S50,在内存中保存柱状索引文件。优选地,还可以包括步骤S70,在动态数据发生变化的情况下,将更新后的动态数据更新至内存中的柱状索引文件。
[0027]本申请上述实施例中的即时生效文档可以用于存储互联网产品中更新频率高且需要及时生效的动态数据Dynamic Data,上述方案通过在内存中创建列存储式索引结构的文档来保存动态数据,并在内存中保存得到的柱状索引文件。这种保存在内存中的柱状索引文件与通常保存在存储器中的全文索引文件进行了区分,因此,在更新动态数据时,可以快速从内存中读取并替换需要更新的动态数据,从而实现将更新后的动态数据更新至内存中的柱状索引文件。这种方式有别于普通全文索引行式更新方式,采用了列式更新,由于读取和替换数据高效,且整个更新过程不需要对整行的文档进行整体更新,仅更新动态数据本身,从而解决了相关技术的由于动态数据更新频率高,导致全文索引的更新过程更新周期长且系统资源耗费较大的问题,进而实现缩短动态数据的更新周期,并减少消耗系统资源的效果。
[0028]本申请方案中的柱状索引文件将动态数据进行列存储(Column),是一个列存储式数据结构,实现了将一个即时生效文档的字段保存到内存中,这种列存储提供高效的聚集和排序,类似数据库式的存储方式,便于更新时快速查找到需要更新的动态数据,进行更新操作。
[0029]具体的,本申请上述方案可以应用于文档的局部升级(Partial update)过程中,即仅更新文档的部分内容,例如,更新文档的tag,点击字段,价格字段等动态数据。
[0030]优选地,本申请上述实施例中的柱状索引文件可以直接保存在查询器Searcher的内存中,直接为用户提供搜索服务,如果需要对动态数据进行更新时,可以直接更新查询器Searcher保存在内存中的列存储column。因此,在动态数据发生变化的情况下,可以直接进入查询器将更新后的动态数据更新至内存中列存储所保存的柱状索引文件。
[0031]其中,柱状索引文件可以包括多列数据存储列i,每列数据存储列i分别保存大小为2~ibyte的动态数据,I^i ^n, η为自然数,其中,大于等于2~n byte的动态数据,都保存在第η列数据存储列η中。
[0032]具体的,本申请上述实施例可以采用如图2所示的列存储Column的数据结构来保存动态数据,从而可以支持快速更新和快速检索的功能。
[0033]具体的,如图2所示,列存储Column的数据结构可以设计成按照文档id获得对应的数据的形式,例如:data[docId]->Data。即柱状索引文件的具体实现过程如下:
[0034]mvldx [docid] ->MvIdx[0035]mvVector[Mvldx.vector][Mvldx.0ffset+idx]->T
[0036]mvVector[n][Mvldx.0ffset]->Vector<T>
[0037]其中,索引中包括指向列存储中对应的列编号,以及该存储列中保存的数据字段内容。索引的列编号分别志向列存储对应的内存列,列编号对应保存的数据字段内容保存至指向的内存列。
[0038]由上可知,mvVector表征用于存储列存储column中的数据,mvVector分为η列数组:1,2,...,η,每列数组用于存储不同大小的动态数据,例如,mvVector (I)可以用于保存column数据长度为2byte的动态数据,mvVector (2)可以用于保存2~2byte的动态数据,以此类推,mvVector (η-1)用于保存2~(n_l)byte的数据,对于数据超过2~ (n_l)的数据,存在mvVector (η)中,η中会有预定长度length字段保存数据的长度。每篇即时生效文档中对应column字段的动态数据存储在mvVector中的哪一组,可以通过标识数据mvldx [docid]来进行标识。
[0039]优选地,本申请上述实施例中,在步骤S50,内存中保存柱状索引文件之前,方法还可以包括如下步骤:
[0040]步骤S501,判断柱状索引文件的大小是否大于内存的大小,内存的大小为预先划分的原始内存空间,在柱状索引文件的大小大于原始内存空间的情况下,进入步骤S502。
[0041]步骤S502,动态重新分配内存的大小,得到新内存空间。
[0042]步骤S503,将柱状索引文件保存至新内存空间。
[0043]优选地,在上述实施例中,在步骤S503,将柱状索引文件保存至新内存空间之前,可以对柱状索引文件中已经失效的动态数据设置对应的失效标记,使得在柱状索引文件保存至新内存空间的过程中,不保存具有失效标记的动态数据。
[0044]优选地,上述实施例中,步骤S502动态重新分配内存的大小,得到新内存空间的步骤可以包括:可以按照如下公式构造新内存空间mvVe c t οr (η ’)’,新内存空间mvVector (η,),的大小 Size= (y_used_y_dead) *grow_ratio+constant,其中,y_used 表征所有被使用的动态数据的数目,y_dead表征具有失效标记的动态数据的数目,grow_ratio表征预设的增长因子,constant表征预设的常量,其中,当前柱状索引文件的大小大于新内存空间mvVector (η’)’时,在将当前柱状索引文件中的动态数据设置对应的失效标记之后,将当前柱状索引文件中不具有失效标记的动态数据保存至原始内存空间mvVector (η’)中。
[0045]具体的,上述实施例,为了支持动态数据的高效更新,mvVector支持动态的分配内存,当原始内存空间mvVector (η’)的空间不够时,列存储column可以通过以下公式进行重新分配内存:
[0046]size=(y_used-y_dead)*grow_ratio+constant,其中,增长因子 grow_ratio 可以设置为1.5,预设的常量constant可以根据实际应用情况进行调整。
[0047]本申请提供的上述示例可以支持内存中列存储column的高效更新,具体采用了RCU算法,对于原始内存空间mvVectoHn’)中失效的动态数据,可以不进行删除,而是设置为失效标记dead,当原始内存空间mvVector (η’ )中空间不够时,构造一个大小为size的新内存空间mvVector (η’),,将原始内存空间mvVector (η’)中的非失效动态数据(undeaddata)拷贝到新内存空间mvVectoHn’)’,然后,更新后的动态数据会保存至查询器中的新内存空间,如果在后续进行更新动态数据的过程中,如果新内存空间mvVectoHn’)’中空间不够时,可以将当前非失效动态数据(undead data)拷贝到原始内存空间mvVector (η’ )中,重复以往,从而可以保证每次数据的更新都是无锁。上述列存储Column的更新设计为read-copy-update形式的同步机制(RCU),可以无锁的实现索引的高效更新。
[0048]具体的,本申请上述实施例中实现的列存储Column更新算法的算法如下示例:
[0049]更新算法包括:清除内存空间vector模块,该模块实现如下方案:
[0050]首先,获得不被使用的最高版本号(generation number)。
[0051]然后,遍历所有内存空间vector中的数据表holdlist,如果该数据表holdlist的版本号小于最高版本号(generation number),则清除。
[0052]更新算法还包括:释放数据表holdlist的空余空间模块,该模块实现如下方案:
[0053]首先,获得不被使用的最高版本号(generation number)。
[0054]然后,遍历所有内存空间vector中的数据表holdlist,如果该数据表holdlist的版本号小于最高版本号(generation number),则将对应的数据表hodlist中的内存空间移至空闲数据表freelist。
[0055]更新算法包括:更新模块,该模块实现如下方案:
[0056]首先,将内存空间vector中需要更新的文档标识id(doctld)进行排序。
[0057]其次,遍历每个需要更新的文档编号id,从内存空间mvVector中获取文档id对应的值,如果需要更新的值与原有空间大小一致,则直接更新;如果大小不一致,这直接将数据存储到对应的vector,如果vector的内存空间不够,贝U会通过创建更大的内存块,将原来的数据从老的内存块拷贝到新的内存块,将老的内存进行回收,供后续使用,然后对新的内存块的进行赋值。
[0058]优选地,本申请实施例中,在步骤S10,获取即时生效文档之前,方法还可以包括如下步骤:
[0059]步骤SlOI,归档定位装置读取输入文档,输入文档记录动态数据和非动态数据。
[0060]步骤S102,在归档定位装置中根据输入文档来创建索引文件,索引文件包括即时生效文档和非即时生效文档。
[0061]步骤S103,生成即时生效文档的镜像文件。
[0062]步骤S104,每次系统重启时,归档定位装置将即时生效文档的镜像文件推送给内存。
[0063]上述步骤可以实现在归档定位装置Indexer中,Indexer是搜索引擎中专门用于为文档集合建立索引的服务,其中,Document (文档)是类似于数据库中的一条记录,而Document ID是一个文档在搜索引擎内部中的唯一标识,通常用数字标识。本申请提供的方案中,归档定位装置针对读取到的输入文档构建索引文件,该索引文件可以包括普通的倒排索引和列存储column列中存储的即时生效文档中的数据。归档定位装置会针对即时生效文档(即针对更新频率高且更新量大的数据集合)生成一个镜像文件,并在每次系统重启之后,将更新后的动态数据的镜像文件推送给查询器,查询器内存中列存储Column对应的索引文件也会针对每次动态数据更新对应生成一个snaphot (镜像)。
[0064]优选地,本申请在步骤S10,内存中保存柱状索引文件之后,方法还可以包括如下步骤:[0065]步骤S201,重做日志服务器记录输入文档中动态数据的实时更新记录,实时更新记录保存动态数据每次发生更新后的数据。
[0066]步骤S202,将实时更新记录发送给归档定位装置和/或内存。
[0067]步骤S203,使用实时更新记录替换即时生效文档中的动态数据。
[0068]具体的,重做日志服务器RedoLog Server目的是为了支持列存储column所保存的柱状索引文件的可靠性,避免在系统发生故障导致柱状索引文件丢失时,无法对动态数据进行恢复。系统将列存储column中动态数据的更新记录保存在重做日志服务器RedoLogServer,具体的,会保留最新镜像保存snapshot之后的所有动态数据更新记录。
[0069]由上可知,本申请上述实施例可以应用于互联网产品中,针对更新频繁的动态数据需要提高更新效率的要求,首先可以从海量数据中就将更新频率极高,但是较短的字段的动态数据提取出来,针对动态数据设计一套新颖的支持高并发,高响应的索引类型。
[0070]具体的,本申请上述实施例中,为了使动态数据Dynamic Data的更新支持高并发,例如,在更新时间>1000条文档/秒的情况下,可以将动态数据Dynamic Data采用列式存储(Column,),并将更新后的动态数据保持在内存中,同时采用Free-Lock的RCU更新策略;同时由于动态数据可以保存在查询器Searcher的内存中,为了保证动态数据的可靠性,采用日志式系统的方式对更新动态数据而得到的重做日志文件Redo Log进行备份,重做日志服务器同时更新Indexer查询器,以保证系统出现故障时,列存储Column中的动态数据也能恢复。
[0071]需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
[0072]因此,比较现有技术可知,由于目前普通的文本类全文索引的更新是通过行式更新的方式,整个更新过程需要更新整个文档,特别对于文档中有一个超长字段,诸如度假产品中,度假产品的详细描述字段,这时候查询器Indexer的开销将非常大,例如针对更新效率>500条文档/秒的动态数据。为了解决上述问题,本申请提供了新的索引结构一列存储Column来保存动态数据的更新结果,从而具有以下特征和优点:更短的字段(保留在内存中);更新过程高并发且即时的更新;只支持完全的匹配,提高了匹配效率;每个列存储column的动态数据字段,将单独列式存储为一个索引文件;与全文倒排索引的区别在于,采用类似数据库的正向存储索引,即Document ID->Column data存储,而全文索引索引保存时Data_>Document ID ;不支持事务。由于列存储column中的数据将保存在Searcher的内存中,因此,可以将原来索引的更新时性能的瓶颈从磁盘转到cpu。
[0073]实施例二:
[0074]在描述本发明的各实施例的进一步细节之前,将参考图3来描述可用于实现本发明的原理的一个合适的计算体系结构。在以下描述中,除非另外指明,否则将参考由一个或多个计算机执行的动作和操作的符号表示来描述本发明的各实施例。由此,可以理解,有时被称为计算机执行的这类动作和操作包括计算机的处理单元对以结构化形式表示数据的电信号的操纵。这一操纵转换了数据或在计算机的存储器系统中的位置上维护它,这以本领域的技术人员都理解的方式重配置或改变了计算机的操作。维护数据的数据结构是具有数据的格式所定义的特定属性的存储器的物理位置。然而,尽管在上述上下文中描述本发明,但它并不意味着限制性的,如本领域的技术人员所理解的,后文所描述的动作和操作的各方面也可用硬件来实现。
[0075]转向附图,其中相同的参考标号指代相同的元素,本发明的原理被示为在一个合适的计算环境中实现。以下描述基于的本发明的实施例,并且不应认为是关于此处未明确描述的替换实施例而限制本发明。
[0076]图3示出了可用于这些设备的一个示例计算机体系结构的示意图。出于描述的目的,所绘的体系结构仅为合适环境的一个示例,并非对本发明的使用范围或功能提出任何局限。也不应将该计算系统解释为对图2所示的任一组件或其组合具有任何依赖或需求。
[0077]本发明的原理可以使用其它通用或专用计算或通信环境或配置来操作。适用于本发明的众所周知的计算系统、环境和配置的示例包括但不限于,个人计算机、服务器,多处理器系统、基于微处理的系统、小型机、大型计算机、以及包括任一上述系统或设备的分布式计算环境。
[0078]图3是根据本发明实施例的构建列存储索引的系统结构示意图。
[0079]如图3所示,该构建列存储索引的系统可以包括:一归档定位装置I和一查询器2。
[0080]其中,归档定位装置1,用于生成即时生效文档;查询器2,保存在内存中,与即时生效文档建立通讯,用于获取即时生效文档,在内存中根据上述即时生效文档创建列存储式索引结构的文档,生成柱状索引文件,并在内存中保存柱状索引文件,其中,柱状索引文件包括标识列和数据存储列,即时生效文档包括:标识数据和标识数据关联的动态数据,标识列用于保存标识数据,数据存储列用于保存标识数据关联的动态数据。
[0081]本申请上述实施例中,归档定位装置I中生成的即时生效文档可以用于存储互联网产品中更新频率高且需要及时生效的动态数据Dynamic Data,上述方案通过在查询器2的内存中创建列存储式索引结构的文档来保存动态数据,并在内存中保存得到的柱状索引文件。这种保存在内存中的柱状索引文件与通常保存在存储器中的全文索引文件进行了区分,因此,在更新动态数据时,可以快速从内存中读取并替换需要更新的动态数据,从而实现将更新后的动态数据更新至内存中的柱状索引文件。这种方式有别于普通全文索引行式更新方式,采用了列式更新,由于读取和替换数据高效,且整个更新过程不需要对整行的文档进行整体更新,仅更新动态数据本身,从而解决了相关技术的由于动态数据更新频率高,导致全文索引的更新过程更新周期长且系统资源耗费较大的问题,进而实现缩短动态数据的更新周期,并减少消耗系统资源的效果。
[0082]本申请方案中的柱状索引文件将动态数据进行列存储(Column),是一个列存储式数据结构,实现了将一个即时生效文档的字段保存到内存中,这种列存储提供高效的聚集和排序,类似数据库式的存储方式,便于更新时快速查找到需要更新的动态数据,进行更新操作。
[0083]优选地,上述实施例中的归档定位装置I可以包括:读取装置,用于读取输入文档,输入文档记录动态数据和非动态数据;处理器,用于在归档定位装置中根据输入文档来创建索引文件,并生成即时生效文档的镜像文件,在每次系统重启时,处理器将即时生效文档的镜像文件推送给保存在内存中的查询器;其中,索引文件包括即时生效文档和非即时生效文档。[0084]优选地,上述实施例中的系统还可以包括:一重做日志服务器3,用于记录输入文档中动态数据的实时更新记录,并将实时更新记录发送给归档定位装置和/或内存,以使用实时更新记录替换即时生效文档中的动态数据;其中,实时更新记录保存动态数据每次发生更新后的数据。
[0085]本申请上述方案可以应用于文档的局部升级(Partial update)过程中,即仅更新文档的动态数据的内容,例如,更新文档的tag,点击字段,价格字段等动态数据。具体的,如图3所示,本申请上书实施例中的系统为了支持列存储column,实现对动态数据对应的进行升级更新等操作,可以包括归档定位装置I和查询器2,优选地,还可以包括一重做日志服务器3。
[0086]其中,归档定位装置IIndexer用于读取输入文档,构建索弓丨,并将索引保存到磁盘中。具体的,Indexer是搜索引擎中专门用于为文档集合建立索引的服务,其中,Document (文档)是类似于数据库中的一条记录,而Document ID是一个文档在搜索引擎内部中的唯一标识,通常用数字标识。本申请提供的方案中,归档定位装置针对读取到的输入文档构建索引文件,该索引文件可以包括普通的倒排索引和列存储column列中存储的即时生效文档中的数据。归档定位装置会针对即时生效文档(即针对更新频率高且更新量大的数据集合)生成一个镜像文件,并在每次系统重启之后,将更新后的动态数据的镜像文件推送给查询器,查询器内存中列存储Column对应的索引文件也会针对每次动态数据更新对应生成一个snaphot (镜像)。
[0087]而查询器2SearCher用于直接为用户提供搜索服务,即以列存储column形式的数据结构保存的柱状索引文件可以直接保存在Searcher。具体的,本申请上述实施例中的柱状索引文件可以直接保存在查询器Searcher的内存中,直接为用户提供搜索服务,如果需要对动态数据进行更新时,可以直接更新查询器Searcher保存在内存中的列存储column。因此,在动态数据发生变化的情况下,可以直接进入查询器将更新后的动态数据更新至内存中列存储所保存的柱状索引文件。
[0088]另外,上述重做日志服务器3RedoLog Server目的是为了支持列存储column所保存的柱状索引文件的可靠性,避免在系统发生故障导致柱状索引文件丢失时,无法对动态数据进行恢复。系统将列存储column中动态数据的更新记录保存在重做日志服务器RedoLog Server,具体的,会保留最新镜像保存snapshot之后的所有动态数据更新记录。
[0089]本申请上述实施例中的查询器2可以包括:一处理器,该处理器,用于判断柱状索引文件的大小是否大于内存的大小,在柱状索引文件的大小大于原始内存空间的情况下,动态重新分配内存的大小,得到新内存空间,并将柱状索引文件保存至新内存空间,其中,内存的大小为预先划分的原始内存空间。优选地,上述处理器还用于对柱状索引文件中已经失效的动态数据设置对应的失效标记,使得在柱状索引文件保存至新内存空间的过程中,不保存具有失效标记的动态数据。
[0090]优选地,上述处理器还可以包括:计算器,用于按照如下公式构造新内存空间,新内存空间的大小 Size= (y_used-y_dead) *grow_ratio+constant,其中,y_used 表征所有被使用的动态数据的数目,y_dead表征具有失效标记的动态数据的数目,grow_ratio表征预设的增长因子,constant表征预设的常量,其中,当前柱状索引文件的大小大于新内存空间时,在将当前柱状索引文件中的动态数据设置对应的失效标记之后,将当前柱状索引文件中不具有失效标记的动态数据保存至原始内存空间中。
[0091]具体的,上述实施例,为了支持动态数据的高效更新,mvVector支持动态的分配内存,当原始内存空间mvVector (η’)的空间不够时,列存储column可以通过以下公式进行重新分配内存:
[0092]size=(y_used-y_dead)*grow_ratio+constant,其中,增长因子 grow_ratio 可以设置为1.5,预设的常量constant可以根据实际应用情况进行调整。
[0093]本申请提供的上述示例可以支持内存中列存储column的高效更新,具体采用了RCU算法,对于原始内存空间mvVectoHn’)中失效的动态数据,可以不进行删除,而是设置为失效标记dead,当原始内存空间mvVector (η’ )中空间不够时,构造一个大小为size的新内存空间mvVector (η’),,将原始内存空间mvVector (η’)中的非失效动态数据(undeaddata)拷贝到新内存空间mvVectoHn’)’,然后,更新后的动态数据会保存至查询器中的新内存空间,如果在后续进行更新动态数据的过程中,如果新内存空间mvVectoHn’)’中空间不够时,可以将当前非失效动态数据(undead data)拷贝到原始内存空间mvVector (η’ )中,重复以往,从而可以保证每次数据的更新都是无锁。上述列存储Column的更新设计为read-copy-update形式的同步机制(RCU),可以无锁的实现索引的高效更新。
[0094]优选地,本申请上述系统中的各个实施例中,柱状索引文件可以包括多列数据存储列i,每列数据存储列i分别保存大小为2~i byte的动态数据,I < i < η,η为自然数,其中,大于等于2~n byte的动态数据,都保存在第η列数据存储列η中。
[0095]具体的,本申请上述实施例可以采用如图2所示的列存储Column的数据结构来保存柱状索引文件中的动态数据,从而可以支持快速更新和快速检索的功能。
[0096]如图2所示,列存储Column的数据结构可以设计成按照文档id获得对应的数据的形式,例如:data [docid] _>Data。即柱状索引文件的具体实现过程如下:
[0097]mvldx [docid] ->MvIdx
[0098]mvVector[Mvldx.vector][Mvldx.0ffset+idx]->T
[0099]mvVector[n][Mvldx.0ffset]->Vector<T>
[0100]由上可知,mvVector表征用于存储列存储column中的数据,mvVector分为η列数组:1,2,...,η,每列数组用于存储不同大小的动态数据,例如,mvVector (I)可以用于保存column数据长度为2byte的动态数据,mvVector (2)可以用于保存2~2byte的动态数据,以此类推,mvVector (η-1)用于保存2~(n_l)byte的数据,对于数据超过2~ (η-1)的数据,存在mvVector (η)中,η中会有预定长度length字段保存数据的长度。每篇即时生效文档中对应column字段的动态数据存储在mvVector中的哪一组,可以通过标识数据mvldx [docid]来进行标识。
[0101]需要进一步说明的是,本申请上述实施例所实现的系统可以采用Java实现,操作系统可以是Linux,但系统本身的设计不局限于某种计算机语言或者系统。
[0102]实施例三:
[0103]图4是根据本发明实施例的构建列存储索引的装置的结构示意图。如图4所示,该构建列存储索引的装置包括:一获取模块102、一创建模块104和一保存模块106。
[0104]其中,获取模块102,用于获取即时生效文档,即时生效文档包括:标识数据和标识数据关联的动态数据;创建模块104,用于在内存中根据上述即时生效文档创建列存储式索引结构的文档,生成柱状索引文件,柱状索引文件包括标识列和数据存储列,其中,标识列用于保存标识数据,数据存储列用于保存标识数据关联的动态数据;保存模块106,用于在内存中保存柱状索引文件。
[0105]还可以包括:运行模块108,用于在动态数据发生变化的情况下,将更新后的动态数据更新至内存中的柱状索引文件。
[0106]本申请上述实施例中的即时生效文档可以用于存储互联网产品中更新频率高且需要及时生效的动态数据Dynamic Data,上述方案通过在内存中创建列存储式索引结构的文档来保存动态数据,并在内存中保存得到的柱状索引文件。这种保存在内存中的柱状索引文件与通常保存在存储器中的全文索引文件进行了区分,因此,在更新动态数据时,可以快速从内存中读取并替换需要更新的动态数据,从而实现将更新后的动态数据更新至内存中的柱状索引文件。这种方式有别于普通全文索引行式更新方式,采用了列式更新,由于读取和替换数据高效,且整个更新过程不需要对整行的文档进行整体更新,仅更新动态数据本身,从而解决了相关技术的由于动态数据更新频率高,导致全文索引的更新过程更新周期长且系统资源耗费较大的问题,进而实现缩短动态数据的更新周期,并减少消耗系统资源的效果。
[0107]本申请方案中的柱状索引文件将动态数据进行列存储(Column),是一个列存储式数据结构,实现了将一个即时生效文档的字段保存到内存中,这种列存储提供高效的聚集和排序,类似数据库式的存储方式,便于更新时快速查找到需要更新的动态数据,进行更新操作。
[0108]具体的,本申请上述方案可以应用于文档的局部升级(Partial update)过程中,即仅更新文档的部分内容,例如,更新文档的tag,点击字段,价格字段等动态数据。
[0109]优选地,本申请上述实施例中的柱状索引文件可以直接保存在查询器Searcher的内存中,直接为用户提供搜索服务,如果需要对动态数据进行更新时,可以直接更新查询器Searcher保存在内存中的列存储column。因此,在动态数据发生变化的情况下,可以直接进入查询器将更新后的动态数据更新至内存中列存储所保存的柱状索引文件。
[0110]优选地,本申请上述实施例中的柱状索引文件可以包括多列数据存储列i,每列数据存储列i分别保存大小为2~i byte的动态数据,I < i ( η,η为自然数,其中,大于等于2'n byte的动态数据,都保存在第η列数据存储列η中。
[0111]具体的,列存储Column的数据结构可以设计成data [docid]->Data的形式。即柱状索引文件中的mvVector表征用于存储列存储column中的数据,mvVector分为η列数组:1,2,...,η,每列数组用于存储不同大小的动态数据,例如,mvVector (I)可以用于保存column数据长度为2byte的动态数据,mvVector (2)可以用于保存2~2byte的动态数据,以此类推,mvVector (η-1)用于保存2~(n_l)byte的数据,对于数据超过2~ (η-1)的数据,存在mvVector (η)中,η中会有预定长度length字段保存数据的长度。每篇即时生效文档中对应column字段的动态数据存储在mvVector中的哪一组,可以通过标识数据mvldx [docid]来进行标识。
[0112]优选地,上述实施中的装置还可以包括:判断模块,用于判断柱状索引文件的大小是否大于内存的大小,内存的大小为预先划分的原始内存空间;动态分配空间模块,用于在柱状索引文件的大小大于原始内存空间的情况下,动态重新分配内存的大小,得到新内存空间;存储模块,用于将柱状索引文件保存至新内存空间。
[0113]优选地,上述实施中的装置还可以包括:标记模块,用于对柱状索引文件中已经失效的动态数据设置对应的失效标记,使得在柱状索引文件保存至新内存空间的过程中,不保存具有失效标记的动态数据。
[0114]优选地,上述实施中的动态分配空间模块可以包括:按照如下公式构造新内存空间,新内存空间的大小 Size= (y_used-y_dead) *grow_ratio+constant,其中,y_used 表征所有被使用的动态数据的数目,y_dead表征具有失效标记的动态数据的数目,grow_ratio表征预设的增长因子,constant表征预设的常量,其中,当前柱状索引文件的大小大于新内存空间时,在将当前柱状索引文件中的动态数据设置对应的失效标记之后,将当前柱状索引文件中不具有失效标记的动态数据保存至原始内存空间中。
[0115]在具体的实施过程中,上述装置中运行获取即时生效文档之前,需要通过归档定位装置读取输入文档,输入文档记录动态数据和非动态数据,并在归档定位装置中根据输入文档来创建索引文件,索引文件包括即时生效文档和非即时生效文档,然后,生成即时生效文档的镜像文件,由此可知,每次系统重启时,归档定位装置将即时生效文档的镜像文件推送给内存。
[0116]在具体的实施过程中,上述装置中运行内存中保存柱状索引文件之后,需要通过重做日志服务器记录输入文档中动态数据的实时更新记录,实时更新记录保存动态数据每次发生更新后的数据,并将实时更新记录发送给归档定位装置和/或内存,然后,使用实时更新记录替换即时生效文档中的动态数据。
[0117]从以上的描述中,可以看出,本发明实现了如下技术效果:在更新动态数据时,可以快速从内存中读取并替换需要更新的动态数据,从而实现将更新后的动态数据更新至内存中的柱状索引文件。这种方式有别于普通全文索引行式更新方式,采用了列式更新,由于读取和替换数据高效,且整个更新过程不需要对整行的文档进行整体更新,仅更新动态数据本身,从而解决了相关技术的由于动态数据更新频率高,导致全文索引的更新过程更新周期长且系统资源耗费较大的问题,进而实现缩短动态数据的更新周期,并减少消耗系统资源的效果。
[0118]通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本申请可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如R0M/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例或者实施例的某些部分所述的方法。
[0119]本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
[0120]本申请可用于众多通用或专用的计算系统环境或配置中。例如:个人计算机、服务器计算机、手持设备或便携式设备、平板型设备、多处理器系统、基于微处理器的系统、置顶盒、可编程的消费电子设备、网络PC、小型计算机、大型计算机、包括以上任何系统或设备的分布式计算环境等等。
[0121]显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
[0122]以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
[0123]显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
[0124]以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
【权利要求】
1.一种构建列存储索引的方法,其特征在于,包括: 获取即时生效文档,所述即时生效文档包括:标识数据和所述标识数据关联的动态数据; 在内存中根据所述即时生效文档创建列存储式索引结构的文档,生成柱状索引文件,所述柱状索引文件包括标识列和数据存储列,其中,所述标识列用于保存所述标识数据,所述数据存储列用于保存所述标识数据关联的动态数据; 在所述内存中保存所述柱状索引文件。
2.根据权利要求1所述的方法,其特征在于,所述柱状索引文件包括多列数据存储列i,每列所述数据存储列i分别保存大小为2~i byte的动态数据,I < i < η,η为自然数,其中,大于等于2~n byte的动态数据,都保存在第η列数据存储列η中。
3.根据权利要求2所述的方法,其特征在于,在获取即时生效文档之前,所述方法还包括: 归档定位装置读取输入文档,所述输入文档记录所述动态数据和非动态数据; 在所述归档定位装置中根据所述输入文档来创建索引文件,所述索引文件包括所述即时生效文档和非即时生效文档; 生成所述即时生效文档的镜像文件; 每次系统重启时,所述归 档定位装置将所述即时生效文档的镜像文件推送给所述内存。
4.根据权利要求3所述的方法,其特征在于,在所述内存中保存所述柱状索引文件之后,所述方法还包括: 重做日志服务器记录所述输入文档中所述动态数据的实时更新记录,所述实时更新记录保存所述动态数据每次发生更新后的数据; 将所述实时更新记录发送给所述归档定位装置和/或所述内存; 使用所述实时更新记录替换所述即时生效文档中的动态数据。
5.根据权利要求1至4中任意一项所述的方法,其特征在于,在所述内存中保存所述柱状索引文件之前,所述方法还包括: 判断所述柱状索引文件的大小是否大于所述内存的大小,所述内存的大小为预先划分的原始内存空间;其中, 在所述柱状索引文件的大小大于所述原始内存空间的情况下,动态重新分配所述内存的大小,得到新内存空间; 将所述柱状索引文件保存至所述新内存空间。
6.根据权利要求5所述的方法,其特征在于,将所述柱状索引文件保存至所述新内存空间之前,所述方法还包括:对所述柱状索引文件中已经失效的动态数据设置对应的失效标记,使得在所述柱状索引文件保存至所述新内存空间的过程中,不保存具有所述失效标记的动态数据。
7.根据权利要求6所述的方法,其特征在于,动态重新分配所述内存的大小,得到新内存空间的步骤包括:按照如下公式构造所述新内存空间,所述新内存空间的大小Size= (y_used_y_dead)*grow_ratio+constant,其中,所述y_used表征所有被使用的动态数据的数目,所述y_dead表征具有所述失效标记的动态数据的数目,所述grow_ratio表征预设的增长因子,所述constant表征预设的常量,其中, 当前柱状索引文件的大小大于所述新内存空间时,在将所述当前柱状索引文件中的动态数据设置对应的失效标记之后,将所述当前柱状索引文件中不具有失效标记的动态数据保存至所述原始内存空间中。
8.—种构建列存储索引的装置,其特征在于,包括: 获取模块,用于获取即时生效文档,所述即时生效文档包括:标识数据和所述标识数据关联的动态数据; 创建模块,用于在内存中根据所述即时生效文档创建列存储式索引结构的文档,生成柱状索引文件,所述柱状索引文件包括标识列和数据存储列,其中,所述标识列用于保存所述标识数据,所述数据存储列用于保存所述标识数据关联的动态数据; 保存模块,用于在所述内存中保存所述柱状索引文件。
9.根据权利要求8所述的装置,其特征在于,所述柱状索引文件包括多列数据存储列i,每列所述数据存储列i分别保存大小为2~i byte的动态数据,I < i < η,η为自然数,其中,大于等于2~n byte的所述动态数据,都保存在第η列数据存储列η中。
10.根据权利要求9所述的装置,其特征在于,所述装置还包括: 判断模块,用于判断所述柱状索引文件的大小是否大于所述内存的大小,所述内存的大小为预先划分的原始内存空间; 动态分配空间模块,用于在所述柱状索引文件的大小大于所述原始内存空间的情况下,动态重新分配所述内存的大小,得到新内存空间;` 存储模块,用于将所述柱状索引文件保存至所述新内存空间。
11.根据权利要求10所述的装置,其特征在于,所述装置还包括:标记模块,用于对所述柱状索引文件中已经失效的动态数据设置对应的失效标记,使得在所述柱状索引文件保存至所述新内存空间的过程中,不保存具有所述失效标记的动态数据。
12.根据权利要求11所述的装置,其特征在于,所述动态分配空间模块包括:按照如下公式构造所述新内存空间,所述新内存空间的大小Size= (y_used-y_dead) *grow_ratio+constant,其中,所述y_used表征所有被使用的动态数据的数目,所述y_dead表征具有所述失效标记的动态数据的数目,所述gr0W_rati0表征预设的增长因子,所述constant表征预设的常量。
13.一种构建列存储索引的系统,其特征在于,包括: 归档定位装置,用于生成即时生效文档; 查询器,保存在内存中,与所述即时生效文档建立通讯,用于获取所述即时生效文档,在内存中根据所述即时生效文档创建列存储式索引结构的文档,生成柱状索引文件,并在所述内存中保存所述柱状索引文件,其中,所述柱状索引文件包括标识列和数据存储列,所述即时生效文档包括:标识数据和所述标识数据关联的动态数据,所述标识列用于保存所述标识数据,所述数据存储列用于保存所述标识数据关联的动态数据。
14.根据权利要求13所述的系统,其特征在于,所述柱状索引文件包括多列数据存储列i,每列所述数据存储列i分别保存大小为2~i byte的动态数据,I < i < η,η为自然数,其中,大于等于2~n byte的所述动态数据,都保存在第η列数据存储列η中。
15.根据权利要求14所述的系统,其特征在于,所述归档定位装置包括:读取装置,用于读取输入文档,所述输入文档记录所述动态数据和非动态数据; 处理器,用于在所述归档定位装置中根据所述输入文档来创建索引文件,并生成所述即时生效文档的镜像文件,在每次系统重启时,所述处理器将所述即时生效文档的镜像文件推送给保存在所述内存中的查询器;
其中,所述索引文件包括所述即时生效文档和非即时生效文档。
16.根据权利要求15所述的系统,其特征在于,所述系统还包括: 重做日志服务器,用于记录所述输入文档中所述动态数据的实时更新记录,并将所述实时更新记录发送给所述归档定位装置和/或所述内存,以使用所述实时更新记录替换所述即时生效文档中的动态数据;其中,所述实时更新记录保存所述动态数据每次发生更新后的数据。
17.根据权利要求13至16中任意一项所述的系统,其特征在于,所述查询器包括: 处理器,用于判断所述柱状索引文件的大小是否大于所述内存的大小,在所述柱状索引文件的大小大于所述原始内存空间的情况下,动态重新分配所述内存的大小,得到新内存空间,并将所述柱状索引文件保存至所述新内存空间,其中,所述内存的大小为预先划分的原始内存空间。
18.根据权利要求17所述的系统,其特征在于,所述处理器用于对所述柱状索引文件中已经失效的动态数据设置对应的失效标记,使得在所述柱状索引文件保存至所述新内存空间的过程中,不保存具有所述失效标记的动态数据。
19.根据权利要求18所述的系统,其特征在于,所述处理器包括:计算器,用于按照如下公式构造所述新内存空间,所述新内存空间的大小Size= (y_used_y_dead)*grow_ratio+constant,其中,所述y_used表征所有被使用的动态数据的数目,所述y_dead表征具有所述失效标记的动态数据的数目,所述gr0W_rati0表征预设的增长因子,所述constant表征预设的常量。
【文档编号】G06F17/30GK103631937SQ201310659169
【公开日】2014年3月12日 申请日期:2013年12月6日 优先权日:2013年12月6日
【发明者】朱翔, 李理, 李庚 , 何伟平 申请人:北京趣拿信息技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1