一种数据检索优化方法、装置和计算机设备与流程

文档序号:21408933发布日期:2020-07-07 14:43阅读:152来源:国知局
一种数据检索优化方法、装置和计算机设备与流程

本发明涉及数据存储领域,尤其涉及一种数据检索优化方法、装置和计算机设备。



背景技术:

前缀树或者字典树(trie树)是一种树形结构,多用于统计、索引和排序大量的字符串,所以经常被用于海量数据的内存索引和搜索引擎系统,对文本词频进行统计。它的优点是最大限度地减少无谓的字符串比较,查询效率比较高。

trie树的核心思想是空间换时间,trie适用于存在大量公共前缀的字符串,利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。但通常使用标准trie来做海量字符串的内存索引时内存消耗较大,索引效率低。



技术实现要素:

本发明旨在解决上面描述的问题。

根据本发明的第一方面,提供了一种数据检索优化方法,包括:

按照前缀树自根节点向叶子节点的方向,比较检索的字符串或字符串集合与前缀树;

查询当前匹配到的中间节点的可跳过的节点数;

跳过所述可跳过的节点数,继续比较检索的字符串或字符串集合与所述前缀树;

在存在与所述检索的字符串或字符串集合匹配的叶子节点时,返回所述叶子节点的数据。

优选的,所述可跳过的节点数为:

在查找的字符串值指向单分支节点时,从单分支起始的节点至单分支结束的节点之间的节点数量。

优选的,按照前缀树自根节点向叶子节点的方向,比较检索的字符串或字符串集合与前缀树的步骤之前,还包括:

对原始前缀树的单分支节点进行裁剪;

创建位图数组,所述位图数组中的位图元素与所述原始前缀树中的中间节点一一对应,一个位图元素存储所述原始前缀树中一个中间节点的分支信息;

创建跳数数组,所述跳数数组中的元素与所述原始前缀树的中间节点一一对应,一个跳数数组中的元素存储所述原始前缀树中一个中间节点裁剪掉的从单分支起始的节点至单分支结束的节点之间的节点数量;

创建叶子节点数组,所述叶子节点数组中的元素与用户数据一一对应,一个叶子节点数组中的元素存储所述原始前缀树中一个索引字符串对应的文件位置。

优选的,查询当前匹配到的中间节点的可跳过的节点数的步骤包括:

根据当前匹配的中间节点查找所述跳数数组;

在所述中间节点对应的所述跳数数组中的元素存储有所述中间节点作为单分支起始的节点至单分支结束的节点之间的节点数量时,以所述节点数量作为可跳过的节点数。

优选的,所述跳数数组、位图数组和叶子节点数组的元素均为限制预设存储容量所能表示的最大数组元素个数。

优选的,所述限制预设存储容量为2byte。

根据本发明的另一方面,还提供了一种数据检索优化装置,包括:

跳数匹配模块,用于查询当前匹配到的中间节点的可跳过的节点数;

比较检索模块,用于按照前缀树自根节点向叶子节点的方向,比较检索的字符串或字符串集合与前缀树,跳过所述可跳过的节点数,继续比较检索的字符串或字符串集合与所述前缀树;

数据返回模块,用于在存在与所述检索的字符串或字符串集合匹配的叶子节点时,返回所述叶子节点的数据。

优选的,该装置还包括:

前缀树裁剪模块,用于对原始前缀树的单分支节点进行裁剪;

中间节点存储模块,用于创建位图数组,所述位图数组中的位图元素与所述原始前缀树中的中间节点一一对应,一个位图元素存储所述原始前缀树中一个中间节点的分支信息;

跳数存储模块,用于创建跳数数组,所述跳数数组中的元素与所述原始前缀树的中间节点一一对应,一个跳数数组中的元素存储所述原始前缀树中一个中间节点裁剪掉的从单分支起始的节点至单分支结束的节点之间的节点数量;

用户数据存储模块,用于创建叶子节点数组,所述叶子节点数组中的元素与用户数据一一对应,一个叶子节点数组中的元素存储所述原始前缀树中一个索引字符串或字符串集合对应的文件位置。

优选的,所述跳数匹配模块包括:

数组查找单元,用于根据当前匹配的中间节点查找所述跳数数组;

跳数确定单元,用于在所述中间节点对应的所述跳数数组中的元素存储有所述中间节点作为单分支起始的节点至单分支结束的节点之间的节点数量时,以所述节点数量作为可跳过的节点数。

根据本发明的另一方面,还提供了一种计算机设备,包括存储器和处理器,所述存储器上存储有计算机程序,所述处理器运行所述计算机程序时实现如上述的方法的步骤。

本发明提供了一种数据检索优化方法、装置和计算机设备。按照前缀树自根节点向叶子节点的方向,比较检索的字符串或字符串集合与前缀树,查询当前匹配到的中间节点的可跳过的节点数,跳过所述可跳过的节点数,继续比较检索的字符串或字符串集合与所述前缀树,并在存在与所述检索的字符串或字符串集合匹配的叶子节点时,返回所述叶子节点的数据。在trie树基础上进行单分支节点的裁剪,从而极大减少trie树存储占用的内存空间;采用3个数组存储trie树替换指针存储trie树的原有存储方式,进一步减少由于存储方式造成的存储空间消耗。解决了现有的trie树存储管理方式占用的存储空间非常大及影响查询索引效率的问题,节省了存储空间、降低了内存消耗并提升了检索效率。

