一种数据索引构建方法、装置、电子设备及存储介质转让专利

申请号 : CN202110609042.5

文献号 : CN113254451B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 胡广银

申请人 : 北京城市网邻信息技术有限公司

摘要 :

本发明提供了一种数据索引构建方法、装置、电子设备及存储介质。所述方法,包括:针对每个数据对象,获取每个所述数据对象的有效时间段和索引相关信息,所述索引相关信息至少包含所述数据对象的身份标识;基于每个所述数据对象的索引相关信息,以及各个数据对象的有效时间段之间的占用关系,构建时间序列索引树;其中,所述时间序列索引树包括二叉查找树、平衡二叉树、B+树中的任意一种,所述时间序列索引树中每个节点为一个时间段,且作为节点的各个时间段互不重叠,每个所述数据对象的有效时间段对应于至少一个节点。

权利要求 :

1.一种数据索引构建方法,其特征在于,包括:针对每个数据对象,获取每个所述数据对象的有效时间段和索引相关信息,所述索引相关信息至少包含所述数据对象的身份标识;

基于每个所述数据对象的索引相关信息,以及各个数据对象的有效时间段之间的占用关系,构建时间序列索引树;

其中,所述时间序列索引树包括二叉查找树、平衡二叉树、B+树中的任意一种,所述时间序列索引树中每个节点为一个时间段,且作为节点的各个时间段互不重叠,每个所述数据对象的有效时间段对应于至少一个节点;

所述构建时间序列索引树为平衡二叉树或者二叉查找树的情况下,基于每个所述数据对象的索引相关信息,以及各个数据对象的有效时间段之间的占用关系,构建时间序列索引树,包括:针对任一新增的目标数据对象,获取所述时间序列索引树中待分裂的目标节点,对所述目标节点进行分裂处理,得到多个分裂节点,并根据所述目标数据对象的索引相关信息更新每个第一节点的节点信息,在所述时间序列索引树中删除所述目标节点,并插入每个所述分裂节点。

2.根据权利要求1所述的方法,其特征在于,在所述时间序列索引树为平衡二叉树的情况下,所述基于每个所述数据对象的索引相关信息,以及各个数据对象的有效时间段之间的占用关系,构建时间序列索引树的步骤,还包括:对插入新节点的时间序列索引树进行平衡处理。

3.根据权利要求1所述的方法,其特征在于,所述目标节点包括在所述目标数据对象的有效时间段的开始时间占用的节点,和/或所述目标数据对象的有效时间段结束时间占用的节点;所述目标节点与所述目标数据对象的有效时间段之间的占用关系包括以下至少一种:目标节点左侧段被所述目标数据对象的有效时间段占用、目标节点右侧段被所述目标数据对象的有效时间段占用、目标节点中间段被所述目标数据对象的有效时间段占用。

4.根据权利要求3所述的方法,其特征在于,所述对所述目标节点进行分裂处理,得到多个分裂节点的步骤,包括:

针对任一目标节点,获取所述目标节点中被所述目标数据对象的有效时间段占用的目标时间段,以所述目标时间段作为冲突节点,并以所述冲突节点作为一个分裂节点;

获取所述目标节点中除所述目标时间段,且被所述目标时间段分割的每个其他时间段,分别作为一个分裂节点;

所述在所述时间序列索引树中删除所述目标节点,并插入每个所述分裂节点的步骤,包括:

以所述冲突节点继承所述目标节点在所述的时间序列索引树中的位置;

对于每个其他分裂节点,在所述时间序列索引树中选择所述其他分裂节点的插入位置,并插入所述其他分裂节点,所述其他分裂节点为除所述冲突节点之外的分裂节点。

5.根据权利要求4所述的方法,其特征在于,所述对于每个其他分裂节点,在所述时间序列索引树中选择所述其他分裂节点的插入位置,并插入所述其他分裂节点的步骤,包括:响应于所述占用关系为目标节点左侧段被所述目标数据对象的有效时间段占用,从所述目标节点或者所述目标节点的右侧相邻节点上选择所述其他分裂节点的插入位置,并插入所述其他分裂节点;

响应于所述占用关系为目标节点右侧段被所述目标数据对象的有效时间段占用,从所述目标节点或者所述目标节点的左侧相邻节点上选择所述其他分裂节点的插入位置,并插入所述其他分裂节点;

响应于所述占用关系为目标节点中间段被所述目标数据对象的有效时间段占用,对于所述冲突节点左侧的其他分裂节点,从所述目标节点或者所述目标节点的左侧相邻节点上选择所述其他分裂节点的插入位置,对于所述冲突节点右侧的其他分裂节点,从所述目标节点或者所述目标节点的右侧相邻节点上选择所述其他分裂节点的插入位置,并插入每个所述其他分裂节点。

6.根据权利要求1所述的方法,其特征在于,所述方法还包括:针对任一被取消的历史数据对象,在所述时间序列索引树中搜索包含所述历史数据对象的身份标识的节点,作为所述历史数据对象的分布节点;

在每个所述分布节点中,删除所述历史数据对象的索引相关信息;

在所述时间序列索引树中,对所述历史数据对象的开始时间节点以及结束时间节点进行消解合并处理,以减少所述时间序列索引树中非必要节点的数量;

其中,所述历史数据对象的开始时间节点为所述历史数据对象的开始时间所在的节点,所述历史数据对象的结束时间节点为所述历史数据对象的结束时间所在的节点。

7.根据权利要求6所述的方法,其特征在于,所述在所述时间序列索引树中,对所述历史数据对象的开始时间节点以及结束时间节点进行消解合并处理的步骤,包括:针对已删除所述索引相关信息的开始时间节点,响应于所述开始时间节点与其一左侧相邻节点所包含的信息一致,将所述开始时间节点与所述开始时间节点的左侧相邻节点合并,并将所述开始时间节点的右子树移动至合并后节点的右孩子上;

针对已删除所述索引相关信息的结束时间节点,响应于所述结束时间节点与其一右侧相邻节点所包含的信息一致,将所述结束时间节点与所述结束时间节点的右侧相邻节点合并,并将所述结束时间节点的左子树移动至合并后节点的左孩子上。

8.根据权利要求1所述的方法,其特征在于,所述方法还包括:响应于针对所述时间序列索引树中在指定时间节点之前的无效数据对象的删除请求,在所述时间序列索引树中搜索出全部所述无效数据对象涉及的节点,作为无效节点,并依次删除每个所述无效节点;

和/或,

响应于针对所述时间序列索引树中在指定时间节点之前的无效数据对象的删除请求,在所述时间序列索引树中搜索出全部所述无效数据对象涉及的节点,作为无效节点,并将全部无效节点作为整体完整删除;

其中,所述无效数据对象为有效时间段在所述指定时间节点之前,且至少覆盖一个节点的数据对象。

9.根据权利要求8所述的方法,其特征在于,所述在所述时间序列索引树中搜索出全部所述无效数据对象涉及的节点,作为无效节点,并将全部无效节点作为整体完整删除的步骤,包括:

按中序搜索在所述时间序列索引树中搜索所述无效节点;

响应于在所述时间序列索引树中的任一目标范围内,所述无效节点的分布满足第一分布条件,将所述目标范围内的全部无效节点合并为一个节点;

响应于在所述目标范围内,所述无效节点的分布满足第二分布条件,将所述目标范围内的全部无效节点合并为一个节点,并将第四部分移动至第二部分的最左子树上;

其中,所述目标范围包括所述时间序列索引树本身,或者所述时间序列索引树中的任一以第一部分的根节点为根节点的子树;所述第一分布条件包括所述目标范围内缺失第二部分、第三部分、第四部分中的任意至少一个;所述第二分布条件包括所述目标范围内同时包含第二部分、第三部分、第四部分;所述第一部分、第二部分、第三部分和第四部分按照从上到下的顺序依次连接,且所述第一部分和所述第三部分为无效节点区域,所述第二部分和所述第四部分为有效节点区域,所述无效节点区域中包含至少一个无效节点,所述有效节点区域中包含至少一个有效节点,所述有效节点为所述时间序列索引树中除所述无效节点之外的任一其他节点,如果所述第一部分的根节点为所述时间序列索引树的根节点,所述目标范围为所述时间序列索引树本身,如果所述第一部分的根节点不是所述时间序列索引树的根节点,所述目标范围为所述时间序列索引树中的任一以所述第一部分的根节点为根节点的子树。

