具体实施方式
为了给出保证索引更新效率不下降的前提下提高检索效率的实现方案,本发明实施例提供了一种索引建立方法及装置,以下结合说明书附图对本发明的优选实施例进行说明,应当理解,此处所描述的优选实施例仅用于说明和解释本发明,并不用于限定本发明。并且在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。
本发明实施例中,通过在第一存储区域中增加一级合并,减少写入第二存储区域的频率,并且增加了最终索引段中的文档数量,减少了索引段的个数,从而在不影响检索性能的前提下,提高了检索效率。
本发明实施例中,第一存储区域为待索引文档初始写入的临时存储区域,例如,内存、闪存等;第二存储区域为文档合并为索引段后的存储区域,例如,磁盘、硬盘等存储空间。
以下描述中,以第一存储区域为内存,第二存储区域为磁盘为例进行描述:
本发明一个实施例中,在已有参数FirstLevelMergeFactor、MergeFactor以及MaxMergeDocs的基础上,增加了如下参数:
最大合并阈值-MemMaxMergeDocs,该参数表示内存中可容纳的最大文档数量,该参数为根据内存的实际使用情况设定,较佳情况下,该参数设置为:
FirstLevelMergeFactor乘以MergeFactor的N次方;
目标合并文档数-TargetMergeDocs,该参数表示当前合并的索引段中包含的文档数量,该参数为变量,一般情况下,其初始值为FirstLevelMergeFactor,该参数的更新公式为:
TargetMergeDocs=TargetMergeDocs*MergeFactor;
其中:等号前面的“TargetMergeDocs”为更新后的值,等号后面的“TargetMergeDocs”为更新前的值,MergeFactor为磁盘中子索引段的合并频率。
根据本发明实施例,首先提供了一种索引建立方法,如图1所示,该方法主要包括如下步骤:
步骤101、索引一篇文档,在内存中为该文档创建一个索引段并保存。
步骤102、监测内存中保存的包含单文档的索引段的数量。
步骤103、判断内存中保存的包含单文档的索引段的数量是否达到第一阈值,若是,则执行步骤104,否则返回步骤101。
本发明优选实施例中,第一阈值的取值根据内存空间的大小确定,一般情况下,内存空间越大,第一阈值可以设置的相对较大。
步骤104、将包含单文档的索引段合并为一个包含第一阈值个文档的索引段。
步骤105、监测内存中包含第一阈值个文档的索引段的数量。
步骤106、判断内存中保存的包含第一阈值个文档的索引段的数量达到第二阈值,若是,则执行步骤107,否则返回步骤101。
本发明优选实施例中,第二阈值的取值根据内存空间的大小确定,一般情况下,内存空间越大,第二阈值可以设置的相对较大,并且,第二阈值一般小于第一阈值。
步骤107、将包含第一阈值个文档的索引段合并为一个包含第一阈值乘以第二阈值个文档的索引段,并当内存中所有索引段包含的文档总数达到内存最大合并阈值时,将内存中的所有索引段合并为包含最大合并阈值个文档的索引段写入磁盘。
本发明又一个实施例中,当将内存中的满足写入磁盘的索引段写入到磁盘后,进一步进行如下操作:
判断所有文档是否索引完毕,在确定所有文档索引完毕并且内存中存储有未写入磁盘的索引段时,将未写入磁盘的索引段合并为一个索引段并写入磁盘。
进行以上操作的目的在于避免由于索引完所有文档后内存中保存的索引段中包含的文档数量不满足写入磁盘的要求,而无法写入磁盘的问题,通过该操作,保证所有索引的文档都可以写入到内存中。
本发明又一个实施例中,将内存中的满足写入磁盘的索引段写入到磁盘后,进一步对磁盘中的索引段进行合并,具体合并过程如下:
监测磁盘中包含最大合并阈值个文档的索引段的数量;
当磁盘中包含最大合并阈值个文档的索引段的数量达到第三阈值时,将包含最大合并阈值个文档的索引段合并为一个包含最大合并阈值乘以第三阈值个文档的索引段。
本发明优选实施例中,第三阈值与第二阈值取相同值。
本发明一个实施例提供的方法中,还进一步将磁盘中设定个数的索引段合并为一个索引段,合并得到的索引段中包含的文档数不大于第四阈值。其中,合并的索引段中包含的文档数可以不相同。
本发明优选实施例中,第四阈值为第一阈值、第二阈值、第三阈值的设定次方的乘积。
本发明又一个实施例中,为了进一步减少索引段的数量,在确定所有文档索引完毕并且写入磁盘后,可以进一步根据预设的第五阈值对磁盘中保存的索引段进行优化合并。具体优化的过程包括:将磁盘中包含的文档数小于第五阈值的索引段合并为一个索引段,以及,将磁盘中包含的文档数大于等于第五阈值、小于第四阈值的索引段合并为一个索引段。
以上方案在具体实施时,在内存中维护一个索引段(segment)的管理队列,如图2所示,该管理队列里的segment按照所含文档(doc)的个数由大到小排列,即:
segment1中包含的doc数>segment2中包含的doc数>......>segmentN中包含的doc数。
通过图2所示的管理队列对索引过程进行监控,以控制文档的合并与写入磁盘。在启动索引过程后,对索引文档的合并以及写入磁盘的控制过程,具体如图3所示,包括如下步骤:
步骤301、索引一篇文档,在内存中为该文档创建一个segment,并加入管理队列尾部。
该步骤中,管理队列尾部的segment由于是由新加入的文档形成的segment,因此,管理队列尾部的segment中包含的文档数为1。
步骤302、判断未合并索引文档的数量是否达到FirstLevelMergeFactor(第一阈值),若是,则执行步骤303~步骤311,否则返回步骤301。
该步骤中,当前未合并索引文档的数据也即新加入管理队列中的只包含一个文档的segment的数量。
步骤303、将该FirstLevelMergeFactor个的索引文档合并为一个索引段。
如图4所示,假设FirstLevelMergeFactor=500,在步骤301索引文档之前,管理队列中未合并索引文档(segment)的数量为499,当执行为步骤301,即新加入一个索引文档后,未合并索引文档(segment)的数量为500,则合并后,将该500个只包含一个文档的segment合并为1个包含500个文档的segment。
步骤304、初始化目标合并文档数TargetMergeDocs。
该步骤中,将TargetMergeDocs初始化为合并为最小索引段时要求的文档数,即FirstLevelMergeFactor。
应当理解,该初始化的步骤也可以在执行本流程之前执行,或在步骤301新索引一篇文档后执行。
步骤305、从管理队列尾部开始扫描,并判断当前扫描的segment所含doc数是否小于当前TargetMergeDocs,若是,则执行步骤306,否则结束本轮扫描并执行步骤307。
该步骤中,本轮扫描结束的情况包括:当前扫描的segment中doc个数大于等于当前TargetMergeDocs,或扫描至管理队列头。
步骤306、将当前segment加入待合并队列。
步骤307、判断待合并队列所有segment所含doc数量之和是否大于等于TargetMergeDocs,若否,返回步骤305;若是,执行步骤308。
步骤308、判断当前TargetMergeDocs是否小于MemMaxMergeDocs(最大合并阈值),若是,则执行步骤309,若否,执行步骤310。
步骤309、将当前待合并队列中的segment在内存中合并,继续执行步骤311。
步骤310、将当前待合并队列中的segment合并,并写入磁盘,继续执行步骤311。
步骤311、更新TargetMergeDocs,并判断更新后的TargetMergeDocs是否小于等于MaxMergeDocs(第四阈值),若是,则返回步骤305,否则执行步骤312。
该步骤中,TargetMergeDocs的更新公式如下:
TargetMergeDocs=TargetMergeDocs*MergeFactor;
本实施例中,取第二阈值=第三阈值=MergeFactor。
其中:等号前面为更新后的TargetMergeDocs,作为返回步骤305后当前TargetMergeDocs。
步骤312、判断是否索引完毕,若否,则返回步骤301,若是,则执行步骤313。
步骤313、判断内存中是否还有未写入磁盘的文档,若是,则执行步骤314,否则结束。
步骤314、将内存中未写入磁盘的文档合并为一个索引段并写入磁盘。
根据本发明以上实施例,由于在内存中增加了一级内存合并,降低了写入磁盘的频率,使得最终索引段中可容纳的文档数量提高,减少了索引段的数量,在检索时,加速了检索的效率。
本发明实施例中,内存中索引段可以采取普通的存储方式,即为每一个索引段分配固定的内存空间,当索引段的大小大于一个内存空间时,则再为该索引段分配整数个内存空间,但该种方式容易造成内存空间的浪费,当一个索引段的大小不是内存空间大小的整数倍时,则剩余的不足一个内存空间大小的部分也要被分配一个内存空间。为了避免内存空间的浪费,本发明实施例中在内存中索引段可以采取现有的差量存储技术进行存储。
本发明又一实施例中,还引入了优化合并因子——OptimizeMergeDocs,用于在合并结束后对磁盘中的最终索引段进行优化合并,如图5所示,优化合并过程如下:
步骤501、扫描每个segment中包含的文档数量;
步骤502、将小于OptimizeMergeDocs的索引段合并为一个索引段,将大于等于OptimizeMergeDocs小于MaxMergeDocs的索引段合并为一个索引段。
根据上述优化过程,可以进一步减少最终索引段的数量,使得合并后的结果为若干个包含MaxMergeDocs个文档的最大索引段,一个包含的文档数量在MaxMergeDocs与OptimizeMergeDocs之间的索引段以及一个包含的文档数量小于OptimizeMergeDocs的小索引段,这样在进行索引更新时只需更新最后一个小索引段,从而大大提升索引更新性能。
为了更好地理解本发明实施例提供的技术方案,以下结合具体的实例对本发明实施例进行详细说明:
假设要索引1000万篇文档,一个doc的segment大小为120KB,具体参数定义如下:
FirstLevelMergeFactor(第一阈值)=500;
MergeFactor(第二阈值或第三阈值)=20;
MemMaxMergeDocs(最大合并阈值,此处定义为第一阈值乘以第二阈值)=10000;
MaxMergeDocs(第四阈值)=4000000;
OptimizeMergeDocs(第五阈值)=200000。
根据以上参数定义,内存中最多有500个单文档的segment,约占60MB。将这500个segment合并,由于充分利用了每个内存空间和差量存储技术,合并后的segment将远远小于60MB,根据经验值,合并后占用的内存空间一般不大于1MB。因此,内存最高占用空间为:1MB*19+60MB=79MB。
根据以上参数定义以及本发明实施例提供的以上技术方案,索引完所有文档经历如下过程:
将500个单文档的segment合并为1个包含500文档的segment;
将20个包含500文档的segment合并为1个包含1万文档的segment并写入磁盘;
将20个包含1万文档的segment合并为1个包含20万文档的segment;
将20个包含20万文档的segment合并为1个包含400万文档的segment。
在磁盘中进行优化后,最终磁盘上将生成2个包含400万文档的segment和1个包含20万文档的segment,共3个。如果不进行优化,则在最坏的情况下,segment个数为2个包含400万文档的segment和10个包含20万文档的segment,共12个。
可见,根据本发明实施例可以使最终合并得到的索引段优化到做少,为了更好地体现本发明达到的效果,以下对现有技术索引相同数目的文档得到的索引段进行简单分析:
如果不采用本发明以上实施例提供的技术方案进行索引,为了提高索引段容量,只能尽可能调高FirstLevelMergeFactor和SegmentsMergeFactor,根据经验值,一种较优的情况下,可以设置各参数如下:
FirstLevelMergeFactor=1000,SegmentsMergeFactor=40,MaxMergeDocs=1600000。
根据以上参数设置,内存最高约占120M,索引完所有文档经历如下过程:
将1000个包含单文档的segment合并为1个包含1000文档的segment,并写入到磁盘;
将40个包含1000个文档的segment合并为1个包含4万文档的segment;
将40个包含4万文档的segment合并为为1个包含160万文档的segment。
在优化的情况下,最终磁盘上将生成6个包含160万文档的segment和10个包含4万文档的segment,共16个。而如果不优化,在最坏的情况下,如总的文档数略小于1600万时,将会有40个4万的segment,索引段的数量更多。
与上述实施例所述的索引的建立方法对应,本发明实施例还提供了一种索引的建立装置,如图6所示,该装置包括:
第一监测单元601、第一合并单元602、第二监测单元603以及第二合并单元604;其中:
第一监测单元601,用于监测第一存储区域中存储的包含单文档的索引段的数量;
第一合并单元602,用于当第一监测单元601监测的包含单文档的索引段的数量达到第一阈值时,将包含单文档的索引段合并为一个包含第一阈值个文档的索引段;
第二监测单元603,用于监测第一存储区域中存储的第一阈值个文档的索引段的数量;
第二合并单元604,用于当第二监测单元603监测的包含第一阈值个文档的索引段的数量达到第二阈值时,将包含第一阈值个文档的索引段合并为一个包含第一阈值乘以第二阈值个文档的索引段,并当第一存储区域中所有索引段包含的文档总数达到设定的最大合并阈值时,将第一存储区域中的所有索引段合并为包含所述最大合并阈值个文档的索引段写入第二存储区域。
如图7所示,本发明又一实施例中,图6所示装置还可以进一步包括:
第三合并单元605,用于在第二合并单元604将满足写入第二存储区域的索引段写入到第二存储区域,并且在确定所有文档索引完毕并且第一存储区域中存储有未写入第二存储区域的索引段时,将第一存储区域中未写入第二存储区域的索引段合并为一个索引段并写入第二存储区域。
如图8所示,本发明又一实施例中,图6所示装置还可以进一步包括:
第三监测单元606,以及第四合并单元607;其中:
第三监测单元606,用于监测第二存储区域中包含最大合并阈值个文档的索引段的数量;
第四合并单元607,用于当第三监测单元606监测的包含最大合并阈值个文档的索引段的数量达到第三阈值时,将包含最大合并阈值个文档的索引段合并为一个包含最大合并阈值乘以第三阈值个文档的索引段。
进一步地,一个实施例中,上述第四合并单元607还用于:将第二存储区域中设定个数的索引段合并为一个索引段,合并得到的索引段中包含的文档数不大于第四阈值。
如图9所示,为了使完成索引后包含的索引段的数量更优化,图8所示装置还可以进一步包括用于优化索引段的数量的优化合并单元608,该单元具体用于:
在确定所有文档索引完毕并且写入第二存储区域后,根据预设的第五阈值对第二存储区域中保存的索引段进行优化合并。
一个实施例中,优化合并单元608具体用于:
将第二存储区域中包含的文档数小于所述第五阈值的索引段合并为一个索引段,以及,将第二存储区域中包含的文档数大于等于第五阈值、小于第四阈值的索引段合并为一个索引段。
应当理解,以上索引建立装置所实现的功能与索引建立方法一一对应,对应该装置各个功能单元所实现的更为详细的处理流程,在上述方法实施例中已做详细描述,此处不再详细描述。
通过本发明实施例提供的上述至少一个技术方案,在建立索引时,首先监测第一存储区域中保存的包含单文档的索引段的数量,当包含单文档的索引段的数量达到第一阈值时,将包含单文档的索引段合并为包含第一阈值文档的索引段;然后进一步监测第一存储区域中包含第一阈值文档的索引段的数量,当包含第一阈值文档的索引段的数量达到第二阈值时,将包含第一阈值文档的索引段合并为包含第一阈值乘以所述第二阈值文档的索引段,并当第一存储区域中所有索引段包含的文档总数达到设定的最大合并阈值时,将第一存储区域中的所有索引段合并为包含最大合并阈值文档的索引段写入第二存储区域,根据该技术方案,在第一存储区域中增加了索引段的合并过程,减少了写入第二存储区域的频率,并且增加了最终索引段中包含的文档数量,在索引文档数目一定时减少了索引段的个数,从而在不影响检索性能的前提下,提高了检索效率。
进一步地,由于现有技术中每索引一篇文档都会将该文档作为一个单独的索引段保存,在保存时为每一个索引段分配固定的内存空间,例如10K,如果索引段的大小超过10K,例如11K,则为该索引段分配2个内存空间,即20K的内存空间,这样,这个索引段占用的内存空间就比其时间大小要大,而一般索引段的大小都很难保证是文档大小的整数倍,因此很多索引段占用的内存空间往往比自身大小大,从而造成很多内存空间的浪费。而根据本发明以上实施例,由于在内存中增加了一级内存合并,从而减少了内存空间的浪费,例如,2个11K的索引段,在合并前要占用4个10K的内存空间,浪费18K的内存空间,在不采用差量存储技术时,合并后最多占用3个10K的内存空间,若采用差量存储技术存储则占用更少的内存空间,因此,根据本发明实施例可以在内存使用基本不变的情况下,增加缓存在内存中的文档数量,降低了向磁盘中写入数据的频率,保证了索引性能,并且由于得到的最终索引段的容量大,索引段的数量少,减少了检索时要打开、读取、处理的索引段,从而提高了检索效率。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。