参照附图来阅读对于示例性实施例的以下描述,本发明的其他特性特征和优点将变得清晰。

附图说明

并入到说明书中并且构成说明书的一部分的附图示出了本发明的实施例,并且与描述一起用于解释本发明的原理。在这些附图中,类似的附图标记用于表示类似的要素。下面描述中的附图是本发明的一些实施例,而不是全部实施例。对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,可以根据这些附图获得其他的附图。

图1示例性地示出了本发明的一实施例提供的一种数据检索优化方法的流程;

图2示例性地示出了一个根据根据一组排序的字符串或字符串集合构建的trie树;

图3示例性地示出了裁剪后的trie树;

图4示例性地示出了本发明的一实施例提供的一种数据检索优化装置的结构;

图5示例性地示出了图4中跳数匹配模块401的结构。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互任意组合。

现有标准trie树中存在很多对查找不存在任何意义的节点,导致使用trie树的存储海量字符串时,存储空间非常大,也影响了查询索引效率。

为了解决上述问题,本发明的实施例提供了一种数据检索优化方法、装置、计算机存储介质和计算机设备。首先对trie树进行裁剪等处理,再重新定义存储trie树的数据结构,在此基础上进行高效检索,节省了存储空间、降低了内存消耗并提升了检索效率。

本发明的一实施例提供了一种数据检索优化方法,使用该方法完成trie树存储及查询的流程如图1所示,包括:

步骤101、对原始前缀树的单分支节点进行裁剪,存储裁剪后的前缀树。

由于trie树一般情况下存储的是静态数据的索引(即后续不作修改的数据),且被索引到的字符串或字符串集合不一定存在,多分支的trie节点是关键的,单分支的节点对定位一个存在的字符串或字符串集合没有任何帮助。因此,可在索引层对trie树进行裁剪,裁剪掉单分支节点。不需要对每个trie树分支都进行保存,在索引层只负责让存在的字符串或字符串集合可以被定位到,不存在的字符串或字符串集合在数据层反馈。

如图2所示,为根据一组排序的字符串或字符串集合构建的trie树,其中abdfg中的g节点不需要保留,因此在abdfg这一字符串或字符串集合中去掉g节点,同时在父节点f中保存去掉(越过/裁剪)节点的个数1。因为存在的字符串或字符串集合前缀如果是abdf,它最后1个字符只能是g,这样abdfg在裁剪后的trie树中正确的定位到。同理,去掉trie树中其他单分支节点,于是图2中的裁剪之后的结果如图3所示。裁剪之后的trie树除叶子节点之外,每个中间节点都有大于1个子节点;trie树的大小跟字符串或字符串集合的长度无关,任意长度的字符串或字符串集合的集合都可以使用有限大小的trie来索引;当所有节点都是二分的时候,trie树节点的数量最多为2n-1个。

本发明实施例中使用3个数据结构来存储裁剪后的trie树,分别保存trie树的中间节点,叶子节点和裁剪越过节点数。

创建跳数数组,所述跳数数组中的元素与所述原始前缀树的中间节点一一对应,一个元素存储所述原始前缀树中一个中间节点裁剪掉的从单分支起始的节点至单分支结束的节点之间的节点数量。在查找的字符串或字符串集合值指向单分支节点时,从单分支起始的节点至单分支结束的节点之间的节点数量,即为可跳过的节点数。

创建位图数组,所述位图数组中的位图元素与所述原始前缀树中的中间节点一一对应,一个位图元素存储所述原始前缀树中一个中间节点的分支信息;

创建叶子节点数组,所述叶子节点数组中的元素与用户数据一一对应,一个元素存储所述原始前缀树中一个索引字符串或字符串集合对应的文件位置。

所述跳数数组、位图数组和叶子节点数组的元素均为2byte。

以下是一种通过位图数据存储中间节点分支信息的具体示例:

//compactedarrayitem:

//uint16_tbranch_bitmap;

//uint16_tchildren_offset;

compacted_array_tinner;

对于所有的中间节点,用一个数组,具体为压缩数组(compactedarray)来保存。每个branch的大小为nbit,因此存储branch信息需要2nbit,相应的,压缩数据的元素数量为log2(2*n)bit,其中n为叶子节点数量/构建trie数字符串或字符串集合的数量。

例如,每个元素(item)用一个2byte的bit位(bitmap)来保存每个子节点的分支(branch)信息。每个branch是1个4bit的word,因为最多只有16个branch,所以只需2byte就足够了。再用一个2byte的uint16表示第一个子节点id,因为一个节点的所有子节点id是连续的,所以只需要保存第一个子节点,数组最多只有n/2个元素,n为构建trie数字符串或字符串集合的数量。

以下是叶子节点的存储的一个具体示例:

//compactedarrayitem:

//xx_tuserdata;

compacted_array_tleaves;

对于所有的叶子节点用一个compactedarray来保存,一个item对应一个叶子节点,item保存userdata(offset,size)。userdata为用户自定义的数据,可用于定位索引字符串或字符串集合所在文件的位置。

以下为裁剪越过节点数量(即可跳过的节点数据)的存储的一个具体示例:

//compactedarrayitem:

//uint16_t

compacted_array_tskips;

本步骤中对单分支节点做了裁剪,因此需要一个compactedarray来保存裁剪的信息,对于裁剪的节点只需要保存越过后续的节点数即可,使用一个2byte的uint16表示。

对于裁剪后trie树的存储,由于裁剪掉大量对于检索没有任何帮助信息的节点。通过实践。用32g内存,大约可以索引32亿个文件。

步骤102、按照前缀树自根节点向叶子节点的方向,比较检索的字符串或字符串集合与前缀树。

对于字符串或字符串集合的检索,只需要从步骤102中的3个数据结构(即跳数数组、位图数组、叶子节点数组)进行检索即可,检索字符串或字符串集合时,先从中间节点inner数据结构中的根节往叶子节点比较。

步骤103、查询当前匹配到的中间节点的可跳过的节点数。

本步骤中,对当前匹配到的节点,首先查找是否存在对应的可路过的节点数。

步骤104、跳过所述可跳过的节点数,继续比较检索的字符串或字符串集合与所述前缀树。

本步骤中,在跳过可跳过的节点数后,继续比较检索的字符串或字符串集合与前缀树。

例如,如果发现该节点在skips数据结构中,则在字符串或字符串集合中越过skips对应的字符数,再继续在inner中比较。

步骤105、在存在与所述检索的字符串或字符串集合匹配的叶子节点时,返回所述叶子节点的数据。

如果发现在leaves数据结构中存储在该字符串或字符串集合对应的叶子节点,则返回对应的userdata数据。否则,返回检索失败。

本发明的了实施例还提供了一种数据检索优化装置,其结构如图4所示,包括:

跳数匹配模块401,用于查询当前匹配到的中间节点的可跳过的节点数;

比较检索模块402,用于按照前缀树自根节点向叶子节点的方向,比较检索的字符串或字符串集合与前缀树,跳过所述可跳过的节点数,继续比较检索的字符串或字符串集合与所述前缀树;

数据返回模块403,用于在存在与所述检索的字符串或字符串集合匹配的叶子节点时,返回所述叶子节点的数据。

优选的,该装置还包括:

前缀树裁剪模块404,用于对原始前缀树的单分支节点进行裁剪;

中间节点存储模块405,用于创建位图数组,所述位图数组中的位图元素与所述原始前缀树中的中间节点一一对应,一个位图元素存储所述原始前缀树中一个中间节点的分支信息;

跳数存储模块406,用于创建跳数数组,所述跳数数组中的元素与所述原始前缀树的中间节点一一对应,一个所述跳数数组中的元素存储所述原始前缀树中一个中间节点裁剪掉的从单分支起始的节点至单分支结束的节点之间的节点数量;

用户数据存储模块407,用于创建叶子节点数组,所述叶子节点数组中的元素与用户数据一一对应,一个所述叶子节点数组元素存储所述原始前缀树中一个索引字符串或字符串集合对应的文件位置。

优选的,所述跳数匹配模块401的结构如图5所示,包括:

数组查找单元4011,用于根据当前匹配的中间节点查找所述跳数数组;

跳数确定单元4012,用于在所述中间节点对应的所述跳数数组中的元素存储有所述中间节点作为单分支起始的节点至单分支结束的节点之间的节点数量时,以所述节点数量作为可跳过的节点数。

本发明的一实施例还提供了一种计算机存储介质,该存储介质上存储有计算机程序,所述计算机程序被运行时实现本发明的实施例提供的数据检索优化方法的步骤。

本发明的一实施例还提供了一种计算机设备,包括存储器和处理器,所述存储器上存储有计算机程序,所述处理器运行所述计算机程序时实现本发明的实施例提供的数据检索优化方法的步骤。

本发明的实施例提供了一种数据检索优化方法、装置和计算机设备。按照前缀树自根节点向叶子节点的方向,比较检索的字符串或字符串集合与前缀树,查询当前匹配到的中间节点的可跳过的节点数,跳过所述可跳过的节点数,继续比较检索的字符串或字符串集合与所述前缀树,并在存在与所述检索的字符串或字符串集合匹配的叶子节点时,返回所述叶子节点的数据。在trie树基础上进行单分支节点的裁剪,从而极大减少trie树存储占用的内存空间;采用3个数组存储trie树替换指针存储trie树的原有存储方式,进一步减少由于存储方式造成的存储空间消耗。解决了现有的trie树存储管理方式占用的存储空间非常大及影响查询索引效率的问题,节省了存储空间、降低了内存消耗并提升了检索效率。

上面描述的内容可以单独地或者以各种方式组合起来实施,而这些变型方式都在本发明的保护范围之内。

最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制。尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1