一种结构化数据分布式索引及检索方法【专利摘要】本发明公开了一种结构化数据分布式索引及检索方法,使用MapReduce程序构建分布式局部索引架构的倒排索引表,并将索引表存入分布式列数据库;在建立索引时,包括以下步骤:选定常用列;建立倒排索引;实现分布式索引;在进行检索时包括以下步骤:给定检索列名;构造检索关键字;用检索关键字在倒排索引中进行查找;查找结果返回的并集即为检索结果集。本发明使用MapReduce程序建立分布式局部索引架构的倒排索引表,解决了海量结构化数据检索效率低的问题,检索速率将得到极大的提升。【专利说明】一种结构化数据分布式索引及检索方法[【
技术领域:
】][0001]本发明涉及数据检索,尤其涉及一种结构化数据分布式索引及检索方法。[【
背景技术:
】][0002]传统的结构化数据检索技术主要是传统数据库技术,如今常用的传统数据库有0raCle、MYS0L、S0LSERVER等。用户只需将结构化数据集导入到数据库,就可利用数据库提供的各种操作轻松检索到自己想要的数据。其技术细节主要是,利用数据库自带的索引机制对导入的结构化数据建立分级索引,再通过检索接口根据索引得到检索数据。[0003]海量结构化数据检索的主要技术有分布式数据库,如分布式列式数据库HBase。分布式列式数据库打破了传统关系数据按行存储的方式,采用列式存储,在廉价的硬件构成的集群上管理超大规模的数据表。无论从架构上的可扩展性、容错性,功能上的查询分析,分布式数据库都是应对海量结构化数据的必然选择。[0004]传统数据库以数据块来存储数据,简单来说,表的字段越多,占用的空间就越多,查询就有可能要跨数据块,这将会导致查询速度变慢。当面临GB级的数据时,传统数据库能够提供快速而精准数据检索。但是面临PB级、EB级的海量数据,分表、分区等技术已经不足以解决查询时间上的瓶颈。[0005]分布式列数据库虽然解决了海量结构化数据的存储检索问题,但是分布式列数据库对索引的支持不够好,例如,HBase只支持主键索引,对于非主键列,检索需要扫描全表,检索效率低。[【
发明内容】][0006]本发明要解决的技术问题是提供一种在海量数据的情况下,检索效率较高的结构化数据分布式索引及检索方法。[0007]为了解决上述技术问题,本发明采用的技术方案是,一种结构化数据分布式索引及检索方法,使用MapReduce程序构建分布式局部索引架构的倒排索引表,并将索引表存入分布式列数据库;[0008]在建立索引时,包括以下步骤:[0009]101)选定常用列;[0010]102)建立倒排索引;[0011]103)实现分布式索引;[0012]在进行检索时包括以下步骤:[0013]104)给定检索列名;[0014]105)构造检索关键字;[0015]106)用检索关键字在倒排索引中进行查找;[0016]107)查找结果返回的并集即为检索结果集。[0017]以上所述的结构化数据分布式索引及检索方法,[0018]201)在步骤102中,对倒排索引的Value值进行二次排序;[0019]202)在步骤102之后,步骤103之前,对倒排索引的Key值加前缀,实现数据集划分;[0020]203)在步骤103中,仅用一个MapReduce程序实现分布式局部索引架构。[0021]以上所述的结构化数据分布式索引及检索方法,在步骤105中,加前缀构造条件检索关键字。[0022]以上所述的结构化数据分布式索引及检索方法,所述的倒排索引表即是一个K-V结构的记录集合,其中K是检索关键字,V即是对应的记录编号集合;倒排索引表即是以检索关键字为键有序存储的数据结构。[0023]以上所述的结构化数据分布式索引及检索方法,每个数据块的前缀由检索用户定义,前缀包括时间、数据源、表名中的一个或多个,前缀采用统一的长度。[0024]本发明结构化数据分布式索引及检索方法使用MapReduce程序建立分布式局部索引架构的倒排索引表,解决了海量结构化数据检索效率低的问题,检索速率将得到极大的提升。[【专利附图】【附图说明】][0025]下面结合附图和【具体实施方式】对本发明作进一步详细的说明。[0026]图1是本发明实施例倒排索引建立的示意图。[0027]图2是本发明实施例针对图1中c3建立的索引的示意图。[0028]图3是本发明实施例MapReduce二次排序示意图。[0029]图4是本发明实施例使用前缀方法建立局部索引架构的示意图。[0030]图5是本发明实施例检索执行过程图。[0031]图6是本发明实施例索引建立流程图。[0032]图7本发明实施例检索流程图。[【具体实施方式】][0033](1)二次排序[0034]在建立倒排索引的时候,每个关键字后面都会有N个ID及其相关性信息组成的串,该ID串必须是按照ID的大小排序的,在海量数据背景下N的值可能非常的大,例如千万甚至上亿。因为用户的检索条件里面可能有多个索引关键字,这些索引关键字得到的结果的交集才是用户想要的结果。因此在对每一个关键字执行检索之后,需要对得到的多个结果集进行归并,如果每个结果集里面的ID串都是无序的,则归并操作无法快速执行,因而影响响应时间。所以在建立索引的时候就要保障每个关键字后面的ID串是有序的,这样才方便后面检索时执行归并操作。在对关键字排序建立索引的同时,对关键字后面的ID串进行排序,这就是二次排序,其具体的含义可以参见图1。[0035]如图1所示,对Record表的c2列建立索引得到索引表Index表,检索关键字q在Record表中出现过两次,分别是记录3和记录5,这样再索引表的"ids"列也就是存储id串的地方就有(3,5),按字典序排序。排序的作用是当检索有多个检索条件的时候,方便结果集的归并,例如再对c3列建立索引,结果如图2。[0036]当用户检索(c2.s,c3.j)时,则用s检索c2建立的索引表得到(2,6),用j检索c3建立的索引表得到(2,5),对他们求交集即可得到满足条件的记录为2。[0037]上面的例子是针对数据表的比较简单的例子,但是对于索引的使用与建立而言道理是通用的,无论是文本检索还是网页或者数据库都有进行二次排序的需求。但是在海量数据背景下,二次排序有新的问题出现,首先是排序的问题,数据量过大,往往一个检索关键字后面会有上千万甚至数十亿个id,这样大规模的数据排序十分耗费时间,而且内存要求也较高;第二个问题就是检索的问题,这么大的数据量执行归并速度肯定快不了,所以这也是为什么局部索引架构要好过全局索引架构的原因。[0038](2)基于MapReduce架构倒排索引的建立[0039]MapReduce擅长处理大数据,用它来建立倒排索引非常的合适,因为涉及到二次排序,所以该MapReduce程序相对而言较为复杂,需要自己实现数据划分以及聚类的接口。首先需要一个将键值对组合在一起的数据对象,如下:[0040]Obj{[0041]Textkey;[0042]Textid;}[0043]即,Map函数将输入的数据分片解析成以组合数据对象Obj作为键,id作为值的Map输出的键值对,II卩(Obj(key,id),id)。[0044]同时要为这个对象构建一个比较器用于排序,MapReduce程序自带的比较器只能对key进行比较排序,这里需要实现自定义的比较器,先对key进行一次排序如果key相同,再对value进行二次排序):[0045]publicinicomparcTo(Objο){if(key!=o.key)returnkey<o.kcy?-1:1;}elseil'(id!=o.icl){returnid<o.id?-1:1;Ielseireturn0;}}[0046]比较器对Obj对象进行比较,key是检索关键字,首先以key的大小进行排序,如果key相等时再以id的大小进行排序。Map函数的输入由用户定义,各有不同,但Map函数输出的中间结果是以Obj数据对象为键,以对象中的id为值组成键值对输出。[0047]Map的输出首先经过分割函数partition的处理,分割函数按照Obj.key的大小进行键值对的分割,这样具有相同的〇bj.key的数据就会被分到一个切片里面传给同一个Reduce。[0048]-个Reduce负责处理两到三个不同key值的数据,一个Reduce处理的数据可能来自所有的Map程序,因此到达Reduce端的数据虽然相同Key之间局部有序,但是整体数据掺杂在一起,因此还需要实现Grouping函数接口,以实现键值对的分组:[0049]publicsialicclassKcyLctiglhFIcxGroupiiigComparatorexlendsWrilableComparalorfiprutccfedKcylx^ngihflcxCIroupingComparalorC)Mpt-rllinmutableBytCbWriiable,das!?sfryt·);i&OverrHeliublicslitcoiiiparcCWiitableCaiiiparablcwl,WriUibleC0111panibicw2lfImnmilabicByicsWritablecl-flmmuiabl€Bytcs\Vriiablc)wl;InimuiiibleByicsWriiablcc2^fImiiiLitabkByLe^Wiiiableiw2;cl^mwImmuiiibleByie^WiiiiiblLiclflel.geiLengihl)-cl.gciOfel.getLciigilnJc2-tcwliniiuiiablcByicsWrilablc(c2.get()?0,c2.gctLcnglh〇?c2,gct()[c2,gctlxnglhi}1]-1):reliiruci.cquak(c2)?0:(cl,compareTo(c2)>0'??:-l):i奮f[0050]partion函数处理后的键值对数据在推送给Reduce程序后需要调用Grouping函数进行分组,Grouping函数实质是对到达Reduce端的数据做一次比较,相同0bj.key的键值对被分到一组,这样具有相同的〇bj.key的键值对就会被分到同一组,在Reduce进行处理的时候就可以在一个Reduce过程中完成对同一个Obj.key的所有键值对的处理。[0051]Reduce过程首先按收到的键值对按照Obj所实现的比较器进行排序,这样同一个Obj.key的键值对就会以Obj.id进行排序,因为同一个Obj.key的键值对会被分在同一个组内,而它们又是以id排序的,这正是所需要的,这时即可以Obj.key作为键,将所有的value迭代取出作为值输出即可。[0052]图3即是整个MapReduce二次排序处理过程示意图。[0053]本实施例只用MapReduce本身的中间结果排序机制完成二次排序,该方法的优点在于可以处理海量的数据,因为MapReduce本身对中间结果排序使用的是外部排序的方法,所以对内存等资源没有较高的要求。而且使用分布式并行的架构进行索引的建立也更加的快捷。[0054](3)分布式局部索引架构的实现方法:[0055]具体的办法很简单,就是在检索关键字前面加上前缀,这个前缀由用户定义,可以使日期,也可以是小数据集的编号,但最好能有固定的长度。[0056]如图4所示,对Record表的c3列建立了索引,但所建立的索引是统一的一个索引表,而不是分开来的多个索引表,通过在检索关键字前面加上不同的前缀,即可区别不同列的索引。此处以时间为前缀,T1、T2代表数据的不同生成时间。例如,来自同一观测站的观测数据,数据收集时间是不一样的。c3列中第1,2行和第6行的数据虽然具有相同的检索关键字b,但由于前缀不同,还是没有被存在一起。前缀可以是表名、日期、文件名、数据库名、数据集合名称等等,根据用户的需求不同而不同。这样对于不同数据集里面的数据,虽然关键字相同,但因为有不同的前缀,所以在建立索引的时候也同样是会被分开的,因为相同前缀的数据会被聚在一起,这样不论是在逻辑上还是在物理上都形成了分布式局部索引的架构。而且这样建立索引的方式能够使用一个MapReduce程序即完成索引的建立,不必每个数据集单独的再建立索引,更为简便。[0057]这样做在检索的时候也即为简便,可以根据用户的需求来检索特定的数据集,t匕如按类型检索、按日期检索、按表检索等。海量数据背景下也不会因为结果集过大而在返回时形成瓶颈,因为可以每次只检索部分数据集,所以可以比较容易的实现翻页。用户的检索条件首先会被分析,然后形成多个检索关键字,这些检索关键字会被单独的执行检索,由于使用的是前缀方法实现的分布式局部索引架构,所以检索关键字会被加上不同的前缀。不同的关键字得到不同的结果集,这些结果集之间先是会按照前缀的不同进行分组,同样前缀的结果集之间执行归并,最终所有满足条件的结果会按照相关性大小排序,相关性高的结果会优先返回给用户,有很多的应用是不需要比较相关性大小的,这样直接顺返回给用户就可以了。[0058](3)检索[0059]根据检索关键字加前缀在索引表里进行检索,所有结果集归并即为最终检索结果。具体检索流程如图5所示:[0060]因为使用的是前缀的方法,所以并不是所有索引都需要检索,在用户指定数据集的条件下,只需在检索关键字前面加上相应数据集的前缀即可。比如用户希望看到最新的结果,而索引是以日期为前缀建立的,则只需将最近的日期前缀建在检索关键字的前面执行检索即可。具体实施例如下:[0061]第一步,用户输入检索条件,一般检索条件可能有多个。如在图4的例子中,我们对C3列建立了索引,用户可输入"selectIDfromC3wherevalue=borvalue=swithTl,T2"即用户检索C3列中ΤΙ、T2时刻值为b和值为s数据的ID。[0062]第二步,系统分析检索条件,得到不同的检索关键字。系统读取用户输入文本,进行单词拆分,分析,得出检索关键字b,s和检索列名C3以及用户想要检索的数据集的相应前缀名T1和T2。[0063]第三步,系统给检索关键字加上前缀ΤΙ、T2,形成新的检索关键字Tl.b、T2.b和Tl.s、T2.s,用新的关键字在HBase索引表里利用HBase提供的检索接口进行检索。[0064]第四步,系统对检索结果按前缀分组,并进行归并,将归并后的结果返还给用户。数据返回前的归并操作是通过自定义函数merge实现的。至此,检索结束,返还的数据即为用户想要的检索结果。[0065]本实施例的最终检索结果为记录的ID号集合,ID即为源数据表的rowkey。而分布式列数据库HBase本身有基于rowkey的索引机制,因此,通过rowkey进行二次检索就可以得到满足检索条件的其它列信息。[0066]分布式列数据库HBase只支持主键索引,对于非主键的列,检索需要扫描全表,速度慢。通过建立分布式局部索引架构的倒排索引表,其检索速率将得到极大的提升。[0067]本发明以上实施例通过加前缀的方式实现数据集的划分,仅使用一个MapReduce程序在shuffle阶段就能实现分布式索引架构,使得无需针对每个数据集分别建立索引,该方法更为简便、省时;[0068]检索关键字加前缀可以根据用户的需求来检索特定的数据集,比如按类型检索、按日期检索、按表检索等。海量数据背景下也不会因为结果集过大而在返回时形成瓶颈,因为可以每次只检索部分数据集,所以可以比较容易的实现翻页,并且检索速率将更高。【权利要求】1.一种结构化数据分布式索引及检索方法,其特征在于,使用MapReduce程序构建分布式局部索引架构的倒排索引表,并将索引表存入分布式列数据库;在建立索引时,包括以下步骤:101)选定常用列;102)建立倒排索引;103)实现分布式索引;在进行检索时包括以下步骤:104)给定检索列名;105)构造检索关键字;106)用检索关键字在倒排索引中进行查找;107)查找结果返回的并集即为检索结果集。2.根据权利要求1所述的结构化数据分布式索引及检索方法,其特征在于,201)在步骤102中,对倒排索引的Value值进行二次排序;202)在步骤102之后,步骤103之前,对倒排索引的Key值加前缀,实现数据集划分;203)在步骤103中,仅用一个MapReduce程序实现分布式局部索引架构。3.根据权利要求1所述的结构化数据分布式索引及检索方法,其特征在于,在步骤105中,加如缀构造条件检索关键字。4.根据权利要求1所述的结构化数据分布式索引及检索方法,其特征在于,所述的倒排索引表即是一个K-V结构的记录集合,其中K是检索关键字,V即是对应的记录编号集合;倒排索引表即是以检索关键字为键有序存储的数据结构。5.根据权利要求1所述的结构化数据分布式索引及检索方法,其特征在于,每个数据块的前缀由检索用户定义,前缀包括时间、数据源、表名中的一个或多个,前缀采用统一的长度。【文档编号】G06F17/30GK104268158SQ201410447252【公开日】2015年1月7日申请日期:2014年9月3日优先权日:2014年9月3日【发明者】毛睿,陆敏华,李荣华,王毅,刘刚,岳磅,廖凯华申请人:深圳大学