10.根据权利要求1所述的方法,其特征在于,在所述时间序列索引树为B+树的情况下,所述基于每个所述数据对象的索引相关信息,以及各个数据对象的有效时间段之间的占用关系,构建时间序列索引树的步骤,包括:针对任一新增的目标数据对象,响应于所述目标数据对象的有效时间段与所述时间序列索引树中叶子节点包含的关键字不适配,根据目标数据对象的有效时间段,以及每个所述叶子节点的有效时间段,获取所述时间序列索引树中待分裂的目标节点,并在所述目标节点中获取需要分裂的目标关键字;

根据所述目标数据对象的有效时间段,将所述目标关键字分裂为冲突关键字和初始关键字并存储于所述目标节点中;

响应于所述目标节点大于B+树的阶数,则按照B+树的构造算法分裂所述目标节点。

11.根据权利要求10所述的方法,其特征在于,所述方法,还包括:针对任一被取消的历史数据对象,在所述时间序列索引树中搜索包含所述历史数据对象的身份标识的关键字;

针对任一所述关键字,删除所述关键字中包含的所述历史数据对象的索引相关信息。

12.根据权利要求11所述的方法,其特征在于,所述方法,还包括:针对任一已删除所述历史数据对象的索引相关信息的关键字,所述关键字与其相邻关键字中包含的信息一致,删除所述关键字;

针对删除所述关键字的节点,响应于所述节点小于B+树的阶数的一半,则按照B+树的构造算法合并所述节点。

13.一种数据索引构建装置,其特征在于,包括:基础数据获取模块,用于针对每个数据对象,获取每个所述数据对象的有效时间段和索引相关信息,所述索引相关信息至少包含所述数据对象的身份标识;

TSI树构建模块,用于基于每个所述数据对象的索引相关信息,以及各个数据对象的有效时间段之间的占用关系,构建时间序列索引树,构建时间序列索引树为平衡二叉树或者二叉查找树的情况下,包括:针对任一新增的目标数据对象,获取所述时间序列索引树中待分裂的目标节点,对所述目标节点进行分裂处理,得到多个分裂节点,并根据所述目标数据对象的索引相关信息更新每个第一节点的节点信息,在所述时间序列索引树中删除所述目标节点,并插入每个所述分裂节点;

其中,所述时间序列索引树包括二叉查找树、平衡二叉树、B+树中的任意一种,所述时间序列索引树中每个节点为一个时间段,且作为节点的各个时间段互不重叠,每个所述数据对象的有效时间段对应于至少一个节点。

14.一种电子设备,其特征在于,包括:处理器、存储器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如权利要求1至

12中任一项所述的数据索引构建方法的步骤。

15.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求1至12中任一项所述的数据索引构建方法的步骤。

说明书 :

一种数据索引构建方法、装置、电子设备及存储介质

技术领域

[0001] 本发明涉及计算机技术领域,尤其涉及一种数据索引构建方法、装置、电子设备及存储介质。

背景技术

[0002] 随着计算机技术的快速发展,通过索引技术进行数据的存储和读取的应用范围越来越广。业界关于库存的实现主要依赖于数据库和ElasticSearch(一个基于Lucene的搜索
服务器)的实现。
[0003] 传统的RDBMS(Relational Database Management System,关系数据库管理系统)在商品聚合搜索场景中往往需要搜索出很多的商品订单数据用于聚合出商品的消耗库存
数据,而库存系统相对来说一个写少读多的系统,聚合大量的数据可以来说非常影响搜索
的性能。而TSDB(Time Series Database,时间序列数据库)由于底层采用的是LSM(Log‑
Structured‑Merge,日志结构合并)树,适合写多读少的场景,不太适合进行实时搜索的读
多写少的应用场景。ES(Elasticsearch),弹性搜索(例如分布式搜索和数据分析引擎)是基
于Luence实现的倒排索引。Lucene在查询过程中是基于Segment (段),但是索引过程的文
档不会被立即合并到可供查询的Segment上,这对于库存检索的实时性有一定的阻碍。
[0004] 由上述分析可知,上述索引技术很难实现时间序列搜索的高性能和实时性。

发明内容

[0005] 本发明实施例提供一种数据索引构建方法、装置、电子设备及存储介质,以解决相关技术方案中很难实现时间序列搜索的高性能和实时性的技术问题。
[0006] 为了解决上述技术问题,本发明是这样实现的:
[0007] 第一方面,本发明实施例提供了一种数据索引构建方法,包括:
[0008] 针对每个数据对象,获取每个所述数据对象的有效时间段和索引相关信息,所述索引相关信息至少包含所述数据对象的身份标识;
[0009] 基于每个所述数据对象的索引相关信息,以及各个数据对象的有效时间段之间的占用关系,构建时间序列索引树;
[0010] 其中,所述时间序列索引树包括二叉查找树、平衡二叉树、B+树中的任意一种,所述时间序列索引树中每个节点为一个时间段,且作为节点的各个时间段互不重叠,每个所
述数据对象的有效时间段对应于至少一个节点。
[0011] 第二方面,本发明实施例提供了一种数据索引构建装置,包括:
[0012] 基础数据获取模块,用于针对每个数据对象,获取每个所述数据对象的有效时间段和索引相关信息,所述索引相关信息至少包含所述数据对象的身份标识;
[0013] TSI树构建模块,用于基于每个所述数据对象的索引相关信息,以及各个数据对象的有效时间段之间的占用关系,构建时间序列索引树;
[0014] 其中,所述时间序列索引树包括二叉查找树、平衡二叉树、B+树中的任意一种,所述时间序列索引树中每个节点为一个时间段,且作为节点的各个时间段互不重叠,每个所
述数据对象的有效时间段对应于至少一个节点。
[0015] 第三方面,本发明实施例另外提供了一种电子设备,包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执
行时实现如第一方面所述的数据索引构建方法的步骤。
[0016] 第四方面,本发明实施例另外提供了一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如第一方
面所述的数据索引构建方法的步骤。
[0017] 在本发明实施例中,针对每个数据对象,获取每个所述数据对象的有效时间段和索引相关信息,所述索引相关信息至少包含所述数据对象的身份标识;基于每个所述数据
对象的索引相关信息,以及各个数据对象的有效时间段之间的占用关系,构建时间序列索
引树;其中,所述时间序列索引树包括二叉查找树、平衡二叉树、B+树中的任意一种,所述时
间序列索引树中每个节点为一个时间段,且作为节点的各个时间段互不重叠,每个所述数
据对象的有效时间段对应于至少一个节点。从而基于TSI实现时间序列搜索的高性能和实
时性。

附图说明

[0018] 图1是本发明实施例中的一种数据索引构建方法的步骤流程图;
[0019] 图2A是本发明实施例中的一种在TSI的总体结构是平衡二叉树的情况下,时序索引在空间的映射示意图;
[0020] 图2B是本发明实施例中的一种新加入的数据对象的有效时间段与时间序列索引树中已有节点的有效时间段之间的占用关系示意图;
[0021] 图2C是本发明实施例中的一种导致节点分裂的目标节点与目标数据对象的有效时间段之间的占用关系示意图;
[0022] 图2D是本发明实施例中的一种目标节点右侧段被所述目标数据对象的有效时间段占用,原节点在TSI中的三种相对位置示意图;
[0023] 图2E是本发明实施例中的一种目标节点左侧段被所述目标数据对象的有效时间段占用,原节点在TSI中的三种相对位置示意图;
[0024] 图2F是本发明实施例中的一种历史数据对象的开始时间节点需要消解合并时的消解合并过程示意图;
[0025] 图2G是本发明实施例中的一种目标范围内包含的各部分的示意图;
[0026] 图2H是本发明实施例中的一种基于B+树构建的TSI树的结构示意图;
[0027] 图3是本发明实施例中的另一种数据索引构建方法的步骤流程图;
[0028] 图4A是本发明实施例中的一种基于B+树构建TSI树的流程示意图;
[0029] 图4B是本发明实施例中的一种在B+树结构的TSI中数据的删除流程示意图;
[0030] 图5是本发明实施例中的一种数据索引构建装置的结构示意图。

具体实施方式

[0031] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发
明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施
例,都属于本发明保护的范围。
[0032] 参照图1,示出了本发明实施例中一种数据索引构建方法的步骤流程图。
[0033] 步骤110,针对每个数据对象,获取每个所述数据对象的有效时间段和索引相关信息,所述索引相关信息至少包含所述数据对象的身份标识;
[0034] 步骤120,基于每个所述数据对象的索引相关信息,以及各个数据对象的有效时间段之间的占用关系,构建时间序列索引树;其中,所述时间序列索引树包括二叉查找树、平
衡二叉树、B+树中的任意一种,所述时间序列索引树中每个节点为一个时间段,且作为节点
的各个时间段互不重叠,每个所述数据对象的有效时间段对应于至少一个节点。
[0035] 在本发明实施例中,为了构建数据对象的时间序列索引树,可以将时间按照数据对象的有效时间段映射成树结构,从而实现在TSI(Time Series Index,时间序列索引)上
进行搜索。而且,通过TSI树在空间上实现了时间上的连续。
[0036] 具体地,则可以针对每个数据对象,获取每个所述数据对象的有效时间段和索引相关信息,所述索引相关信息至少包含所述数据对象的身份标识;进而基于每个所述数据
对象的索引相关信息,以及各个数据对象的有效时间段之间的占用关系,构建时间序列索
引树;其中,时间序列索引树可以包括但不限于二叉查找树(BST,Binary Search Tree)、平
衡二叉树(AVL)、 B+树中的任意一种。
[0037] 二叉查找树(BST,Binary Search Tree),也叫二叉排序树,在二叉树的基础上需要满足:任意节点的左子树上所有节点值不大于根节点的值,任意节点的右子树上所有节
点值不小于根节点的值。如下是一颗BST。当需要快速查找时,将数据存储在BST是一种常见
的选择,因为此时查询时间取决于树高,平均时间复杂度是O(lgn)。然而,BST可能长歪而变
得不平衡,此时 BST退化为链表,时间复杂度退化为O(n)。为了解决这个问题,引入了平衡
二叉树。
[0038] AVL树是严格的平衡二叉树,所有节点的左右子树高度差不能超过1; AVL树查找、插入和删除在平均和最坏情况下都是O(lgn)。AVL实现平衡的关键在于旋转操作:插入和删
除可能破坏二叉树的平衡,此时需要通过一次或多次树旋转来重新平衡这个树。当插入数
据时,最多只需要1次旋转(单旋转或双旋转);但是当删除数据时,会导致树失衡,AVL需要
维护从被删除节点到根节点这条路径上所有节点的平衡,旋转的量级为O(lgn)。B+树也是
多路平衡查找树,B+树在B树的基础上,将非叶节点改造为不存储数据的纯索引节点,进一
步降低了树的高度;此外将叶节点使用指针连接成链表,范围查询更加高效。
[0039] 在本发明实施例中涉及的数据对象可以理解为任何一种具有有效时间的数据,例如租车订单,该订单的车辆租赁时间段即为该租车订单的有效时间,或者人员工作安排,那
么该人员针对某一任务的计划工作时间段则可以理解为相应人员针对该任务的数据对象
的有效时间,等等。
[0040] 如图2A所示为一种在TSI的总体结构是平衡二叉树的情况下,时序索引在空间的映射示意图。其中每一个横向短线段为时间序列索引树中的一个节点Node,每个节点可以
理解为一个时间段,而且节点数据结构,也即节点信息可以包括但不限于Eventid(数据对
象的身份标识/事件的身份标识,例如库存系统中的商品使用订单标识)列表、数据对象所
占用目标的数量(例如,该节点对应的每个订单所消耗的商品数量)、数据对象的有效时间
段(例如订单服务的时间段)以及摘要数据(业务的个性化数据,例如订单详情信息、订单发
起方的信息等)等部分。
[0041] 在本发明实施例中,在构建时间序列索引树时,可以依次根据各个数据对象的有效时间段之间的占用关系而导致的冲突,在时间序列索引树中构建以及拆分节点。而且,在
构建时间序列索引树时,可以根据不同类型的时间序列索引树的构建规则,确定每个数据
对象所对应的节点,以及各个数据对象所对应的节点的节点类型(例如是根节点、叶子节
点,还是索引节点等),同时确定各个节点之间的连接关系,对此本发明实施例不加以限定。
[0042] 参照图2,在本发明实施例中,在所述时间序列索引树为平衡二叉树的情况下,所述步骤120进一步可以包括:
[0043] 步骤A121,针对任一新增的目标数据对象,根据所述目标数据对象的有效时间段与所述时间序列索引树中已有节点的有效时间段之间的占用关系,获取所述时间序列索引
树中待分裂的目标节点;
[0044] 步骤A122,对所述目标节点进行分裂处理,得到多个分裂节点,并根据所述目标数据对象的索引相关信息更新每个第一节点的节点信息,所述第一节点包括所述分裂节点,
以及所述目标数据对象的有效时间段完全覆盖的各个节点;
[0045] 步骤A123,在所述时间序列索引树中删除所述目标节点,并插入每个所述分裂节点;
[0046] 步骤A124,对插入新节点的时间序列索引树进行平衡处理。
[0047] 在实际应用中,数据对象的有效时间段具有一定的任意性。以用户通过下单以租用某一目标(例如车辆、钟点工)的订单为例,由于用户所需求的服务时间具有任意性,因此
作为数据对象的订单的有效时间段也具有任意性。因此,在构建时间序列索引树的过程中,
插入新的节点的有效时间段也具有任意性,也即后插入的节点的有效时间段可能会占用时
间序列索引树中已有节点的部分有效时间段,从而容易导致时间序列索引树的构建过程中
节点的分裂。
[0048] 因此,在本发明实施例中,在构建时间序列索引树的过程中,可以依次在时间序列索引树中构建每个数据对象对应的节点,如果某一待新增入时间序列索引树的数据对象,
也即新增的目标数据对象的有效时间段占用时间序列索引树中部分已有节点的有效时间
段,那么为了避免多个各个节点之间存在冲突,则需要对已有节点进行分裂处理。
[0049] 例如,以上述的租车订单作为数据对象为例,假设某一待新增的租车订单的有效时间段为2021年4月26日至2021年4月27日,而时间序列索引树中已有节点的有效时间段为
2021年4月26日至2021年4月28日,此时则可以将该已有节点的有效时间段拆分为2021年4
月26日至2021年4月 27日、2021年4月28日两个时间段,也即可以将时间序列索引树中该已
有节点分裂为两个节点,其中一个节点的有效时间段为2021年4月26日至 2021年4月27日,
另一个节点的有效时间段为2021年4月28日,相应地可以调整分裂后各个节点的节点信息,
保证有效时间段为2021年4月26日至2021年4月27日的节点的节点信息包含新增的租车订
单的索引相关信息、以及分裂前节点对应的订单的索引相关信息,而对于有效时间段为
2021年4 月28日的节点,其节点信息则可以包含分裂前节点对应的订单的索引相关信息。
[0050] 因此,在本发明实施例中,针对任一待新增索引的目标数据对象而言,则可以根据所述目标数据对象的有效时间段与所述时间序列索引树中已有节点的有效时间段之间的
占用关系,获取所述时间序列索引树中待分裂的目标节点,进而对每个目标节点进行分裂
处理,得到多个分裂节点,并根据所述目标数据对象的索引相关信息更新每个第一节点的
节点信息,所述第一节点包括所述分裂节点,以及所述目标数据对象的有效时间段完全覆
盖的各个节点,在分裂完成后则可以在所述时间序列索引树中删除所述目标节点,并插入
每个所述分裂节点;此后,为了保证平衡二叉树的平衡性,则可以进一步对插入新节点的时
间序列索引树进行平衡处理。
[0051] 而且,在本发明实施例中,可以采用任何可用方式对插入新节点的时间序列索引树进行平衡处理,对此本发明实施例不加以限定。例如,可以采用旋转等方式对插入新节点
的时间序列索引树进行平衡处理,等等。
[0052] 而且,在实际应用中,对于被目标数据对象的有效时间段完全覆盖的各个节点而言,由于其被完全覆盖,不存在其中不同时间段对应不同数据对象的情况,因此可以不做分
裂处理,而仅更新其节点信息即可,也即将新增的目标数据对象的索引相关信息更新至其
有效时间段完全覆盖的各个节点的节点信息中。而对于被目标数据对象的有效时间段部分
覆盖(也即目标数据对象的有效时间段占用节点的部分有效时间段)的各个节点而言,由于
其中不同时间段所对应的数据对象有所不同,也即其中部分时间段对应目标数据对象,而
另外一部分并不对应目标数据对象,因此则需要对相应节点进行分裂处理,以保证同一节
点中各个时间段所对应的数据节点一致。也即,在本发明实施例中,可以基于上述原则获取
针对当前的目标数据对象,时间序列索引树中待分裂的目标节点。
[0053] 对于其中未被目标数据对象的有效时间段占用的分裂节点而言,则可以无需调整其节点信息,而对于其中被目标数据对象的有效时间段完全占用的分裂节点而言,则可以
相应地将新增的目标数据对象的索引相关信息更新 (例如直接加入等)至相应分裂节点的
节点信息中。
[0054] 此外,在插入分裂节点时,可以基于平衡二叉树的特性,根据需求通过任何可用方式确定各个分裂节点在时间序列索引树中的位置,进而在相应位置插入相应分裂节点,对
此本发明实施例不加以限定。
[0055] 可选地,在本发明实施例中,在所述时间序列索引树为二叉查找树的情况下,上述的步骤120进一步可以包括:
[0056] 步骤B121,针对任一新增的目标数据对象,根据所述目标数据对象的有效时间段与所述时间序列索引树中已有节点的有效时间段之间的占用关系,获取所述时间序列索引
树中待分裂的目标节点;
[0057] 步骤B122,对所述目标节点进行分裂处理,得到多个分裂节点,并根据所述目标数据对象的索引相关信息更新每个第一节点的节点信息,所述第一节点包括所述分裂节点,
以及所述目标数据对象的有效时间段完全覆盖的各个节点;
[0058] 步骤B123,在所述时间序列索引树中删除所述目标节点,并插入每个所述分裂节点。
[0059] 上述步骤B121‑B122与上述的步骤A121‑A122类似,具体可以参照上述内容,在此不加以赘述。
[0060] 而在确定每个分裂节点在时间序列索引树中的位置时,则可以参照二叉查找树的特征,根据需求通过任何可用方式确定每个分裂节点在时间序列索引树中的位置,对此本
发明实施例不加以限定。
[0061] 此外,在实际应用中,二叉查找树可以不做平衡处理,因此无需执行对插入新节点的时间序列索引树进行平衡处理的步骤。
[0062] 可选地,在本发明实施例中,所述目标节点包括在所述目标数据对象的有效时间段的开始时间占用的节点,和/或所述目标数据对象的有效时间段结束时间占用的节点;所
述目标节点与所述目标数据对象的有效时间段之间的占用关系包括以下至少一种:目标节
点左侧段被所述目标数据对象的有效时间段占用、目标节点右侧段被所述目标数据对象的
有效时间段占用、目标节点中间段被所述目标数据对象的有效时间段占用。
[0063] 如图2B所示为一种新加入的数据对象的有效时间段与时间序列索引树中已有节点的有效时间段之间的占用关系示意图,假设其中从左到右的顺序时间逐渐增长。由图2B
可以看出,构建过程节点分裂的过程一般会发生在新增数据对象(例如新订单)的有效时间
段(例如新订单的服务时间段)的开始时间(startTime)所占用的节点,和/或结束时间
(endTime)占用的节点上,其余被该新增数据对象的有效时间段完全覆盖的节点均不会发
生节点分裂,而是仅更新相关的节点信息即可。
[0064] 而如果目标数据对象的有效时间段的开始时间刚好与某一已有节点的开始时间一致,那么则可以不将该目标数据对象的有效时间段的开始时间占用的节点作为目标节
点。相应地,如果目标数据对象的有效时间段的结束时间刚好与某一已有节点的结束时间
一致,那么则可以不将该目标数据对象的有效时间段的结束时间占用的节点作为目标节
点。
[0065] 此外,在本发明实施例中,如果目标数据对象的有效时间段不占用任何已有节点,那么则可以直接在时间序列索引树中创建该目标数据对象对应的节点,并基于该目标数据
对象的索引相关信息设置该节点的节点信息,而无需对其中已有节点进行分裂处理。而如
果目标数据对象的有效时间段刚好完全覆盖至少一个已有节点,那么则可以相应根据该目
标数据对象的索引相关信息更新其完全覆盖的各个已有节点的节点信息,也无需进行分裂
处理。
[0066] 此外,如图2C所示,从分裂原因上看,导致节点分裂的目标节点与目标数据对象的有效时间段之间的占用关系可以包括以下三种情况:(1)目标节点左侧ac段被新的有效时
间段(例如目标数据对象的有效时间段)占用而冲突,故原有节点ab段需要分裂成ac段和(c
+1)b段。(2)目标节点右侧cb 段被新的有效时间段占用而冲突,故原有节点ab段需要分裂
成a(c‑1)段和cb 段。(3)目标节点中间cd段被新的有效时间段占用而冲突,故原有节点ab
段需要分裂成a(c‑1)段、cd段和(d+1)b段。另外,对于图2C中的(4)所示则为一种被新的有
效时间段完全覆盖的节点,此时该节点无需分裂,仅需进行节点信息的更新。
[0067] 需要说明的是,上述的+1、‑1可以理解为增加一个时间单位、减少一个时间单位。例如,假设以天为时间单位,对于情况(1),假设a为2021年 4月20日、b为2021年4月30日,c
为2021年4月25日,那么此时2021 年4月20日至2021年4月30日则可以分裂为2021年4月20
日至2021年 4月25日、2021年4月26日至2021年4月30日两个时间段。
[0068] 可选地,在本发明实施例中,对所述目标节点进行分裂处理,得到多个分裂节点的过程,具体可以包括:
[0069] 步骤S1,针对任一目标节点,获取所述目标节点中被所述目标数据对象的有效时间段占用的目标时间段,以所述目标时间段作为冲突节点,并以所述冲突节点作为一个分
裂节点;
[0070] 步骤S2,获取所述目标节点中除所述目标时间段,且被所述目标时间段分割的每个其他时间段,分别作为一个分裂节点;
[0071] 相应地,在所述时间序列索引树中删除所述目标节点,并插入每个所述分裂节点的过程,具体可以包括:
[0072] 步骤T1,以所述冲突节点继承所述目标节点在所述的时间序列索引树中的位置;
[0073] 步骤T2,对于每个其他分裂节点,在所述时间序列索引树中选择所述其他分裂节点的插入位置,并插入所述其他分裂节点,所述其他分裂节点为除所述冲突节点之外的分
裂节点。
[0074] 从图2C所示的四种情况分析得知,一次新数据对象的入库会导致0个,1个,2个节点的创建过程。为了尽可能提升搜索的性能,可以遵从以下约束:在分裂过程中,将冲突节
点的位置尽可能靠近树根,因为该节点被占用的次数较多,可能也是用户搜索的热点时间。
所以在本发明实施例中,可以将冲突节点继承原节点的位置,并且由原节点分裂出新的其
他分裂节点,并在时间序列索引树中选择每个新生成的其他分裂节点的合适的位置并插
入。
[0075] 可选地,在本发明实施例中,所述步骤T2进一步可以包括:
[0076] T21,响应于所述占用关系为目标节点左侧段被所述目标数据对象的有效时间段占用,从所述目标节点或者所述目标节点的右侧相邻节点上选择所述其他分裂节点的插入
位置,并插入所述其他分裂节点;
[0077] T22,响应于所述占用关系为目标节点右侧段被所述目标数据对象的有效时间段占用,从所述目标节点或者所述目标节点的左侧相邻节点上选择所述其他分裂节点的插入
位置,并插入所述其他分裂节点;
[0078] T23,响应于所述占用关系为目标节点中间段被所述目标数据对象的有效时间段占用,对于所述冲突节点左侧的其他分裂节点,从所述目标节点或者所述目标节点的左侧
相邻节点上选择所述其他分裂节点的插入位置,对于所述冲突节点右侧的其他分裂节点,
从所述目标节点或者所述目标节点的右侧相邻节点上选择所述其他分裂节点的插入位置,
并插入每个所述其他分裂节点。
[0079] 以图2C中的情况(2)为例,此时冲突节点发生在原节点(也即目标节点)的右侧介绍TSI节点的创建过程。经过对原节点在TSI中的相对位置详细分析得到如图2D所示的三种
情况。从图2D所示的三种相对位置的分析中,不难看到一定可以从原节点或者原节点的左
侧相邻节点(Left Neighbor Node)上找到合适位置去存储新生成的其他分裂节点,从而达
到解决冲突的目的。
[0080] 例如,对于2D所示的情况(1),则可以将新生成的其他分裂节点作为原节点的左孩子节点插入时间序列索引树,对于情况(2),则可以将新生成的其他分裂节点作为左侧相邻
节点的左孩子节点或右孩子节点插入时间序列索引树,对于情况(3),则可以将新生成的其
他分裂节点作为左侧相邻节点的左孩子节点,或作为原节点的左孩子节点插入时间序列索
引树,等等。
[0081] 相应地,以图2C中的情况(1)为例,此时目标节点与目标数据对象的有效时间段之间的占用关系为目标节点左侧段被所述目标数据对象的有效时间段占用。经过对原节点在
TSI中的相对位置详细分析得到如图2E所示的三种情况。
[0082] 从图2E所示的三种相对位置的分析中,不难看到一定可以从原节点或者原节点的右侧相邻节点(Right Neighbor Node)上找到合适位置去存储新生成的节点,从而达到解
决冲突的目的。
[0083] 例如,对于2E所示的情况(1),则可以将新生成的其他分裂节点作为原节点的右孩子节点插入时间序列索引树,对于情况(2),则可以将新生成的其他分裂节点作为右侧相邻
节点的左孩子节点或右孩子节点插入时间序列索引树,对于情况(3),则可以将新生成的其
他分裂节点作为右侧相邻节点的左孩子节点,或作为原节点的右孩子节点插入时间序列索
引树,等等。
[0084] 而对于上述图2C中的情况(3),对于冲突节点左侧的其他分裂节点,则可以参照上述的图2D,从所述目标节点或者所述目标节点的左侧相邻节点上选择所述其他分裂节点的
插入位置,对于所述冲突节点右侧的其他分裂节点,则可以参照上述的图2E,从所述目标节
点或者所述目标节点的右侧相邻节点上选择所述其他分裂节点的插入位置,并插入每个所
述其他分裂节点。
[0085] 其中,图2D和图2E中的虚线表示左侧相邻节点或者右侧相邻节点与目标节点(图示中Node)之间并非一定是父子关系,也可以是祖孙关系,当然也可能间隔更多辈,对此本
发明实施例不加以限定。此外,对于其中的原节点也可以替换或经分裂为上述的冲突节点。
[0086] 需要说明的是,在TSI为平衡查找树的情况下,新节点的插入过程后,需要对TSI重新平衡。
[0087] 参照图3,在本发明实施例中,所述方法进一步还可以包括:
[0088] 步骤130,针对任一被取消的历史数据对象,在所述时间序列索引树中搜索包含所述历史数据对象的身份标识的节点,作为所述历史数据对象的分布节点;
[0089] 步骤140,在每个所述分布节点中,删除所述历史数据对象的索引相关信息;
[0090] 步骤150,在所述时间序列索引树中,对所述历史数据对象的开始时间节点以及结束时间节点进行消解合并处理,以减少所述时间序列索引树中非必要节点的数量;
[0091] 其中,所述历史数据对象的开始时间节点为所述历史数据对象的开始时间所在的节点,所述历史数据对象的结束时间节点为所述历史数据对象的结束时间所在的节点。
[0092] TSI的删除过程其实对应着库存系统中数据对象(例如订单)的取消过程。通过数据对象的身份标识(例如Event id),在TSI上删除其所关联的全部信息,由前面的讨论可以
知道,虽然数据对象在TSI上是连续的,但其由于节点分裂可能分布在多个节点上。因此TSI
中的节点删除过程,也即从 TSI中删除某一历史数据对象的全部信息需要分成以下四步:
[0093] (1)根据给定的历史数据对象的身份标识,在时间序列索引树中搜索出全部包含所述历史数据对象的身份标识的节点,得到分布节点列表;
[0094] (2)在分布节点列表中的每个分部节点上删除该历史数据对象的相关信息,例如节点信息中包含的相应历史数据对象的索引相关信息等;
[0095] (3)对该历史数据对象的开始时间节点以及结束时间节点进行消解合并操作,以减少TSI树中非必要节点数量,降低TSI高度,提高搜索性能。
[0096] 而且,在本发明实施例中,可以通过任何可用方式对历史数据对象的开始时间节点以及结束时间节点进行消解合并处理,对此本发明实施例不加以限定。例如,在历史数据
对象的相关信息删除之后,假设该历史数据对象的开始时间节点的节点信息与其一相邻节
点的节点信息完全一致,那么则可以将两者合并,而如果合并后的节点的节点信息由于其
一相邻节点的节点信息一致,那么则可以进一步将两者合并,直至不存在相邻节点与当前
合并后的节点的节点信息一致;当然,也可以仅在该历史数据对象的开始时间节点的节点
信息与其一相邻节点的节点信息完全一致的情况下,将两者合并,而不进一步判断合并后
的节点是否需要进一步合并,对此本发明实施例不加以限定。
[0097] 可选地,在本发明实施例中,步骤150进一步可以包括:
[0098] 步骤151,针对已删除所述索引相关信息的开始时间节点,响应于所述开始时间节点与其一左侧相邻节点所包含的信息一致,将所述开始时间节点与所述开始时间节点的左
侧相邻节点合并,并将所述开始时间节点的右子树移动至合并后节点的右孩子上;
[0099] 步骤152,针对已删除所述索引相关信息的结束时间节点,响应于所述结束时间节点与其一右侧相邻节点所包含的信息一致,将所述结束时间节点与所述结束时间节点的右
侧相邻节点合并,并将所述结束时间节点的左子树移动至合并后节点的左孩子上。
[0100] 节点能够消解合并的前提是:节点在删除历史数据对象的索引相关信息后,能够与其相邻节点实现节点信息完全一致。消解合并操作是节点分裂操作的逆操作,但在其过
程中并非完全实现节点分裂的逆即可。
[0101] 如图2F所示,以历史数据对象的有效时间段中的开始时间所在的节点,也即历史数据对象的开始时间节点需要消解合并为例分析,消解合并过程历史数据对象的开始时间
节点(图2F中的Node)与其左侧相邻节点(图2F 中的LeftNeighborNode)在TSI的相对位置
分析可以包括三种情况,其中,在历史数据对象的索引相关信息从节点信息中删除后,该历
史数据对象的开始时间节点与相应左侧相邻节点的节点信息一致。
[0102] 需要说明是,在实际应用中,LeftNeighborNode要么不存在要么是唯一的。例如,假设Node1代表了[a,b]这个时间段,Node2代表[b+1,c],Node3代表[d,a‑1],则Node3是
Node1的左侧相邻节点,Node2是Node1的右侧相邻节点。在实际的TSI结构中,
LeftNeighborNode会存在于Node的左子树或者Node是LeftNeighborNode的右子树上的最
左子树的叶子节点。也即,某一节点Node的LeftNeighborNode可能与该节点为父子关系、祖
孙关系,也可能间隔百辈或者千辈以上,对此本发明实施例不加以限定。
[0103] 基于图2F通过分析得知,可以将Node与其LeftNeighborNode直接合并,并将Node的右子树移到合并节点的右孩子上即可。
[0104] 例如,对于图2F中的情况(1),可以将Node合并至其LeftNeighborNode,并将Node的右子树(例如图2F中right节点所在的Node右子树)移到合并节点的右孩子上,此时可以
将right节点移动作为合并后节点的右孩子节点;对于图2F中的情况(3),可以将Node合并
至其LeftNeighborNode,并将 Node的右子树,也即right节点移动至合并后节点的右孩子
上,并连接在右子树之后。此外,在消解合并后,根据需求也可以对时间序列索引树进行平
衡处理,对此本发明实施例不加以限定。
[0105] 相应地,针对已删除所述索引相关信息的结束时间节点,响应于所述开始时间节点与其一右侧相邻节点所包含的信息一致,将所述结束时间节点与所述结束时间节点的右
侧相邻节点(也即与该结束时间节点的节点信息一致的右侧相邻节点)合并,并将所述开始
时间节点的左子树移动至合并后节点的左孩子上。
[0106] 参照图3,在本发明实施例中,所述方法还可以包括:
[0107] 步骤160,响应于针对所述时间序列索引树中在指定时间节点之前的无效数据对象的删除请求,在所述时间序列索引树中搜索出全部所述无效数据对象涉及的节点,作为
无效节点,并依次删除每个所述无效节点;
[0108] 和/或,
[0109] 步骤170,响应于针对所述时间序列索引树中在指定时间节点之前的无效数据对象的删除请求,在所述时间序列索引树中搜索出全部所述无效数据对象涉及的节点,作为
无效节点,并将全部无效节点作为整体完整删除;
[0110] 其中,所述无效数据对象为有效时间段在所述指定时间节点之前,且至少覆盖一个节点的数据对象。
[0111] 在实际应用中,基于上述的在时间序列索引树中进行数据对象的增加和删除,TSI已经在一定程度上能够正常工作,并满足索引以及检索需要,但是随着时间的推移,TSI树
上可能存在大量用户关注度较低的无效信息,即过去的一段时间的数据对象可能在接下来
的实时搜索过程中失去了意义。因此,基于系统优化和性能考虑,在本发明实施例中,还可
以进一步考虑选择基准时间对TSI树进行剪枝操作。
[0112] 在实际场景下,可能存在删除某一个指定时间节点(也即BaseTime)前的全部无效数据对象,这些数据对象的特点可以包括以下几点:
[0113] (1数据对象已经在BaseTime前完成其有效时间,也即数据对象的有效时间段在BaseTime之前;
[0114] (2)数据对象至少覆盖TSI树上的1个节点。
[0115] 在本发明实施例中,实现剪枝的方案可以有以下两种:
[0116] (1)搜索出在指定时间节点之前的全部数据对象所对应的无效节点,进而逐个按照删除过程执行,以逐个删除每个无效节点;
[0117] (2)将全部无效节点作为整体完整删除。
[0118] 而且,在本发明实施例中,可以通过任何可用方式逐个删除无效节点,或者将全部无效节点作为整体完整删除,对此本发明实施例不加以限定。
[0119] 可选地,在本发明实施例中,步骤170进一步可以包括:
[0120] 步骤171,按中序搜索在所述时间序列索引树中搜索所述无效节点;
[0121] 步骤172,响应于在所述时间序列索引树中的任一目标范围内,所述无效节点的分布满足第一分布条件,将所述目标范围内的全部无效节点合并为一个节点;
[0122] 步骤173,响应于在所述目标范围内,所述无效节点的分布满足第二分布条件,将所述目标范围内的全部无效节点合并为一个节点,并将第四部分移动至所述第二部分的最
左子树上;
[0123] 其中,所述目标范围包括所述时间序列索引树本身,或者所述时间序列索引树中的任一以所述第一部分的根节点为根节点的子树(子树);所述第一分布条件包括所述目标
范围内缺失第二部分、第三部分、第四部分中的任意至少一个;所述第二分布条件包括所述
目标范围内同时包含第二部分、第三部分、第四部分;所述第一部分、第二部分、第三部分和
第四部分按照从上到下的顺序依次连接,所述第一部分的根节点为所述目标范围的根节
点,且所述第一部分和所述第三部分为无效节点区域,所述第二部分和所述第四部分为有
效节点区域,所述无效节点区域中包含至少一个无效节点,所述有效节点区域中包含至少
一个有效节点,所述有效节点为所述时间序列索引树中除所述无效节点之外的任一其他节
点,如果所述第一部分的根节点为所述时间序列索引树的根节点,所述目标范围为所述时
间序列索引树本身,如果所述第一部分的根节点不是所述时间序列索引树的根节点,所述
目标范围为所述时间序列索引树中以所述第一部分的根节点为根节点的子树。
[0124] 在实际应用中,上述方案(1)中逐个删除每个无效节点的方式,实现较为简单,但总体耗时长,剪枝停顿时间长,高并发场景下不适合系统级应用,所以在本发明实施例中,
为了避免上述问题优选地可以采用方案(2)中将全部无效节点作为整体完整删除的方式。
具体地,可以按中序搜索BaseTime时全部已完成的Event涉及的节点列表CoverNodes,其中
包含全部的无效节点,进而可以对CoverNodes进行剪枝合并操作。此外,根据需求也可以将
中序搜索替换为前序搜索或者后序搜索,对此本发明实施例不加以限定。
[0125] 而且,在进行剪枝之前,可以先分析剪枝前CoverNodes列表中无效节点的分布,整体上可把TSI树中某一目标范围分为几个部分,如图2G所示。那么在剪枝时可以分为以下两
种情况:当TSI树中缺少第二部分、第三部分、第四部分(也即图2G中的2,3,4部分)其中任意
至少一个时,则可以将全部无效节点合并为一个节点即可;而当2,3,4均存在时,则只要将
全部无效节点合并为一个节点,并且将第4部分移到第2部分的最左子树上就可。
[0126] 其中,在图2G中所示的第一部分的根节点上方还连接有其他节点,也即此时第一部分的根节点不是整个TSI树的根节点,那么图2G中所示的目标范围可以理解为TSI树中的
任意一个子树,且该子树的根节点为其中第1 部分的根节点。
[0127] 可选地,在本发明实施例中,在所述时间序列索引树为B+树的情况下,步骤120进一步可以包括:
[0128] C121,针对任一新增的目标数据对象,响应于所述目标数据对象的有效时间段与所述时间序列索引树中叶子节点包含的关键字不适配,根据目标数据对象的有效时间段,
以及每个所述叶子节点的有效时间段,获取所述时间序列索引树中待分裂的目标节点,并
在所述目标节点中获取需要分裂的目标关键字;
[0129] C122,根据所述目标数据对象的有效时间段,将所述目标关键字分裂为冲突关键字和初始关键字并存储于所述目标节点中;
[0130] C123,响应于所述目标节点大于B+树的阶数,则按照B+树的构造算法分裂所述目标节点。
[0131] 在实际应用中,二叉树结构不适合把其节点作为存储单元去处理,这样会增加搜索的IO次数,反而对搜索性能没有任何提升,于是在库存系统的订单数激增时,通过二叉树
构建的TSI树的IO耗时会成为搜索过程的瓶颈,因此在本发明实施例中,可以进一步对TSI
树进行优化。
[0132] 也即,可以采用B+树结构构建时间序列索引树。B+树将多个关键字Key (其概念来自于B+树,类似于二叉树中的节点)封装成一页(B+树中真正的节点)作为存储单元存储在
外部存储设备中。B+树结构较之于AVL,有以下优势:
[0133] 1、在TSI适用场景中,构造B+树难度较之于AVL更为简单;且B+树本身就是一个平衡多叉树,不需要额外的平衡开销;
[0134] 2、B+树的写性能和搜索性能比AVL更优;
[0135] 3、B+树整体高度低于AVL,在很多场景下均可以减少网络/磁盘IO次数;
[0136] 4、B+树结构里,可以让非叶节点存储更多的时段数据,而让叶节点存储额外数据;降低在检索过程中IO的数据量;
[0137] 5、B+树的叶子节点之间存在指针,非常适合时间序列的范围检索和遍历。
[0138] 如图2H所示为一种基于B+树构建的TSI树的示意图。从图2H中可以看出:叶子结点的关键字上保存了全部的而且连续的时间序列数据,而上面的索引节点仅起到索引功能。
[0139] 此时,TSI不必处理因为时间冲突导致的节点分裂这一难题,只需要处理关键字Key上的时间戳数据冲突分裂,而这个分裂并不意味着存放关键字 Key的节点一定发生分
裂。
[0140] 由于此时的TSI采用的是B+树结构,其中的叶子节点的关键字Key中存储着连续的时间序列数据,而索引节点不会存储这些数据,因此在处理关键字Key分裂时,冲突Key仅需
要从原节点上分裂并存放在原节点上,再对该叶子节点做B+树进行阶数约束操作即可。
[0141] 具体地,针对任一新增的目标数据对象,响应于所述目标数据对象的有效时间段与所述时间序列索引树中叶子节点包含的关键字不适配,也即需要进行关键字key分裂,则
可以根据目标数据对象的有效时间段,以及每个所述叶子节点的有效时间段,获取所述时
间序列索引树中待分裂的目标节点,并在所述目标节点中获取需要分裂的目标关键字,进
而根据所述目标数据对象的有效时间段,将所述目标关键字分裂为冲突关键字和初始关键
字并存储于所述目标节点中,在节点分裂完成之后,进一步则可以根据B+树的阶数约束进
行调整操作。例如,当单节点的关键字数量大于B+树的阶数时,节点就需要分裂成两个节
点,并依次递归其父节点、祖辈节点直至整棵树重新满足B+树的定义,那么此时则可以检查
目标节点是否大于B+树的阶数,如果是则可以按照B+树的构造算法分裂目标节点,并且可
以依次递归其父节点、祖辈节点直至整棵树重新满足B+树的定义。
[0142] 此外,如果此时不需要进行关键字key分裂,则可以仅基于目标数据对象的索引相关信息更新关键词Key数据,如图4A所示。
[0143] 相应地,在所述时间序列索引树为B+树的情况下,所述方法还可以包括:
[0144] 步骤180,针对任一被取消的历史数据对象,在所述时间序列索引树中搜索包含所述历史数据对象的身份标识的关键字;
[0145] 步骤190,针对任一所述关键字,删除所述关键字中包含的所述历史数据对象的索引相关信息。
[0146] 从B+树的构造过程可以看出,其流程相对简单。原因是得益于B+树的全部真实数据存储在叶子结点的关键字中,所以仅需要在B+树的基础上做一些简单额外处理就可以实
现。那么如何在一历史数据对象被取消时删除其在TSI上的数据呢?在本发明实施例中,受
益于B+树的存储结构,此时TSI 中索引相关信息的删除过程也是非常简单明了的。
[0147] 具体地,针对任一被取消的历史数据对象,则可以在时间序列索引树中搜索包含该历史数据对象的身份标识的关键字(也即key);进而针对任一包含该历史数据对象的身
份标识的关键字,删除该关键字中包含的该历史数据对象的索引相关信息。
[0148] 相应地,在所述时间序列索引树为B+树的情况下,所述方法还可以包括:
[0149] 步骤1110,针对任一已删除所述历史数据对象的索引相关信息的关键字,所述关键字与其相邻关键字中包含的信息一致,删除所述关键字;
[0150] 步骤1120,针对删除所述关键字的节点,响应于所述节点小于B+树的阶数的一半,则按照B+树的构造算法合并所述节点。
[0151] 对于删除部分信息的关键字而言,同样为了降低TSI树的复杂度,同时提高查询效率,则可以进一步对关键字进行删除处理。其中,判断关键字 Key可否删除的条件是删除或
取消历史数据对象后,该已删除相应历史数据对象的索引相关信息的Key与其相邻Key上的
信息是否完全一致。如果一致,则可以删除该关键字。而对于删除关键字的节点而言,则可
以进一步对其进行B+树的阶数约束操作。也即,此时可以检查相应节点是否小于B+树的阶
数的一半,如果是则可以按照B+树的构造算法合并相应节点,直至整棵树重新满足B+树的
定义,对此本发明实施例不加以限定。
[0152] 如图4B所示为一种B+树结构的TSI中数据的删除流程示意图。
[0153] 此外,在本发明实施例中,基于B+树构建的TSI由于其结构的卓越性和存储方式的节点化,可以暂时不考虑对其进行剪枝,可在后期系统优化时考虑,对此本发明实施例不加
以限定。
[0154] 如下表所示为一种针对上述的基于平衡查找树构建的TSI的性能测试结果。其中,处理器:2.4GHz四核Intel Core i5;内存:16GB 2133MHz LPDDR3;系统版本:MacBook Pro
(13‑inch,2019,Four Thunderbolt 3 ports)
[0155] 测试报告:
[0156]
[0157] 在本发明实施例中,基于TSI实现时间序列搜索的高性能和实时性。
[0158] 参照图5,示出了本发明实施例中一种数据索引构建装置的结构示意图。
[0159] 本发明实施例的数据索引构建装置包括:基础数据获取模块210和TSI 树构建模块220。
[0160] 下面分别详细介绍各模块的功能以及各模块之间的交互关系。
[0161] 基础数据获取模块210,用于针对每个数据对象,获取每个所述数据对象的有效时间段和索引相关信息,所述索引相关信息至少包含所述数据对象的身份标识;
[0162] TSI树构建模块220,用于基于每个所述数据对象的索引相关信息,以及各个数据对象的有效时间段之间的占用关系,构建时间序列索引树;
[0163] 其中,所述时间序列索引树包括二叉查找树、平衡二叉树、B+树中的任意一种,所述时间序列索引树中每个节点为一个时间段,且作为节点的各个时间段互不重叠,每个所
述数据对象的有效时间段对应于至少一个节点。
[0164] 可选地,在本发明实施例中,所述在所述时间序列索引树为平衡二叉树的情况下,所述TSI树构建模块220进一步可以包括:
[0165] 第一分裂节点获取子模块,用于针对任一新增的目标数据对象,根据所述目标数据对象的有效时间段与所述时间序列索引树中已有节点的有效时间段之间的占用关系,获
取所述时间序列索引树中待分裂的目标节点;
[0166] 节点分裂处理子模块,用于对所述目标节点进行分裂处理,得到多个分裂节点,并根据所述目标数据对象的索引相关信息更新每个第一节点的节点信息,所述第一节点包括
所述分裂节点,以及所述目标数据对象的有效时间段完全覆盖的各个节点;
[0167] 节点更新子模块,用于在所述时间序列索引树中删除所述目标节点,并插入每个所述分裂节点;
[0168] 平衡处理子模块,用于对插入新节点的时间序列索引树进行平衡处理。
[0169] 可选地,在本发明实施例中,在所述时间序列索引树为二叉查找树的情况下,所述TSI树构建模块220进一步可以包括:
[0170] 第一分裂节点获取子模块,用于针对任一新增的目标数据对象,根据所述目标数据对象的有效时间段与所述时间序列索引树中已有节点的有效时间段之间的占用关系,获
取所述时间序列索引树中待分裂的目标节点;
[0171] 节点分裂处理子模块,用于对所述目标节点进行分裂处理,得到多个分裂节点,并根据所述目标数据对象的索引相关信息更新每个第一节点的节点信息,所述第一节点包括
所述分裂节点,以及所述目标数据对象的有效时间段完全覆盖的各个节点;
[0172] 节点更新子模块,用于在所述时间序列索引树中删除所述目标节点,并插入每个所述分裂节点。
[0173] 可选地,在本发明实施例中,所述目标节点包括在所述目标数据对象的有效时间段的开始时间占用的节点,和/或所述目标数据对象的有效时间段结束时间占用的节点;所
述目标节点与所述目标数据对象的有效时间段之间的占用关系包括以下至少一种:目标节
点左侧段被所述目标数据对象的有效时间段占用、目标节点右侧段被所述目标数据对象的
有效时间段占用、目标节点中间段被所述目标数据对象的有效时间段占用。
[0174] 可选地,在本发明实施例中,在对所述目标节点进行分裂处理,得到多个分裂节点时,所述节点分裂处理子模块,进一步可以包括:
[0175] 第一分裂节点获取单元,用于针对任一目标节点,获取所述目标节点中被所述目标数据对象的有效时间段占用的目标时间段,以所述目标时间段作为冲突节点,并以所述
冲突节点作为一个分裂节点;
[0176] 第二分裂节点获取单元,用于获取所述目标节点中除所述目标时间段,且被所述目标时间段分割的每个其他时间段,分别作为一个分裂节点;
[0177] 所述节点更新子模块,包括:
[0178] 第一节点更新单元,用于以所述冲突节点继承所述目标节点在所述的时间序列索引树中的位置;
[0179] 第二节点更新单元,用于对于每个其他分裂节点,在所述时间序列索引树中选择所述其他分裂节点的插入位置,并插入所述其他分裂节点,所述其他分裂节点为除所述冲
突节点之外的分裂节点。
[0180] 可选地,在本发明实施例中,所述第二节点更新单元,具体可以用于:
[0181] 响应于所述占用关系为目标节点左侧段被所述目标数据对象的有效时间段占用,从所述目标节点或者所述目标节点的右侧相邻节点上选择所述其他分裂节点的插入位置,
并插入所述其他分裂节点;
[0182] 响应于所述占用关系为目标节点右侧段被所述目标数据对象的有效时间段占用,从所述目标节点或者所述目标节点的左侧相邻节点上选择所述其他分裂节点的插入位置,
并插入所述其他分裂节点;
[0183] 响应于所述占用关系为目标节点中间段被所述目标数据对象的有效时间段占用,对于所述冲突节点左侧的其他分裂节点,从所述目标节点或者所述目标节点的左侧相邻节
点上选择所述其他分裂节点的插入位置,对于所述冲突节点右侧的其他分裂节点,从所述
目标节点或者所述目标节点的右侧相邻节点上选择所述其他分裂节点的插入位置,并插入
每个所述其他分裂节点。
[0184] 可选地,在本发明实施例中,所述装置还可以包括:
[0185] 节点筛选模块,用于针对任一被取消的历史数据对象,在所述时间序列索引树中搜索包含所述历史数据对象的身份标识的节点,作为所述历史数据对象的分布节点;
[0186] 第一索引信息删除模块,用于在每个所述分布节点中,删除所述历史数据对象的索引相关信息;
[0187] 消解合并处理模块,用于在所述时间序列索引树中,对所述历史数据对象的开始时间节点以及结束时间节点进行消解合并处理,以减少所述时间序列索引树中非必要节点
的数量;
[0188] 其中,所述历史数据对象的开始时间节点为所述历史数据对象的开始时间所在的节点,所述历史数据对象的结束时间节点为所述历史数据对象的结束时间所在的节点。
[0189] 可选地,在本发明实施例中,所述消解合并处理模块,具体可以用于:
[0190] 针对已删除所述索引相关信息的开始时间节点,响应于所述开始时间节点与其一左侧相邻节点所包含的信息一致,将所述开始时间节点与所述开始时间节点的左侧相邻节
点合并,并将所述开始时间节点的右子树移动至合并后节点的右孩子上;
[0191] 针对已删除所述索引相关信息的结束时间节点,响应于所述结束时间节点与其一右侧相邻节点所包含的信息一致,将所述结束时间节点与所述结束时间节点的右侧相邻节
点合并,并将所述结束时间节点的左子树移动至合并后节点的左孩子上。
[0192] 可选地,在本发明实施例中,所述装置还可以包括:
[0193] 第一无效节点删除模块,用于响应于针对所述时间序列索引树中在指定时间节点之前的无效数据对象的删除请求,在所述时间序列索引树中搜索出全部所述无效数据对象
涉及的节点,作为无效节点,并依次删除每个所述无效节点;
[0194] 和/或,
[0195] 第二无效节点删除模块,用于响应于针对所述时间序列索引树中在指定时间节点之前的无效数据对象的删除请求,在所述时间序列索引树中搜索出全部所述无效数据对象
涉及的节点,作为无效节点,并将全部无效节点作为整体完整删除;
[0196] 其中,所述无效数据对象为有效时间段在所述指定时间节点之前,且至少覆盖一个节点的数据对象。
[0197] 可选地,在本发明实施例中,所述第二无效节点删除模块,进一步可以包括:
[0198] 按中序搜索在所述时间序列索引树中搜索所述无效节点;
[0199] 响应于在所述时间序列索引树中的任一目标范围内,所述无效节点的分布满足第一分布条件,将所述目标范围内的全部无效节点合并为一个节点;
[0200] 响应于在所述目标范围内,所述无效节点的分布满足第二分布条件,将所述目标范围内的全部无效节点合并为一个节点,并将第四部分移动至所述第二部分的最左子树
上;
[0201] 其中,所述目标范围包括所述时间序列索引树本身,或者所述时间序列索引树中的任一以所述第一部分的根节点为根节点的子树;所述第一分布条件包括所述目标范围内
缺失第二部分、第三部分、第四部分中的任意至少一个;所述第二分布条件包括所述目标范
围内同时包含第二部分、第三部分、第四部分;所述第一部分、第二部分、第三部分和第四部
分按照从上到下的顺序依次连接,且所述第一部分和所述第三部分为无效节点区域,所述
第二部分和所述第四部分为有效节点区域,所述无效节点区域中包含至少一个无效节点,
所述有效节点区域中包含至少一个有效节点,所述有效节点为所述时间序列索引树中除所
述无效节点之外的任一其他节点,如果所述第一部分的根节点为所述时间序列索引树的根
节点,所述目标范围为所述时间序列索引树本身,如果所述第一部分的根节点不是所述时
间序列索引树的根节点,所述目标范围为所述时间序列索引树中的任一以所述第一部分的
根节点为根节点的子树。
[0202] 可选地,在本发明实施例中,在所述时间序列索引树为B+树的情况下,所述TSI树构建模块220进一步可以包括:
[0203] 第二分裂节点获取子模块,用于针对任一新增的目标数据对象,响应于所述目标数据对象的有效时间段与所述时间序列索引树中叶子节点包含的关键字不适配,根据目标
数据对象的有效时间段,以及每个所述叶子节点的有效时间段,获取所述时间序列索引树
中待分裂的目标节点,并在所述目标节点中获取需要分裂的目标关键字;
[0204] 关键字分裂子模块,用于根据所述目标数据对象的有效时间段,将所述目标关键字分裂为冲突关键字和初始关键字并存储于所述目标节点中;
[0205] 目标节点分裂子模块,用于响应于所述目标节点大于B+树的阶数,则按照B+树的构造算法分裂所述目标节点。
[0206] 可选地,在本发明实施例中,所述装置还可以包括:
[0207] 关键字筛选模块,用于针对任一被取消的历史数据对象,在所述时间序列索引树中搜索包含所述历史数据对象的身份标识的关键字;
[0208] 第二索引信息删除模块,用于针对任一所述关键字,删除所述关键字中包含的所述历史数据对象的索引相关信息。
[0209] 可选地,在本发明实施例中,所述装置,还可以包括:
[0210] 关键字删除模块,用于针对任一已删除所述历史数据对象的索引相关信息的关键字,所述关键字与其相邻关键字中包含的信息一致,删除所述关键字;
[0211] 节点合并模块,用于针对删除所述关键字的节点,响应于所述节点小于 B+树的阶数的一半,则按照B+树的构造算法合并所述节点。
[0212] 本发明实施例提供的数据索引构建装置能够实现图1和图3的方法实施例中实现的各个过程,为避免重复,这里不再赘述。
[0213] 优选的,本发明实施例还提供了一种电子设备,包括:处理器,存储器,存储在存储器上并可在处理器上运行的计算机程序,该计算机程序被处理器执行时实现上述信息处理
方法实施例的各个过程,且能达到相同的技术效果,为避免重复,这里不再赘述。
[0214] 本发明实施例还提供了一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,计算机程序被处理器执行时实现上述信息处理方法实施例的各个过程,且能
达到相同的技术效果,为避免重复,这里不再赘述。其中,所述的计算机可读存储介质,如只
读存储器(Read‑Only Memory,简称ROM)、随机存取存储器(Random Access Memory,简称
RAM)、磁碟或者光盘等。
[0215] 需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而
且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有
的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该
要素的过程、方法、物品或者装置中还存在另外的相同要素。
[0216] 通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下
前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做
出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质
(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端(可以是手机,计算机,服务
器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。
[0217] 上面结合附图对本发明的实施例进行了描述,但是本发明并不局限于上述的具体实施方式,上述的具体实施方式仅仅是示意性的,而不是限制性的,本领域的普通技术人员
在本发明的启示下,在不脱离本发明宗旨和权利要求所保护的范围情况下,还可做出很多
形式,均属于本发明的保护之内。
[0218] 本领域普通技术人员可以意识到,结合本发明实施例中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些
功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业
技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应
认为超出本发明的范围。
[0219] 所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
[0220] 在本申请所提供的实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为
一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或
者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互
之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连
接,可以是电性,机械或其它的形式。
[0221] 所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个
网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目
的。
[0222] 另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
[0223] 所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说
对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计
算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个
人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。
而前述的存储介质包括:U盘、移动硬盘、ROM、RAM、磁碟或者光盘等各种可以存储程序代码
的介质。
[0224] 以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵
盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。