CN111339382B - 字符串数据检索方法、装置、计算机设备及存储介质 - Google Patents
字符串数据检索方法、装置、计算机设备及存储介质 Download PDFInfo
- Publication number
- CN111339382B CN111339382B CN202010167413.4A CN202010167413A CN111339382B CN 111339382 B CN111339382 B CN 111339382B CN 202010167413 A CN202010167413 A CN 202010167413A CN 111339382 B CN111339382 B CN 111339382B
- Authority
- CN
- China
- Prior art keywords
- node
- character
- target
- prefix
- characters
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/903—Querying
- G06F16/90335—Query processing
- G06F16/90344—Query processing by using string matching techniques
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/901—Indexing; Data structures therefor; Storage structures
- G06F16/9027—Trees
Abstract
本申请是关于一种字符串数据检索方法、装置、计算机设备及存储介质。该方法包括:接收检索请求,所述检索请求中请求从数据库中查询包含有检索字符的字符串数据;通过索引信息从前缀树中查询目标子树;从所述前缀树中获取所述目标子树的前缀字符和后缀字符;将所述前缀字符、所述检索字符以及所述后缀字符拼接,得到所述检索请求对应的目标字符串数据。本方案一方面不需要遍历数据库中的所有字符串数据,能够保证较高的检索效率,另一方面,索引信息是前缀树中的节点对应的索引,相比于全索引来说占用内存量较少,因此,本方案能够兼顾针对字符串的模糊检索的检索效率和内存占用量。
Description
技术领域
本申请实施例涉及检索技术领域,特别涉及一种字符串数据检索方法、装置、计算机设备及存储介质。
背景技术
模糊检索是对于给定的检索字符,从数据库中检索出包含该检索字符的字符串数据的检索方式。随着网络和计算机技术的不断发展,模糊检索的应用也越来越广泛。
在相关技术中,为了检索出任意位置包含检索字符的检索结果,通常可以通过全遍历或者全索引的方式进行模糊检索。其中,全遍历是指将输出的检索字符与数据库中的各条字符串数据进行遍历匹配,以找出数据库中任意位置包含检索字符的字符串数据;而全索引是指预先针对数据库中的每条字符串数据,以及每条字符串数据的子串建立索引,在检索时,通过建立的索引直接定位至包含检索字符的字符串数据。
然而,相关技术中全遍历方式需要在每次检索遍历整个数据库,检索效率较低,而全索引方式需要预先建立完整的索引信息,导致内存占用较大;因此,相关技术中的方案无法兼顾检索效率和内存占用量。
发明内容
本申请实施例提供了一种字符串数据检索方法、装置、计算机设备及存储介质,可以兼顾检索效率和内存占用量,该技术方案如下:
一方面,提供了一种字符串数据检索方法,所述方法包括:
接收检索请求,所述检索请求中请求从数据库中查询包含有检索字符的字符串数据;
通过索引信息从前缀树中查询目标子树;所述前缀树是基于所述数据库中包含的字符串数据构建的;所述索引信息用于指示所述前缀树中各个节点作为起始节点的子树所包含的字符组合;所述目标子树是对应的字符组合与所述检索字符相同的子树;
从所述前缀树中获取所述目标子树的前缀字符和后缀字符;所述前缀字符是所述前缀树的根节点到所述目标子树的首个节点之间的各个节点对应的字符组合;所述后缀字符是所述目标子树之后的数据尾节点到所述目标子树的最后一个节点之间的各个节点对应的字符组合;所述数据尾节点是所述前缀树中,对应所述数据库中的字符串数据的最后一个字符的节点;
将所述前缀字符、所述检索字符以及所述后缀字符拼接,得到所述检索请求对应的目标字符串数据。
另一方面,提供了一种字符串数据检索装置,所述装置包括:
请求接收模块,用于接收检索请求,所述检索请求中请求从数据库中查询包含有检索字符的字符串数据;
目标子树查询模块,用于通过索引信息从前缀树中查询目标子树;所述前缀树是基于所述数据库中包含的字符串数据构建的;所述索引信息用于指示所述前缀树中各个节点作为起始节点的子树所包含的字符组合;所述目标子树是对应的字符组合与所述检索字符相同的子树;
前后缀字符获取模块,用于从所述前缀树中获取所述目标子树的前缀字符和后缀字符;所述前缀字符是所述前缀树的根节点到所述目标子树的首个节点之间的各个节点对应的字符组合;所述后缀字符是所述目标子树之后的数据尾节点到所述目标子树的最后一个节点之间的各个节点对应的字符组合;所述数据尾节点是所述前缀树中,对应所述数据库中的字符串数据的最后一个字符的节点;
字符拼接模块,用于将所述前缀字符、所述检索字符以及所述后缀字符拼接,得到所述检索请求对应的目标字符串数据。
在一种可能的实现方式中,所述目标子树查询模块,包括:
目标字符组合确定单元,用于从所述索引信息指示的各种字符组合中确定目标字符组合,所述目标字符组合包含n位字符,且所述目标字符组合与所述检索字符中的前n位字符相同;n为大于或者等于1的整数;
目标起始节点确定单元,用于将所述目标字符组合对应的起始节点确定为目标起始节点;
前缀匹配单元,用于从所述目标起始节点开始,在所述前缀树中对所述检索字符进行前缀匹配,得到所述目标子树。
在一种可能的实现方式中,所述索引信息包括所述各种字符组合对应的起始节点的指针;
所述目标起始节点确定单元,用于,
获取所述索引信息中包含的,所述目标字符组合对应的起始节点的指针;
将所述前缀树中,所述目标字符组合对应的起始节点的指针指向的节点确定为所述目标起始节点。
在一种可能的实现方式中,所述目标字符组合确定单元,用于,
将所述各种字符组合中,构成所述检索字符中的前缀部分的字符组合确定为候选字符组合;
将所述候选字符组合中字符位数最大的字符组合确定为所述目标字符组合。
在一种可能的实现方式中,所述索引信息指示的各种字符组合包括双字符组合之外的各种字符组合。
在一种可能的实现方式中,所述前缀匹配单元,用于,
响应于所述目标起始节点包括m个节点,m为大于或者等于2的整数,获取所述m个节点各自在所述前缀树中的层级,所述层级用于指示对应的节点到根节点的距离;
按照层级从低到高的顺序,依次从所述m个节点中的各个节点开始,在所述前缀树中对所述检索字符进行前缀匹配,得到所述目标子树。
在一种可能的实现方式中,所述装置还包括:
祖先节点查询模块,用于在所述前后缀字符获取模块从所述前缀树中获取所述目标子树的前缀字符和后缀字符之前,从所述目标子树的首个节点开始依次查询祖先节点,得到所述前缀树的根节点到所述目标子树的首个节点之间的各个节点。
在一种可能的实现方式中,所述前缀树中的各个节点对应有各自的父节点指针,所述父节点指针用于指示对应节点的父节点;
所述祖先节点查询模块,用于根据所述目标子树的首个节点的父节点指针,从所述目标子树的首个节点开始依次向所述前缀树的根节点迭代查询父节点,得到所述前缀树的根节点到所述目标子树的首个节点之间的各个节点。
在一种可能的实现方式中,所述装置还包括:
尾节点标识获取模块,用于在所述前后缀字符获取模块从所述前缀树中获取所述目标子树的前缀字符和后缀字符之前,获取所述前缀树中,位于所述目标子树之后的各个节点对应的尾节点标识,所述尾节点标识用于指示对应的节点是否为数据尾节点;
尾节点确定模块,用于根据所述尾节点标识,确定位于所述目标子树之后的各个节点中的数据尾节点。
在一种可能的实现方式中,所述尾节点标识是对应节点的字符编码中指定字符位中的数值。
在一种可能的实现方式中,所述前缀树中的节点对应的字符的编码方式为UTF-8编码方式,所述尾节点标识为对应节点的字符编码中指定字节的第2个二进制位中的数值。
在一种可能的实现方式中,所述前后缀字符获取模块,用于,
将所述前缀树的根节点到所述目标子树的首个节点之间的各个节点的字符,按照对应节点在所述前缀树中的层级从小到大的顺序组合为所述前缀字符;
将所述目标子树之后的数据尾节点到所述目标子树的最后一个节点之间的各个节点对应的字符,按照对应节点在所述前缀树中的层级从小到大的顺序组合为所述后缀字符。
另一方面,提供了一种计算机设备,所述计算机设备包含处理器和存储器,所述存储器中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、所述至少一段程序、所述代码集或指令集由所述处理器加载并执行以实现如上所述的字符串数据检索方法。
另一方面,提供了一种计算机可读存储介质,所述存储介质中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、所述至少一段程序、所述代码集或指令集由处理器加载并执行以实现如上所述的字符串数据检索方法。
本申请提供的技术方案可以包括以下有益效果:
通过在获取到检索请求时,可以通过预先建立的索引信息,从基于字符串数据构建的前缀树中确定出检索字符对应的目标子树,然后在前缀树中获取该目标子树对应的前缀字符和后缀字符,通过将前缀字符、检索字符和后缀字符进行拼接,即可以得到数据库中任意位置包含检索字符的目标字符串数据,在上述过程中,一方面由于检索过程是通过前缀树和索引信息来实现的,不需要遍历数据库中的所有字符串数据,能够保证较高的检索效率,另一方面,由于本方案的索引信息是前缀树中的节点对应的索引,相比于全索引来说占用内存量较少;因此,本申请实施例通过上述方案能够兼顾针对字符串的模糊检索的检索效率和内存占用量。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本申请。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本申请的实施例,并与说明书一起用于解释本申请的原理。
图1是本申请各个实施例涉及的一种数据检索系统的系统构成图;
图2是根据一示例性实施例示出的一种字符串数据检索方法的流程图;
图3是图2所示实施例涉及的一种前缀树及索引信息示意图;
图4是根据一示例性实施例示出的一种字符串数据检索方法的流程图;
图5是图4所示实施例涉及的一种前缀树及索引信息示意图;
图6是图4所示实施例涉及的一种编码格式示意图;
图7是根据一示例性实施例示出的一种游戏应用中名字检索的流程示意图;
图8是图7所示实施例涉及的公会搜索界面的示意图;
图9是根据一示例性实施例示出的一种字符串数据检索装置的结构方框图;
图10是根据一示例性实施例示出的一种计算机设备的结构示意图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。
本申请实施例提出了一种字符串数据检索方案,该方案能够兼顾字符串检索的检索效率和内存占用量。为了便于理解,下面对本申请涉及的名词进行解释。
1)Unicode标准:计算机科学领域里的一项业界标准,对世界上大部分的文字系统进行了整理、编码,使得计算机设备可以通过更为简单的方式来呈现和处理文字。
2)UTF-8编码:符合Unicode标准的一种可变长度字符编码,是对Unicode标准的一种实现。UTF-8编码是针对Unicode规定的字符集进行的编码,其中,英文字符采用一个字节编码,而中文字符占2至4个字节。
3)前缀树:前缀Trie树,也称为前缀匹配树或者字典树。其中,前缀树可以视为一种确定有限状态机,前缀树包含以下特点:
a、前缀树的根节点不包含字符,并且除根节点外其他每个节点都只包含一个字符。
b、从根节点到某一节点,路径上经过的字符按照先后顺序连接起来,即为该节点对应的字符串。
c、每个节点的子节点包含的字符都不同。
请参考图1,其示出了本申请各个实施例涉及的一种数据检索系统的系统构成图。如图1所示,该系统包括服务器120、数据库140以及若干个终端160。
服务器120是一台服务器,或者由若干台服务器,或者是一个虚拟化平台,或者是一个云计算服务中心。
服务器120可以是为检索类应用程序提供后台支持的服务器。服务器120可以由一个或多个功能单元组成。
可选的,在一种可能的实现方式中,如图1所示,服务器120可以包括接口单元120a、检索单元120b以及预处理单元120c。
接口单元120a用于与终端160中安装的检索类应用程序进行信息交互,以获取终端160对应的检索请求,以及,向终端160返回检索结果等等。
检索单元120b用于根据检索请求,在数据库中进行检索,得到检索结果。其中,检索单元120b执行的检索过程可以是模糊检索,即从数据库中检索出任意位置包含检索字符的字符串数据。
预处理单元120c用于预先对数据库中的字符串数据进行处理,以便检索单元120b能够在保持较少的内存占用的情况下,高效率的进行字符串检索。
上述数据库140可以是Redis数据库,或者,也可以是其它类型数据库。其中,数据库140用于存储各类数据,比如,各个字符串数据、各个字符串数据对应的关联数据、以及预处理单元120c的预处理结果等等。
在本申请实施例中,上述预处理单元120c的预处理结果可以包括根据各个字符串数据构建的前缀树,以及前缀树中各个节点对应的索引信息。
比如,在系统初始化时,或者,数据库中的字符串数据发生变化时,预处理单元120c进行数据预处理,生成或者更新前缀树以及索引信息;接口单元120a接收到检索请求时,可以将检索请求转给检索单元120b,检索单元120b根据前缀树以及索引信息,对检索请求中的检索字符进行检索,以检索出任意位置包含检索字符的检索结果,并将检索结果提交给接口单元120a,由接口单元120a将检索结果返回给终端160。
终端160可以是具有网络连接功能,且安装有上述服务器120对应的检索类应用程序的终端设备,比如,终端160可以是智能手机、平板电脑、电子书阅读器、智能眼镜、智能手表、MP3播放器(Moving Picture Experts Group Audio Layer III,动态影像专家压缩标准音频层面3)、MP4(Moving Picture Experts Group Audio Layer IV,动态影像专家压缩标准音频层面4)播放器、笔记本电脑或台式电脑等等。可选的,该终端160还可能被称为用户设备、便携式终端、膝上型终端、台式终端等。
在本申请实施例中,上述检索类应用程序可以包括任意提供字符串检索功能的应用程序,比如,包括且不限于传统的视频播放应用程序、视频直播应用程序、游戏类应用程序、通信类应用程序或者浏览器类应用程序等等。
终端160与服务器120之间通过通信网络相连。可选的,该通信网络是有线网络或无线网络。
可选的,该系统还可以包括管理设备(图1未示出),该管理设备与服务器120之间通过通信网络相连。可选的,通信网络是有线网络或无线网络。
可选的,上述的无线网络或有线网络使用标准通信技术和/或协议。网络通常为因特网、但也可以是任何网络,包括但不限于局域网(Local Area Network,LAN)、城域网(Metropolitan Area Network,MAN)、广域网(Wide Area Network,WAN)、移动、有线或者无线网络、专用网络或者虚拟专用网络的任何组合)。在一些实施例中,使用包括超文本标记语言(Hyper Text Mark-up Language,HTML)、可扩展标记语言(Extensible MarkupLanguage,XML)等的技术和/或格式来代表通过网络交换的数据。此外还可以使用诸如安全套接字层(Secure Socket Layer,SSL)、传输层安全(Transport Layer Security,TLS)、虚拟专用网络(Virtual Private Network,VPN)、网际协议安全(Internet ProtocolSecurity,IPsec)等常规加密技术来加密所有或者一些链路。在另一些实施例中,还可以使用定制和/或专用数据通信技术取代或者补充上述数据通信技术。
图2是根据一示例性实施例示出的一种字符串数据检索方法的流程图,该字符串数据检索方法可以用于计算机设备,比如上述图1所示系统的服务器中。如图2所示,该字符串数据检索方法可以包括如下步骤:
步骤21,接收检索请求,该检索请求中请求从数据库中查询包含有检索字符的字符串数据。
可选的,该检索字符是用户输入的字符。
可选的,该检索字符中包含单个字符,或者,该检索字符是由两个或者两个以上字符组成的字符串。
步骤22,通过索引信息从前缀树中查询目标子树;该前缀树是基于该数据库中包含的字符串数据构建的;该索引信息用于指示该前缀树中各个节点作为起始节点的子树所包含的字符组合;该目标子树是对应的字符组合与该检索字符相同的子树。
可选的,该字符组合包含单个字符,或者,该字符组合是由两个或者两个以上字符组成的字符串。
步骤23,从该前缀树中获取该目标子树的前缀字符和后缀字符;该前缀字符是该前缀树的根节点到该目标子树的首个节点之间的各个节点对应的字符组合;该后缀字符是该目标子树之后的数据尾节点到该目标子树的最后一个节点之间的各个节点对应的字符组合;该数据尾节点是该前缀树中,对应该数据库中的字符串数据的最后一个字符的节点。
在本申请实施例中,对于已经构建完成的前缀树,计算机设备可以结合前缀树中各个节点对应的索引,从前缀树中确定出与检索字符相对应的子树,即目标子树,换句话说,计算机设备确定出的该目标子树中的各个节点对应的字符组合,与检索字符相同。也就是说,假设检索字符为“BC”,则目标子树是前缀树中对应字符分别为“B”和“C”的节点构成的子树,且目标子树中“B”字符对应节点在前缀树中的层级低于“C”字符对应节点的层级。
步骤24,将该前缀字符、该检索字符以及该后缀字符拼接,得到该检索请求对应的目标字符串数据。
请参考图3,其示出了本申请实施例涉及的一种前缀树及索引信息示意图。如图3所示,索引信息31中包含各个字符节点对应的索引,假设对于其中字符节点B的索引,前缀树32中有3个字符B节点,分别为节点31a、节点31b、和节点31c。假设检索字符为“BC”,那么计算机设备,比如服务器可以根据索引信息找到前缀树32中的3个字符节点B,然后遍历该3个字符节点B下的各个的子节点,得到目标子树,即对应字符为“BC”的子树(图3中示出为子树31d和子树31e),然后再对该节点子树做前缀匹配,就可以找到所有前缀为BC,且最后一个节点为数据尾节点的子树(即目标子树与后缀字符对应的子树的结合)。图3中以粗线示出了子树31d对应的子树“BCD”和子树“BCE”,以及子树31e对应的子树“BCA”,接着,服务器遍历所有这样的子树,再加上各个子树中对应节点B的前缀字符(即图3中粗线部分的子树“AB”和子树“EB”),即可以得到检索结果,即目标字符串数据。如图3所示,得到的目标字符串数据有3个,分别为“ABBCD”、“ABBCE”以及“AB BCA”。
综上所述,本申请实施例所示的方案,在获取到检索请求时,可以通过预先建立的索引信息,从基于字符串数据构建的前缀树中确定出检索字符对应的目标子树,然后在前缀树中获取该目标子树对应的前缀字符和后缀字符,通过将前缀字符、检索字符和后缀字符进行拼接,即可以得到数据库中任意位置包含检索字符的目标字符串数据,在上述过程中,一方面由于检索过程是通过前缀树和索引信息来实现的,不需要遍历数据库中的所有字符串数据,能够保证较高的检索效率,另一方面,由于本方案的索引信息是前缀树中的节点对应的索引,相比于全索引来说占用内存量较少;因此,本申请实施例通过上述方案能够兼顾针对字符串的模糊检索的检索效率和内存占用量。
图4是根据一示例性实施例示出的一种字符串数据检索方法的流程图,该字符串数据检索方法可以用于计算机设备中。其中,该计算机设备可以是上述图1所示系统中的服务器。如图4所示,该字符串数据检索方法可以包括如下步骤:
步骤401,对数据库中的字符串数据进行预处理,构建前缀树,以及前缀树中各个节点对应的索引信息。
其中,上述索引信息用于指示该前缀树中各个节点作为起始节点的子树所包含的字符组合。
在本申请实施例中,对字符串数据进行预处理包括编码预处理以及索引预处理。
其中编码预处理是指通过预设的编码方式对数据库中的字符串数据包含的字符进行编码。
可选的,为了能够支持尽可能多的语言,本申请实施例所示的方案采用UTF-8格式对字符串数据进行编码,在底层,不同的语言对应的字符以Unicode码点表示。
可选的,由于不同的字符对应的UTF-8格式的码点长度并不一样长,在1字节到4字节之间。本申请实施例所示的方案为每个码点统一分配4字节内存,并将每个码点的4字节内存中存储的序列(4字节序列)作为整型存储,便于处理和搜索。
其中,索引预处理包括基于前缀树建立字符串数据的部分子串的索引。
由于本申请实施例所示的方案基于前缀树Trie进行模糊查询,而相关技术中单纯的前缀树用于进行前缀匹配(即检索前缀为检索字符的字符串数据),而不适用于搜索中间位置或者末尾位置包含检索字符的情况。而本申请实施例所示的方案,针对前缀树中的每个对应字符的节点建立索引信息,后续通过结合索引信息与前缀树实现第内存占用的快速检索。
可选的,在本申请实施例中,上述索引信息包含键值对,其中,键为节点中存储的字符,值为所有存放该字符的节点的指针的集合,这样建立索引后,配合前缀树即可以实现对任意位置包含检索字符的字符串数据的检索。
步骤402,接收检索请求,该检索请求中请求从数据库中查询包含有检索字符的字符串数据。
以应用于服务器为例,在本申请实施例中,当用户需要检索包含某个检索字符的字符串数据时,可以在终端的搜索栏中输出检索字符,该检索字符中可以包含单个字符,也可以包含多个字符,之后,终端可以生成包含该检索字符的检索请求,并将检索请求发送给该服务器,相应的,服务器可以接收该检索请求,并从检索请求中提取该检索字符,以便后续进行模糊检索。
步骤403,从该索引信息指示的各种字符组合中确定目标字符组合。
其中,该目标字符组合包含n位字符,且该目标字符组合与该检索字符中的前n位字符相同;n为大于或者等于1的整数。
如图3所示,如果要查询包含“BC”的所有字符串,先通过索引B查询到B节点子树,再进行前缀匹配得到子树BC,在前缀匹配的过程中还会遍历BA子树,很明显,这是一次无意义的遍历。如果字符串基数比较大,这样的无效遍历会很多,浪费查询时间,影响检索效率。
可选的,在上述步骤401中,当计算机设备在预处理过程中,为每个字符分配4字节的内存时,由于大多数字符并不能完全占用4字节的内存,也就是说,很多字符对应的内存在编码后并没有被完全的有效占用,因此,在本申请实施例中,计算机设备可以利用各个字符对应的内存中的空间字节来存储更多的信息,也就是说,计算机设备在建立单字符索引(如图3所示的索引)时,还建立字节总数不超过4字节的多字符索引。
相应的,计算机设备在检索时,可以通过查询索引信息来确定已建立了索引信息的字符组合中,与检索字符中的前n位相同的字符组合作为目标字符组合,该目标字符组合中可以只包含单个字符,也可以包含多个字符,当目标字符组合中包含多个字符时,计算机设备可以直接定位到包含该目标字符组合对应的子树中,而由于目标字符组合又是检索字符中的全部或者部分前缀,因此,定位到的子树是可能包含检索字符的子树,而未定位到的子树则不包含检索字符,相对于单字符索引来说,能够加大的缩小子树的定位范围,减少后续无意义的前缀检索。
可选的,计算机设备可以将该各种字符组合中,构成该检索字符中的前缀部分的字符组合确定为候选字符组合;将该候选字符组合中字符位数最大的字符组合确定为该目标字符组合。
在本申请所示的方案中,可以作为检索字符的前缀的索引可能有多个,比如,假设检索字符为“BCAED”,那么,可以作为检索字符的前缀的组合可以由“B”、“BC”、“BCA”、“BCAE”、“BCAED”这五种,假设索引信息中存在“B”、“BC”、“BCA”、这三种字符组合对应的索引,则计算机设备定位到这三种索引对应的子树时,都可以进行后续的前缀匹配,以确定包含检索字符的目标子树,然而,定位到这三种索引对应的子树时的检索效率也不一样,其中,计算机设备定位到“B”字符组合对应的索引时,需要从所有以“B”节点为起始节点的子树中进行匹配,而如果计算机设备定位到“BC”字符组合对应的索引时,则需要从所有以“B”节点为起始节点,同时该起始节点的子节点中包含“C”节点的子树中进行匹配,其需要匹配的子树的数量会明显减少,而如果计算机设备定位到“BCA”字符组合对应的索引时,则需要从所有以“B”节点为起始节点,同时该起始节点的子节点中包含“C”节点,并且,该“C”节点的子节点中包含“A”节点的子树中进行匹配,其需要匹配的子树的数量会进一步减少。因此,在本申请实施例中,计算机设备在确定目标字符组合时,可以将索引信息对应的各种字符组合中,能够作为检索字符的前缀或者全部,且位数最大的字符组合作为目标字符组合,后续直接在该位数最大的字符组合对应的子树下进行前缀匹配,从而尽可能的减少匹配量,提高检索效率。
例如,假设前缀树中以“B”节点为起始节点的第一类子树有10个,而这10个第一类子树中,以“B”节点为起始节点,同时该起始节点的子节点中包含“C”节点的第二类子树有4个,进一步的,该4个第二类子树中,以“B”节点为起始节点,同时该起始节点的子节点中包含“C”节点,并且,该“C”节点的子节点中包含“A”节点的子树有1个。那么,通过本申请所示的方案中,计算机设备可以通过索引信息,直接定位到包含“BCA”字符组合对应的索引所指示的子树下进行检索字符的前缀匹配,不需要遍历其它9个子树,从而能够极大的提高检索效率。
比如,请参考图5,其示出了本申请实施例涉及的一种前缀树及索引信息示意图。如图5所示,在前缀树中,计算机设备针对B节点建立了更多的多字符组合索引,比如,在图5中,前缀树中包含3个B节点,分别为节点51、节点52和节点53,其中,节点51对应有单字符索引(“B”索引)、两字符索引(“BC”索引)以及三字符索引(“BCD”索引、“BCE”索引);节点52对应有单字符索引(“B”索引)、两字符索引(“BC”索引、“BE”索引)以及三字符索引(“BEB”索引、“BCA”索引、“BEBA”索引);节点53对应有单字符索引(“B”索引)、以及两字符索引(“BC”索引、“BA”索引)。
在图5中,在查询“BC”检索字符时,计算机设备根据B字符对应的各种字符组合对应的索引,可以直接定位到包含“BC”的子树,即图5中以节点51或者节点52为起始节点的子树,无需逐个遍历B索引的子节点,比如,在图5中,计算机设备无需遍历以节点53为起始节点的子树,从而消除了无效遍历。
进一步的,如果检索字符超过最大字符组合(比如4字节),或者,不存在与检索字符完全一致的索引,那么即使不能直接定位,也可以极大限度减少无效遍历。测试结果表明,在100W个32字节的字符串数据中做查询时,通过多字符索引进行检索时,相对于通过单字符索引进行检索,其查询效率可以提高500倍以上。
可选的,该索引信息指示的各种字符组合包括双字符组合之外的各种字符组合。
考虑到某些应用(比如游戏应用)中查询效率已经很高,可以适当降低一些查询效率来减少内存的使用。比如,以英文字符串“abcd”为例,如果摒弃2字符索引,而只建立1、3、4字符索引,可以大大减少索引量,同时增加的查询时间并不多,例如,输入的检索字符为“ab”,计算机设备可以先通过查询索引信息得到“a”字符的索引,然后在前缀树中进行一次查询判断“a”字符后是否接着“b”字符,在计算过程上只是多了一次查询,但是索引信息的数据量减少了30%,由于每次查询时间是对数级相关,因此查询时间增加缓慢,对查询效率影响较小。
再例如,假设英文名字长度为n(长度不小于2),可以建立4字符索引n-3个,3字符索引n-2个,2字符索引和1字符索引分别为n-1和n个。摒弃2字符索引,理论上可以减少的索引量为:
步骤404,将该目标字符组合对应的起始节点确定为目标起始节点。
可选的,该索引信息包括该各种字符组合对应的起始节点的指针。
在将该目标字符组合对应的起始节点确定为目标起始节点时,计算机设备获取该索引信息中包含的,该目标字符组合对应的起始节点的指针;将该前缀树中,该目标字符组合对应的起始节点的指针指向的节点确定为该目标起始节点。
在本申请实施例中,由于索引信息中包含字符组合以及字符组合对应的起始节点的指针,因此,计算机设备在确定目标字符组合之后,即可以查询索引信息得到目标字符组合对应的起始节点的指针,再根据该指针即可以直接在前缀树中定位到目标字符组合对应的起始节点。
步骤405,从该目标起始节点开始,在该前缀树中对该检索字符进行前缀匹配,得到该目标子树。
在定位到目标起始节点之后,计算机设备即可以在前缀树中进行前缀匹配,以确定前缀树中对应检索字符的子树作为目标子树。
可选的,响应于该目标起始节点包括m个节点,m为大于或者等于2的整数,在从该目标起始节点开始,在该前缀树中对该检索字符进行前缀匹配,得到该目标子树时,计算机设备可以获取该m个节点各自在该前缀树中的层级,该层级用于指示对应的节点到根节点的距离;然后按照层级从低到高的顺序,依次从该m个节点中的各个节点开始,在该前缀树中对该检索字符进行前缀匹配,得到该目标子树。
可选的,前缀树中的节点到根节点的距离,是对应节点到根节点的最小跳数。比如,在图5中,节点51和节点52到根节点的距离为2,节点53但根节点的距离为4,也就是说,节点51和节点52在前缀树中的层级,低于节点53中前缀树中的层级,相应的,在前缀匹配时,如果节点51、节点52和节点53为起始节点的子树都需要检索匹配,则计算机设备将会优先从节点51和节点52开始匹配。
在本申请实施例中,计算机设备从前缀树中定位到的目标起始节点可能会有多个,且不同的目标起始节点在前缀树中的层级也可能不同,相应的,不同的目标起始节点对应的检索结果也并不一定需要全部输出。比如,在图5中,假设输入串为“EBE”,如果终端或者服务器限定输出一个结果,则可能是EBEBA,也有可能是EBE,而很明显后者是精确匹配的,应当优先输出。因此,在本申请实施例所示的方案中,根据前缀树的特点,精确匹配的字符串,必然是从根节点开始匹配到的第一个字符串。因此,在本申请实施例中,目标起始节点有多个时,可以将索引根据所指向的节点在树中的深度进行分类,以建立分层索引,查询时,计算机设备优先检索深度最小(即层级较小)的索引,这样可以保证完全匹配或者检索字符靠前的字符串数据优先被检索出来并输出。
步骤406,从该目标子树的首个节点开始依次查询祖先节点,得到该前缀树的根节点到该目标子树的首个节点之间的各个节点。
可选的,前缀树中的各个节点对应有各自的父节点指针,该父节点指针用于指示对应节点的父节点。
相应的,在从该目标子树的首个节点开始依次查询祖先节点,得到该前缀树的根节点到该目标子树的首个节点之间的各个节点时,计算机设备根据该目标子树的首个节点的父节点指针,从该目标子树的首个节点开始依次向该前缀树的根节点迭代查询父节点,得到该前缀树的根节点到该目标子树的首个节点之间的各个节点。
以图5为例,假设输入的检索字符为“BE”,为了得到“BE”子树的前缀字符,就需要能够访问到各个节点的祖先节点,为此,本申请实施例所示的方案增加一个子节点指向父节点的指针,在确定“BE”子树(即图5中粗线标出的两个节点构成的子树)之后,通过不断的向根节点迭代即可得到前缀字符,即前缀字符为根节点下的节点54对应的字符“E”。
步骤407,获取该前缀树中,位于该目标子树之后的各个节点对应的尾节点标识,该尾节点标识用于指示对应的节点是否为数据尾节点。
在本申请实施例中,计算机设备在步骤401的预处理过程中,在构建前缀树时,对于前缀树中的每个节点,可以设置一个尾节点标识,以表示当前节点是否是数据库中某一个或者多个字符串数据中最后一个字符对应的节点。例如,假设该尾节点标识的值为0或1;例如,当尾节点标识的值为1时,表示该对应的节点是数据库中某一个或者多个字符串数据中最后一个字符对应的节点,而当尾节点标识的值为0时,表示该对应的节点不是数据库中任意一个字符串数据中最后一个字符对应的节点;或者,反之,当尾节点标识的值为0时,表示该对应的节点是数据库中某一个或者多个字符串数据中最后一个字符对应的节点,而当尾节点标识的值为1时,表示该对应的节点不是数据库中任意一个字符串数据中最后一个字符对应的节点。
步骤408,根据该尾节点标识,确定位于该目标子树之后的各个节点中的数据尾节点。
比如,以图5为例,假设输入的检索字符为“BE”,在确定“BE”子树之后,计算设备进一步确定“BE”子树之后的各个节点,即图5中的节点53和节点55,并获取节点53和节点55各自的尾节点标识,以从节点53和节点55中确定出数据尾节点。
可选的,该尾节点标识是对应节点的字符编码中指定字符位中的数值。
在本申请实施例中,如果额外增加一个信息位作为尾节点标识的信息位,尤其是在需要内存对齐的情况下,需要为每一个字符都增加一个尾节点标识的信息位,则会导致内存占用量的增加。
可选的,在本申请实施例中,为了节约内存占用量,计算机设备在预处理过程中对字符进行编码,并构建前缀树时,将节点对应字符的字符编码中的指定字符位,作为该节点的尾节点标识。
可选的,该指定字符位是字符编码中数值固定的字符位。
可选的,该前缀树中的节点对应的字符的编码方式为UTF-8编码方式,该尾节点标识为对应节点的字符编码中指定字节的第2个二进制位中的数值。
请参考图6,其示出了本申请实施例涉及的一种编码格式示意图。如图6中的61部分所示,根据UTF-8编码格式,单字节字符的最高二进制位为0;多字节字符从其第一个字节额最高位开始,连续的二进制位值为1的个数决定了其编码的字节数,其余各字节均以10开头,观察图6可以发现,字符编码中第2和第3字节要么都是0,要么是以10开头的有效字节,因此,本申请实施例所示的方案利用第2或者第3字节中某个字节的第2个最高二进制位作为标记,记录该节点是否为某字符串数据的结束节点。
步骤409,将该前缀树的根节点到该目标子树的首个节点之间的各个节点的字符,按照对应节点在该前缀树中的层级从小到大的顺序组合为前缀字符。
在本申请实施例中,计算机设备确定前缀树的根节点到该目标子树的首个节点之间的各个节点后,可以按照层级从小到大的顺序对确定出的各个节点的字符进行组合,得到前缀字符,以使得该前缀字符的组合顺序与前缀字符在对应的字符串数据中的排列顺序一致。
步骤410,将该目标子树之后的数据尾节点到该目标子树的最后一个节点之间的各个节点对应的字符,按照对应节点在该前缀树中的层级从小到大的顺序组合为后缀字符。
在本申请实施例中,计算机设备确定目标子树之后的数据尾节点到该目标子树的最后一个节点之间的各个节点后,可以按照层级从小到大的顺序对确定出的各个节点的字符进行组合,得到后缀字符,以使得该后缀字符的组合顺序与后缀字符在对应的字符串数据中的排列顺序一致。
比如,还是以图5为例,假设输入的检索字符为“BE”,当节点53不是数据尾节点,而节点55是数据尾节点时,后缀字符为BA,而当节点53和节点55都是数据尾节点时,后缀字符有两种,分别为B和BA。
步骤411,将该前缀字符、检索字符以及后缀字符拼接,得到该检索请求对应的目标字符串数据。
在本申请实施例中,计算机设备按照前缀字符、检索字符以及后缀字符的顺序进行拼接,得到的字符串即为数据库中包含检索字符的目标字符串数据。
例如,还是以图5为例,假设输入的检索字符为“BE”,则前缀字符为E,当后缀字符为BA时,目标字符串数据是唯一的,即EBEBA;而当后缀字符为B和BA时,目标字符串数据有两个,分别为EBEB以及EBEBA。
其中,上述前缀字符和后缀字符可以为空,也就是说,不存在对应的前缀字符和/或后缀字符。
相应的,当计算机设备是服务器时,可以将包含该目标字符串数据的检索结果反馈给终端,以便终端在搜索界面中进行展示。
可选的,计算机设备还可以查询目标字符串数据相关联的其它信息,并结合其它信息与筛选条件,对目标字符串数据进行筛选,比如,检索请求中包含筛选条件,以在游戏应用中搜索玩家或者公会为例,该筛选条件可以包括地区、等级、活跃度等等,计算机设备检索到一条或者多条目标字符串数据之后,可以获取与该目标字符串数据相关联的信息,并根据获取到的相关联的信息与筛选条件进行匹配,将符合匹配条件的目标字符串数据以及相关联的信息反馈给终端进行展示。
综上所述,本申请实施例所示的方案,在获取到检索请求时,可以通过预先建立的索引信息,从基于字符串数据构建的前缀树中确定出检索字符对应的目标子树,然后在前缀树中获取该目标子树对应的前缀字符和后缀字符,通过将前缀字符、检索字符和后缀字符进行拼接,即可以得到数据库中任意位置包含检索字符的目标字符串数据,在上述过程中,一方面由于检索过程是通过前缀树和索引信息来实现的,不需要遍历数据库中的所有字符串数据,能够保证较高的检索效率,另一方面,由于本方案的索引信息是前缀树中的节点对应的索引,相比于全索引来说占用内存量较少;因此,本申请实施例通过上述方案能够兼顾针对字符串的模糊检索的检索效率和内存占用量。
此外,本申请实施例所示的方案,通过建立单字符索引和多字符索引,计算机设备可以直接定位到与检索字符中的前多个字符相对于的目标子树中进行前缀匹配,从而极大的减少无意义的前缀匹配过程,从而提高模糊检索的检索效率。
另外,本申请实施例所示的方案,当确定的目标字符组合以多个时,按照首个节点在前缀树中的层级从低到高的顺序进行检索,从而保证完全匹配或者检索字符靠前的字符串数据优先被检索出来并输出,进而提高有效结果的输出效率。
以本申请上述方案应用于游戏应用中为例,图7是根据一示例性实施例示出的一种游戏应用中名字检索的流程示意图。如图7所示,该流程如下:
S71,运行游戏应用的终端向游戏服务器发送检索请求。
在本申请实施例中,假设以搜索公会名为例,游戏服务器预先对已经存在的各个公会的公会名按照UTF-8编码方式进行编码,并按照各个公会的公会名构建前缀树,前缀树中每个子节点具有指向其父节点的指针,然后,游戏服务器生成前缀树中各个节点对应的索引信息,各个节点对应的索引信息包括单字符索引以及多字符索引。
对于每个公会名中的最后一个字符,游戏服务器还将前缀树中对应的节点上的尾节点标识设置为1,以指示该节点是某一个或者多个公会名对应的数据尾节点,相应的,对于前缀树中的其它节点,则将尾节点标识设置为0。
用户在公会搜索页面的搜索栏中输入由一个或者多个字符构成的检索字符,该检索字符可以包含任意字符,比如,中文、英文字符甚至特殊符号等,只要是UTF-8编码支持的字符即可。之后,终端向游戏服务器发送包含该检索字符的检索请求。
可选的,用户还在公会搜索页面中选择筛选条件,比如,筛选条件可以包括加入公会需要审批、当前用户符合加入公会的要求等等。相应的,终端向服务器发送的检索请求中也包含用户选择的筛选条件。
比如,请参考图8,其示出了本申请实施例涉及的公会搜索界面的示意图。如图8中的(a)部分所示,用户可以在搜索栏81中输入英文的检索字符“aaa”,或者,如图8中的(b)部分所示,用户可以在搜索栏81中输入中文的检索字符“手”。在图8中,用户也可以选择勾选搜索栏81下方的条件选项82,其中,条件选项82被勾选时,表示用户设置了相应的筛选条件,如果未勾选,则表示用户未设置相应的筛选条件。
S72,游戏服务器接收到该检索请求后,从索引信息中确定与检索字符中的前缀部分相匹配的最长字符组合(对应上述实施例中的目标字符组合),获取该最长字符组合对应的目标起始节点的指针。
在本申请实施例中,服务器接收到检索请求后,从索引信息中查询对应有子树指针的各个字符组合,从中选择与检索字符中的前若干个字符一致,并且长度最长的一个字符组合,作为目标字符组合,该目标字符组合对应的指针就是本次查询中开始进行前缀匹配的目标起始节点的指针。
S73,游戏服务器根据该目标起始节点的指针定位到前缀树中的目标起始节点,并从目标起始节点开始,在前缀树中进行前缀匹配,获得对应字符为上述检索字符的目标子树。
S74,游戏服务器根据目标子树,查询前缀树中的前缀节点,得到前缀字符。
其中,游戏服务器按照目标子树中首个节点的父节点指针,向根节点依次查询,得到根节点到目标子树之间的各层级的节点(即前缀节点),并将前缀节点对应的字符按照节点层级从小到大的顺序排列,记得到前缀字符。
S75,游戏服务器根据目标子树,查询前缀树中的后缀节点,得到后缀字符。
游戏服务器按照目标子树之后的各个节点(也就是目标子树的最后一个节点的各级子节点)对应的尾节点标识,即可以判断目标子树之后的各个节点中作为公会名最后一个字符的节点(即数据尾节点),然后将每个查询到的数据尾节点到目标子树之间的节点,作为一组后缀节点,并将后缀节点对应的字符按照节点层级从小到大的顺序排列,记得到后缀字符。
S76,游戏服务器按照前缀字符+检索字符+后缀字符的顺序进行拼接,得到检索出的公会名。
S77,游戏服务器将检索出的公会名返回给终端,由终端进行展示。
比如,在图8中的(a)部分,当检索字符“aaa”时,终端展示的结果83为“qaaaaaaaaa”以及“aaa”;在图8中的(b)部分,当检索字符为“手”时,终端展示的结果84为“电话手表”和“手机”。
由本申请上述方案可见,本申请所示的方案可以包含以下特征:
1、支持所有语言。
以游戏应用为例,游戏中角色/公会等名字通常使用的语言各种各样,尤其是在海外上线的项目,因此支持语言越多越好。本申请所示的方案基于UTF-8编码格式进行编码,由于Unicode标准对世界上绝大部分语言字符都给予了唯一的码点,因此将各语言名字拆解为UTF-8编码序列后再处理的方式,能够便于数据的统一和处理。
2、支持任意位置的匹配。
还是以游戏应用中查询角色或者公会名为例,本申请实施例所示的方案,对于玩家的输入,查询系统将返回包含该输入的所有角色或者公会名字;如果返回的查询结果太多,系统还可以根据需求进行裁剪,只输出一部分查询结果;如果有精确匹配输入串的名字,系统可以通过分层索引的方式保证优先输出精确匹配的名字。
3、支持自定义过滤。
以游戏应用中查询角色或者公会名为例,通过本申请实施例所示的方案,除了根据输入串进行名字的匹配查询,玩家还可以对该名字所属的角色/公会等进行额外的筛选,比如限定等级、活跃度甚至是地区等,以得到更加精确的查询结果。
4、系统量级较轻。
以游戏应用为例,本申请实施例所示的方案实现的系统量级较轻,不会对玩家体验和其他业务模块造成影响,主要体现在两个方面:首先,查询效率很高,数百万名字下,每秒支持25000以上的查询,响应速度快,用户体验友好;其次内存使用可控,充分利用UTF-8编码的特点,无需额外资源,标记名字结束点,同时在仅引入少量额外内存下,将普通索引扩展为多字符索引,提高查询效率。
表1是为了验证本申请所实现系统的有效性的对比试验结果。其中,测试机器为:Linux version 3.10.107,8核64G内存。测试条件:假设每个字符串最长32字节,待查询的字符串最长12字节。查询截止条件:找到10个匹配串。
表1
/>
表1的测试结果如下:
1、全遍历方案:效率与基数成反比,效率方差很大,适用于10W量级以下系统;
2、全索引方案:效率很高,但是占用内存过大,基数低于1W可以考虑,但此时全遍历才是最优选择;
3、本方案:占用内存可控,查询效率受基数影响很小,效率方差几乎为0,重建时间短。
通过表1可见,本方案在单服务器可以承载数百万级基数的查询请求,依赖一些分布式方案,可以扩大到更大基数量级。查询效率测试平均值达到了25000QPS以上。
5、系统移植性高。
本申请所示的方案只需要预先构建前缀树和索引信息,系统无需和其他服务模块交互,比如,以游戏应用中查询角色或者公会名为例,系统仅需要角色或者公会名字和自定义用户数据,即可以建立检索系统。
图9是根据一示例性实施例示出的一种字符串数据检索装置的结构方框图。该字符串数据检索装置可以执行图2或图4所示实施例中的全部或者部分步骤。该字符串数据检索装置可以包括:
请求接收模块901,用于接收检索请求,所述检索请求中请求从数据库中查询包含有检索字符的字符串数据;
目标子树查询模块902,用于通过索引信息从前缀树中查询目标子树;所述前缀树是基于所述数据库中包含的字符串数据构建的;所述索引信息用于指示所述前缀树中各个节点作为起始节点的子树所包含的字符组合;所述目标子树是对应的字符组合与所述检索字符相同的子树;
前后缀字符获取模块903,用于从所述前缀树中获取所述目标子树的前缀字符和后缀字符;所述前缀字符是所述前缀树的根节点到所述目标子树的首个节点之间的各个节点对应的字符组合;所述后缀字符是所述目标子树之后的数据尾节点到所述目标子树的最后一个节点之间的各个节点对应的字符组合;所述数据尾节点是所述前缀树中,对应所述数据库中的字符串数据的最后一个字符的节点;
字符拼接模块904,用于将所述前缀字符、所述检索字符以及所述后缀字符拼接,得到所述检索请求对应的目标字符串数据。
在一种可能的实现方式中,所述目标子树查询模块902,包括:
目标字符组合确定单元,用于从所述索引信息指示的各种字符组合中确定目标字符组合,所述目标字符组合包含n位字符,且所述目标字符组合与所述检索字符中的前n位字符相同;n为大于或者等于1的整数;
目标起始节点确定单元,用于将所述目标字符组合对应的起始节点确定为目标起始节点;
前缀匹配单元,用于从所述目标起始节点开始,在所述前缀树中对所述检索字符进行前缀匹配,得到所述目标子树。
在一种可能的实现方式中,所述索引信息包括所述各种字符组合对应的起始节点的指针;
所述目标起始节点确定单元,用于,
获取所述索引信息中包含的,所述目标字符组合对应的起始节点的指针;
将所述前缀树中,所述目标字符组合对应的起始节点的指针指向的节点确定为所述目标起始节点。
在一种可能的实现方式中,所述目标字符组合确定单元,用于,
将所述各种字符组合中,构成所述检索字符中的前缀部分的字符组合确定为候选字符组合;
将所述候选字符组合中字符位数最大的字符组合确定为所述目标字符组合。
在一种可能的实现方式中,所述索引信息指示的各种字符组合包括双字符组合之外的各种字符组合。
在一种可能的实现方式中,所述前缀匹配单元,用于,
响应于所述目标起始节点包括m个节点,m为大于或者等于2的整数,获取所述m个节点各自在所述前缀树中的层级,所述层级用于指示对应的节点到根节点的距离;
按照层级从低到高的顺序,依次从所述m个节点中的各个节点开始,在所述前缀树中对所述检索字符进行前缀匹配,得到所述目标子树。
在一种可能的实现方式中,所述装置还包括:
祖先节点查询模块,用于在所述前后缀字符获取模块903从所述前缀树中获取所述目标子树的前缀字符和后缀字符之前,从所述目标子树的首个节点开始依次查询祖先节点,得到所述前缀树的根节点到所述目标子树的首个节点之间的各个节点。
在一种可能的实现方式中,所述前缀树中的各个节点对应有各自的父节点指针,所述父节点指针用于指示对应节点的父节点;
所述祖先节点查询模块,用于根据所述目标子树的首个节点的父节点指针,从所述目标子树的首个节点开始依次向所述前缀树的根节点迭代查询父节点,得到所述前缀树的根节点到所述目标子树的首个节点之间的各个节点。
在一种可能的实现方式中,所述装置还包括:
尾节点标识获取模块,用于在所述前后缀字符获取模块903从所述前缀树中获取所述目标子树的前缀字符和后缀字符之前,获取所述前缀树中,位于所述目标子树之后的各个节点对应的尾节点标识,所述尾节点标识用于指示对应的节点是否为数据尾节点;
尾节点确定模块,用于根据所述尾节点标识,确定位于所述目标子树之后的各个节点中的数据尾节点。
在一种可能的实现方式中,所述尾节点标识是对应节点的字符编码中指定字符位中的数值。
在一种可能的实现方式中,所述前缀树中的节点对应的字符的编码方式为UTF-8编码方式,所述尾节点标识为对应节点的字符编码中指定字节的第2个二进制位中的数值。
在一种可能的实现方式中,所述前后缀字符获取模块903,用于,
将所述前缀树的根节点到所述目标子树的首个节点之间的各个节点的字符,按照对应节点在所述前缀树中的层级从小到大的顺序组合为所述前缀字符;
将所述目标子树之后的数据尾节点到所述目标子树的最后一个节点之间的各个节点对应的字符,按照对应节点在所述前缀树中的层级从小到大的顺序组合为所述后缀字符。
综上所述,本申请实施例所示的方案,在获取到检索请求时,可以通过预先建立的索引信息,从基于字符串数据构建的前缀树中确定出检索字符对应的目标子树,然后在前缀树中获取该目标子树对应的前缀字符和后缀字符,通过将前缀字符、检索字符和后缀字符进行拼接,即可以得到数据库中任意位置包含检索字符的目标字符串数据,在上述过程中,一方面由于检索过程是通过前缀树和索引信息来实现的,不需要遍历数据库中的所有字符串数据,能够保证较高的检索效率,另一方面,由于本方案的索引信息是前缀树中的节点对应的索引,相比于全索引来说占用内存量较少;因此,本申请实施例通过上述方案能够兼顾针对字符串的模糊检索的检索效率和内存占用量。
此外,本申请实施例所示的方案,通过建立单字符索引和多字符索引,计算机设备可以直接定位到与检索字符中的前多个字符相对于的目标子树中进行前缀匹配,从而极大的减少无意义的前缀匹配过程,从而提高模糊检索的检索效率。
另外,本申请实施例所示的方案,当确定的目标字符组合以多个时,按照首个节点在前缀树中的层级从低到高的顺序进行检索,从而保证完全匹配或者检索字符靠前的字符串数据优先被检索出来并输出,进而提高有效结果的输出效率。
图10是根据一示例性实施例示出的一种计算机设备的结构示意图。该计算机设备可以实现为服务器。该服务器可以为图1所示的服务器120。所述计算机设备1000包括中央处理单元(Central Processing Unit,CPU)1001、包括随机存取存储器(RAM)1002和只读存储器(ROM)1003的系统存储器1004,以及连接系统存储器1004和中央处理单元1001的系统总线1005。所述计算机设备1000还包括帮助计算机内的各个器件之间传输信息的基本输入/输出(Input/Output,I/O)系统1006,和用于存储操作系统1013、应用程序1014和其他程序模块1015的大容量存储设备1007。
所述大容量存储设备1007通过连接到系统总线1005的大容量存储控制器(未示出)连接到中央处理单元1001。所述大容量存储设备1007及其相关联的计算机可读介质为计算机设备1000提供非易失性存储。也就是说,所述大容量存储设备1007可以包括诸如硬盘或者CD-ROM驱动器之类的计算机可读介质(未示出)。
不失一般性,所述计算机可读介质可以包括计算机存储介质和通信介质。计算机存储介质包括以用于存储诸如计算机可读指令、数据结构、程序模块或其他数据等信息的任何方法或技术实现的易失性和非易失性、可移动和不可移动介质。计算机存储介质包括随机存取存储器(Random Access Memory,RAM)、只读存储器(Read-Only Memory,ROM)、可擦除可编程只读存储器(Erasable Programmable Read-Only Memory,EPROM)、带电可擦可编程只读存储器(Electrically Erasable Programmable read only memory,EEPROM)、闪存或其他固态存储其技术,光盘只读存储器(Compact Disc Read-Only Memory,CD-ROM)、数字通用光盘(Digital Versatile Disc,DVD)或其他光学存储、磁带盒、磁带、磁盘存储或其他磁性存储设备。当然,本领域技术人员可知所述计算机存储介质不局限于上述几种。上述的系统存储器1004和大容量存储设备1007可以统称为存储器。
计算机设备1000可以通过连接在所述系统总线1005上的网络接口单元1011连接到互联网或者其它网络设备。
所述存储器还包括一个或者一个以上的程序,所述一个或者一个以上程序存储于存储器中,中央处理器1001通过执行该一个或一个以上程序来实现图2或图4所示的方法的全部或者部分步骤。
在示例性实施例中,还提供了一种包括指令的非临时性计算机可读存储介质,例如包括计算机程序(指令)的存储器,上述程序(指令)可由计算机设备的处理器执行以完成本申请各个实施例所示的方法的全部或者部分步骤。例如,所述非临时性计算机可读存储介质可以是ROM、RAM、CD-ROM、磁带、软盘和光数据存储设备等。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本申请的其它实施方案。本申请旨在涵盖本申请的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本申请的一般性原理并包括本申请未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本申请的真正范围和精神由下面的权利要求指出。
应当理解的是,本申请并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本申请的范围仅由所附的权利要求来限制。
Claims (13)
1.一种字符串数据检索方法,其特征在于,所述方法包括:
接收检索请求,所述检索请求中请求从数据库中查询中间位置或者末尾位置包含有检索字符的字符串数据,所述检索字符是用户输入的字符;
从索引信息指示的各种字符组合中确定目标字符组合,所述索引信息用于指示前缀树中各个节点作为起始节点的子树所包含的字符组合;所述前缀树是基于所述数据库中包含的字符串数据构建的;所述目标字符组合包含n位字符,且所述目标字符组合与所述检索字符中的前n位字符相同;n为大于或者等于1的整数;
将所述目标字符组合对应的起始节点确定为目标起始节点;
从所述目标起始节点开始,在所述前缀树中对所述检索字符进行前缀匹配,得到目标子树,所述目标子树是对应的字符组合与所述检索字符相同的子树;其中,响应于所述目标起始节点包括m个节点,m为大于或者等于2的整数,获取所述m个节点各自在所述前缀树中的层级,所述层级用于指示对应的节点到根节点的距离;按照层级从低到高的顺序,依次从所述m个节点中的各个节点开始,在所述前缀树中对所述检索字符进行前缀匹配,得到所述目标子树;
从所述前缀树中获取所述目标子树的前缀字符和后缀字符;所述前缀字符是所述前缀树的根节点到所述目标子树的首个节点之间的各个节点对应的字符组合;所述后缀字符是所述目标子树之后的数据尾节点到所述目标子树的最后一个节点之间的各个节点对应的字符组合;所述数据尾节点是所述前缀树中,对应所述数据库中的字符串数据的最后一个字符的节点;
将所述前缀字符、所述检索字符以及所述后缀字符拼接,得到所述检索请求对应的目标字符串数据,所述检索字符位于所述目标字符串数据中的中间位置或者末尾位置。
2.根据权利要求1所述的方法,其特征在于,所述索引信息包括所述各种字符组合对应的起始节点的指针;
所述将所述目标字符组合对应的起始节点确定为目标起始节点,包括:
获取所述索引信息中包含的,所述目标字符组合对应的起始节点的指针;
将所述前缀树中,所述目标字符组合对应的起始节点的指针指向的节点确定为所述目标起始节点。
3.根据权利要求1所述的方法,其特征在于,所述从索引信息指示的各种字符组合中确定目标字符组合,包括:
将所述各种字符组合中,构成所述检索字符中的前缀部分的字符组合确定为候选字符组合;
将所述候选字符组合中字符位数最大的字符组合确定为所述目标字符组合。
4.根据权利要求1所述的方法,其特征在于,所述索引信息指示的各种字符组合包括双字符组合之外的各种字符组合。
5.根据权利要求1所述的方法,其特征在于,所述从所述前缀树中获取所述目标子树的前缀字符和后缀字符之前,还包括:
从所述目标子树的首个节点开始依次查询祖先节点,得到所述前缀树的根节点到所述目标子树的首个节点之间的各个节点。
6.根据权利要求5所述的方法,其特征在于,所述前缀树中的各个节点对应有各自的父节点指针,所述父节点指针用于指示对应节点的父节点;
所述从所述目标子树的首个节点开始依次查询祖先节点,得到所述前缀树的根节点到所述目标子树的首个节点之间的各个节点,包括:
根据所述目标子树的首个节点的父节点指针,从所述目标子树的首个节点开始依次向所述前缀树的根节点迭代查询父节点,得到所述前缀树的根节点到所述目标子树的首个节点之间的各个节点。
7.根据权利要求1所述的方法,其特征在于,所述从所述前缀树中获取所述目标子树的前缀字符和后缀字符之前,还包括:
获取所述前缀树中,位于所述目标子树之后的各个节点对应的尾节点标识,所述尾节点标识用于指示对应的节点是否为数据尾节点;
根据所述尾节点标识,确定位于所述目标子树之后的各个节点中的数据尾节点。
8.根据权利要求7所述的方法,其特征在于,所述尾节点标识是对应节点的字符编码中指定字符位中的数值。
9.根据权利要求8所述的方法,其特征在于,
所述前缀树中的节点对应的字符的编码方式为UTF-8编码方式,所述尾节点标识为对应节点的字符编码中指定字节的第2个二进制位中的数值。
10.根据权利要求1所述的方法,其特征在于,所述从所述前缀树中获取所述目标子树的前缀字符和后缀字符,包括:
将所述前缀树的根节点到所述目标子树的首个节点之间的各个节点的字符,按照对应节点在所述前缀树中的层级从小到大的顺序组合为所述前缀字符;
将所述目标子树之后的数据尾节点到所述目标子树的最后一个节点之间的各个节点对应的字符,按照对应节点在所述前缀树中的层级从小到大的顺序组合为所述后缀字符。
11.一种字符串数据检索装置,其特征在于,所述装置包括:
请求接收模块,用于接收检索请求,所述检索请求中请求从数据库中查询中间位置或者末尾位置包含有检索字符的字符串数据;
目标子树查询模块,用于从索引信息指示的各种字符组合中确定目标字符组合,所述索引信息用于指示前缀树中各个节点作为起始节点的子树所包含的字符组合;所述前缀树是基于所述数据库中包含的字符串数据构建的;所述目标字符组合包含n位字符,且所述目标字符组合与所述检索字符中的前n位字符相同;n为大于或者等于1的整数;将所述目标字符组合对应的起始节点确定为目标起始节点;从所述目标起始节点开始,在所述前缀树中对所述检索字符进行前缀匹配,得到所述目标子树,所述目标子树是对应的字符组合与所述检索字符相同的子树;其中,响应于所述目标起始节点包括m个节点,m为大于或者等于2的整数,获取所述m个节点各自在所述前缀树中的层级,所述层级用于指示对应的节点到根节点的距离;按照层级从低到高的顺序,依次从所述m个节点中的各个节点开始,在所述前缀树中对所述检索字符进行前缀匹配,得到所述目标子树;
前后缀字符获取模块,用于从所述前缀树中获取所述目标子树的前缀字符和后缀字符;所述前缀字符是所述前缀树的根节点到所述目标子树的首个节点之间的各个节点对应的字符组合;所述后缀字符是所述目标子树之后的数据尾节点到所述目标子树的最后一个节点之间的各个节点对应的字符组合;所述数据尾节点是所述前缀树中,对应所述数据库中的字符串数据的最后一个字符的节点;
字符拼接模块,用于将所述前缀字符、所述检索字符以及所述后缀字符拼接,得到所述检索请求对应的目标字符串数据,所述检索字符位于所述目标字符串数据中的中间位置或者末尾位置。
12.一种计算机设备,其特征在于,所述计算机设备包含处理器和存储器,所述存储器中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、所述至少一段程序、所述代码集或指令集由所述处理器加载并执行以实现如权利要求1至10任一所述的字符串数据检索方法。
13.一种计算机可读存储介质,其特征在于,所述存储介质中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、所述至少一段程序、所述代码集或指令集由处理器加载并执行以实现如权利要求1至10任一所述的字符串数据检索方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010167413.4A CN111339382B (zh) | 2020-03-11 | 2020-03-11 | 字符串数据检索方法、装置、计算机设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010167413.4A CN111339382B (zh) | 2020-03-11 | 2020-03-11 | 字符串数据检索方法、装置、计算机设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111339382A CN111339382A (zh) | 2020-06-26 |
CN111339382B true CN111339382B (zh) | 2023-09-22 |
Family
ID=71182195
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010167413.4A Active CN111339382B (zh) | 2020-03-11 | 2020-03-11 | 字符串数据检索方法、装置、计算机设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111339382B (zh) |
Families Citing this family (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112269786B (zh) * | 2020-11-02 | 2023-02-03 | 浪潮云信息技术股份公司 | 一种内存数据库kv存储引擎索引的创建方法 |
CN114490917A (zh) * | 2020-11-11 | 2022-05-13 | 北京神州泰岳软件股份有限公司 | 一种全文检索功能的实现方法、装置与电子设备 |
CN112416936B (zh) * | 2020-11-22 | 2023-01-03 | 西安热工研究院有限公司 | 一种dcs后台多节点协同组态标记名校验方法 |
CN113380356B (zh) * | 2021-05-10 | 2024-04-16 | 广州零端科技有限公司 | 分支链式溯源的医疗检查数据记录方法、查询方法及装置 |
CN113342848B (zh) * | 2021-05-25 | 2024-04-02 | 中国平安人寿保险股份有限公司 | 信息搜索方法、装置、终端设备及计算机可读存储介质 |
CN113555069A (zh) * | 2021-07-22 | 2021-10-26 | 杭州叙简科技股份有限公司 | 一种基于ac自动机的化学品名称检索和抽取方法及装置 |
CN113609344B (zh) * | 2021-09-29 | 2022-01-14 | 北京泰迪熊移动科技有限公司 | 字节流状态机的构建方法及装置、电子设备、存储介质 |
CN114168807A (zh) * | 2021-11-22 | 2022-03-11 | 中核核电运行管理有限公司 | 字符串匹配方法及装置 |
CN116701719B (zh) * | 2023-07-28 | 2024-01-02 | 腾讯科技(深圳)有限公司 | 一种数据处理方法、装置、计算机设备以及可读存储介质 |
CN117113436B (zh) * | 2023-10-16 | 2024-01-26 | 中电科大数据研究院有限公司 | 一种基于区块链的数据可信确权方法和装置 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR20110060428A (ko) * | 2009-11-30 | 2011-06-08 | 동국대학교 산학협력단 | 프리픽스 트리 기반 색인 방법 및 장치, 그 기록 매체 |
CN105468597A (zh) * | 2014-08-14 | 2016-04-06 | 腾讯科技(北京)有限公司 | 一种获取跳转距离的方法及装置 |
CN106970936A (zh) * | 2017-02-09 | 2017-07-21 | 阿里巴巴集团控股有限公司 | 数据处理方法及装置、数据查询方法及装置 |
CN110020001A (zh) * | 2017-12-29 | 2019-07-16 | 阿里巴巴集团控股有限公司 | 字符串数据的存储、查询方法以及相应的设备 |
CN110851722A (zh) * | 2019-11-12 | 2020-02-28 | 腾讯云计算(北京)有限责任公司 | 基于字典树的搜索处理方法、装置、设备和存储介质 |
-
2020
- 2020-03-11 CN CN202010167413.4A patent/CN111339382B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR20110060428A (ko) * | 2009-11-30 | 2011-06-08 | 동국대학교 산학협력단 | 프리픽스 트리 기반 색인 방법 및 장치, 그 기록 매체 |
CN105468597A (zh) * | 2014-08-14 | 2016-04-06 | 腾讯科技(北京)有限公司 | 一种获取跳转距离的方法及装置 |
CN106970936A (zh) * | 2017-02-09 | 2017-07-21 | 阿里巴巴集团控股有限公司 | 数据处理方法及装置、数据查询方法及装置 |
CN110020001A (zh) * | 2017-12-29 | 2019-07-16 | 阿里巴巴集团控股有限公司 | 字符串数据的存储、查询方法以及相应的设备 |
CN110851722A (zh) * | 2019-11-12 | 2020-02-28 | 腾讯云计算(北京)有限责任公司 | 基于字典树的搜索处理方法、装置、设备和存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN111339382A (zh) | 2020-06-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111339382B (zh) | 字符串数据检索方法、装置、计算机设备及存储介质 | |
US11030243B2 (en) | Structure based storage, query, update and transfer of tree-based documents | |
US11146286B2 (en) | Compression of JavaScript object notation data using structure information | |
EP2245836B1 (en) | Determining a property of a communication device | |
US9195738B2 (en) | Tokenization platform | |
US7886223B2 (en) | Generating a statistical tree for encoding/decoding an XML document | |
US8145674B2 (en) | Structure based storage, query, update and transfer of tree-based documents | |
CN109104405B (zh) | 二进制协议编码、解码方法和装置 | |
US10275229B2 (en) | Encoded data object notation persistence format | |
CN108733317B (zh) | 数据存储方法和装置 | |
WO2023131218A1 (zh) | 图数据的存储 | |
CN102867049A (zh) | 一种基于单词查找树实现的汉语拼音快速分词方法 | |
CN114490853A (zh) | 数据处理方法、装置、设备、存储介质及程序产品 | |
CN112069305B (zh) | 数据筛选方法、装置及电子设备 | |
CN115840751B (zh) | 一种新型树状数据的编码方法 | |
CN108549679B (zh) | 用于url分析系统的文件扩展名快速匹配方法和装置 | |
CN114048219A (zh) | 图数据库更新方法及装置 | |
CN113378544A (zh) | 文本解析方法、文本数据获取方法、装置、介质及设备 | |
CN112988778A (zh) | 一种处理数据库查询脚本的方法和装置 | |
CN112784596A (zh) | 一种识别敏感词的方法和装置 | |
CN111178025A (zh) | 核电站运行导则的编辑方法、装置、计算机设备及存储介质 | |
CN113609309B (zh) | 知识图谱构建方法、装置、存储介质及电子设备 | |
CN110019336B (zh) | 一种查询数据的方法和装置 | |
CN112115099B (zh) | 数据归一化方法、装置、计算机可读介质和电子设备 | |
CN114443866A (zh) | 数据处理方法、装置、计算设备及介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: DE Ref document number: 40024065 Country of ref document: HK |
|
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |