一种sql语句的相似度检测方法和装置
技术领域:
:1.本发明涉及数据库
技术领域:
:,尤其涉及一种sql语句的相似度检测方法和装置。
背景技术:
::2.数据库技术在各个领域的使用十分广泛,且在使用sql(structuredquerylanguage,结构化查询语言)语句进行数据库中数据的创建和导入时,需要保证不存在冗余数据。由于sql语句具有一定的灵活性,会存在执行了两个sql语句,但实际产生了相同效果的情况。比如,业务人员a执行sql_a语句建立了一条数据,业务人员b执行了sql_b语句也建立了一条数据,由于sql_a语句和sql_b语句的实际效果一致,导致历史数据中存在了相同的两条数据,造成下游任务失败。3.为了避免上述情况的发生,需要对sql语句进行相似度检测。现有技术中,通常使用距离公式或者深度学习的方式,进行相似文本的识别检测。但是距离公式的方式检测精度低;深度学习的方式需要对大量训练样本进行标记,耗时长,计算复杂度高,检测速度慢。技术实现要素:4.有鉴于此,本发明实施例提供一种sql语句的相似度检测方法和装置,该方法先确定待测sql语句的语句类型,并对待测sql语句中包含比较运算符的原始表达式进行格式转换,得到第一目标sql语句,进而计算第一目标sql语句与相同类型的历史sql语句的第二目标sql语句之间的相似度,能够兼顾比较运算符带来的语义差异,提高检测精度,且检测速度快。5.为实现上述目的,根据本发明实施例的一个方面,提供了一种sql语句的相似度检测方法。6.本发明实施例的一种sql语句的相似度检测方法,包括:获取待测sql语句的目标字符和关键字信息,根据所述目标字符和所述关键字信息的获取结果,确定所述待测sql语句的语句类型;7.根据设定的表达式格式,将所述待测sql语句中包含比较运算符的原始表达式转换为新表达式,得到相应的第一目标sql语句;8.获取与所述待测sql语句具有相同语句类型的历史sql语句的第二目标sql语句;其中,所述第二目标sql语句是按照所述表达式格式,对所述历史sql语句进行转换得到;9.计算所述第一目标sql语句和所述第二目标sql语句的相似度,以确定所述待测sql语句和所述历史sql语句的相似度。10.可选地,所述原始表达式包括所述比较运算符、位于所述比较运算符前面的第一字符串和位于所述比较运算符后面的第二字符串;所述表达式格式用于根据所述第一字符串和所述第二字符串的大小,将所述原始表达式转换为前小后大或者前大后小的形式。11.可选地,所述根据设定的表达式格式,将所述待测sql语句中包含比较运算符的原始表达式转换为新表达式,包括:12.如果所述待测sql语句中包含的比较运算符为等号、不等号或者不全等,则计算所述第一字符串的大小以及所述第二字符串的大小,确定所述第一字符串的大小大于所述第二字符串的大小,调换所述第一字符串和所述第二字符串的顺序;13.如果所述待测sql语句中包含的比较运算符为大于号,则将所述大于号变更为小于号,调换所述第一字符串和所述第二字符串的顺序;14.如果所述待测sql语句中包含的比较运算符为大于等于号,则将所述大于等于号变更为小于等于号,调换所述第一字符串和所述第二字符串的顺序。15.可选地,所述得到相应的第一目标sql语句的步骤之前,所述方法还包括:16.计算位于设定的第一关键字和第二关键字之间的多个字符串的大小;17.根据所述多个字符串的大小,调换所述多个字符串的顺序。18.可选地,所述计算所述第一目标sql语句和所述第二目标sql语句的相似度,包括:19.使用局部敏感哈希算法,分别对所述第一目标sql语句和所述第二目标sql语句进行特征提取,得的相应的待测特征向量和参照特征向量;20.计算所述待测特征向量和所述参照特征向量的距离,将所述距离作为所述第一目标sql语句和所述第二目标sql语句的相似度。21.可选地,所述方法还包括:22.将所述第二目标sql语句的参照特征向量保存到数据库;其中,所述参照特征向量是使用局部敏感哈希算法,对所述第二目标sql语句进行特征提取得到的;23.所述计算所述第一目标sql语句和所述第二目标sql语句的相似度,包括:24.使用所述局部敏感哈希算法,对所述第一目标sql语句进行特征提取,得的相应的待测特征向量;25.计算所述待测特征向量和保存的所述参照特征向量的距离,将所述距离作为所述第一目标sql语句和所述第二目标sql语句的相似度。26.可选地,所述根据所述目标字符和所述关键字信息的获取结果,确定所述待测sql语句的语句类型,包括:27.如果所述待测sql语句中同时存在所述目标字符和设定的目标关键字,则确定所述待测sql语句的语句类型为第一类型;28.如果所述待测sql语句中存在所述目标字符,但不存在所述目标关键字,则确定所述待测sql语句的语句类型为第二类型;29.如果所述待测sql语句中不存在所述目标字符,但存在所述目标关键字,则确定所述待测sql语句的语句类型为第三类型;30.如果所述待测sql语句中不存在所述目标字符和所述目标关键字,则确定所述待测sql语句的语句类型为第四类型。31.可选地,所述方法还包括:32.获取历史sql语句集中历史sql语句的所述目标字符和所述关键字信息,根据所述目标字符和所述关键字信息的获取结果,确定所述历史sql语句的语句类型;33.根据所述表达式格式,将所述历史sql语句中包含比较运算符的原始表达式转换为新表达式,得到相应的第二目标sql语句。34.为实现上述目的,根据本发明实施例的另一方面,提供了一种sql语句的相似度检测装置。35.本发明实施例的一种sql语句的相似度检测装置,包括:分类模块,用于获取待测sql语句的目标字符和关键字信息,根据所述目标字符和所述关键字信息的获取结果,确定所述待测sql语句的语句类型;36.转换模块,用于根据设定的表达式格式,将所述待测sql语句中包含比较运算符的原始表达式转换为新表达式,得到相应的第一目标sql语句;37.获取模块,用于获取与所述待测sql语句具有相同语句类型的历史sql语句的第二目标sql语句;其中,所述第二目标sql语句是按照所述表达式格式,对所述历史sql语句进行转换得到;38.计算模块,用于计算所述第一目标sql语句和所述第二目标sql语句的相似度,以确定所述待测sql语句和所述历史sql语句的相似度。39.可选地,所述原始表达式包括所述比较运算符、位于所述比较运算符前面的第一字符串和位于所述比较运算符后面的第二字符串;所述表达式格式用于根据所述第一字符串和所述第二字符串的大小,将所述原始表达式转换为前小后大或者前大后小的形式。40.可选地,所述转换模块,还用于41.如果所述待测sql语句中包含的比较运算符为等号、不等号或者不全等,则计算所述第一字符串的大小以及所述第二字符串的大小,确定所述第一字符串的大小大于所述第二字符串的大小,调换所述第一字符串和所述第二字符串的顺序;42.如果所述待测sql语句中包含的比较运算符为大于号,则将所述大于号变更为小于号,调换所述第一字符串和所述第二字符串的顺序;以及43.如果所述待测sql语句中包含的比较运算符为大于等于号,则将所述大于等于号变更为小于等于号,调换所述第一字符串和所述第二字符串的顺序。44.可选地,所述装置还包括:优化模块,用于45.计算位于设定的第一关键字和第二关键字之间的多个字符串的大小;以及46.根据所述多个字符串的大小,调换所述多个字符串的顺序。47.可选地,所述计算模块,还用于48.使用局部敏感哈希算法,分别对所述第一目标sql语句和所述第二目标sql语句进行特征提取,得的相应的待测特征向量和参照特征向量;以及49.计算所述待测特征向量和所述参照特征向量的距离,将所述距离作为所述第一目标sql语句和所述第二目标sql语句的相似度。50.可选地,所述装置还包括:保存模块,用于51.将所述第二目标sql语句的参照特征向量保存到数据库;其中,所述参照特征向量是使用局部敏感哈希算法,对所述第二目标sql语句进行特征提取得到的;52.所述计算模块,还用于使用所述局部敏感哈希算法,对所述第一目标sql语句进行特征提取,得的相应的待测特征向量;以及53.计算所述待测特征向量和保存的所述参照特征向量的距离,将所述距离作为所述第一目标sql语句和所述第二目标sql语句的相似度。54.可选地,所述分类模块,用于55.如果所述待测sql语句中同时存在所述目标字符和设定的目标关键字,则确定所述待测sql语句的语句类型为第一类型;56.如果所述待测sql语句中存在所述目标字符,但不存在所述目标关键字,则确定所述待测sql语句的语句类型为第二类型;57.如果所述待测sql语句中不存在所述目标字符,但存在所述目标关键字,则确定所述待测sql语句的语句类型为第三类型;以及58.如果所述待测sql语句中不存在所述目标字符和所述目标关键字,则确定所述待测sql语句的语句类型为第四类型。59.可选地,所述装置还包括:预处理模块,用于60.获取历史sql语句集中历史sql语句的所述目标字符和所述关键字信息,根据所述目标字符和所述关键字信息的获取结果,确定所述历史sql语句的语句类型;以及61.根据所述表达式格式,将所述历史sql语句中包含比较运算符的原始表达式转换为新表达式,得到相应的第二目标sql语句。62.为实现上述目的,根据本发明实施例的又一方面,提供了一种电子设备。63.本发明实施例的一种电子设备,包括:一个或多个处理器;存储装置,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现本发明实施例的一种sql语句的相似度检测方法。64.为实现上述目的,根据本发明实施例的再一方面,提供了一种计算机可读介质。65.本发明实施例的一种计算机可读介质,其上存储有计算机程序,所述程序被处理器执行时实现本发明实施例的一种sql语句的相似度检测方法。66.为实现上述目的,根据本发明实施例的又一方面,提供了一种计算机程序产品。67.本发明实施例的一种计算机程序产品,包括计算机程序,所述程序被处理器执行时实现本发明实施例的一种sql语句的相似度检测方法。68.上述发明中的一个实施例具有如下优点或有益效果:先确定待测sql语句的语句类型,并对待测sql语句中包含比较运算符的原始表达式进行格式转换,得到第一目标sql语句,进而计算第一目标sql语句与相同类型的历史sql语句的第二目标sql语句之间的相似度,能够兼顾比较运算符带来的语义差异,提高检测精度,且检测速度快。通过将原始表达式转换为统一格式,避免了在相似度检测时由于比较运算符造成的差异。69.基于比较运算符的不同类型,对原始表达式进行不同处理,保证能够将包含不同运算符类型的原始表达式转换为统一格式。通过将待测sql语句中位于两个关键字之间的字符串统一顺序,避免了在相似度检测时由于字符串顺序不同造成的差异。通过特征提取,把待测sql语句和历史sql语句降维到哈希数字,便于后续快速计算待测sql语句和历史sql语句之间的相似度。70.将历史sql语句的特征向量保存到数据库,便于后续实时快速计算待测sql语句和历史sql语句之间的相似度。通过对待测sql语句分组的方式,能够减少后续与历史sql语句的比对次数,大大提升计算效率。按照待测sql语句的处理方式,对历史sql语句集的历史sql语句进行分类和格式转换,便于从历史sql语句集中快速、准确的得到与待测sql语句相似的历史sql语句。71.上述的非惯用的可选方式所具有的进一步效果将在下文中结合具体实施方式加以说明。附图说明72.附图用于更好地理解本发明,不构成对本发明的不当限定。其中:73.图1是本发明实施例一的sql语句的相似度检测方法的主要步骤的示意图;74.图2是本发明实施例二的sql语句的相似度检测方法的主要流程的示意图;75.图3是本发明实施例三的sql语句的相似度检测方法的主要流程的示意图;76.图4是本发明实施例的sql语句的相似度检测装置的主要模块的示意图;77.图5是本发明实施例可以应用于其中的示例性系统架构图;78.图6是适于用来实现本发明实施例的电子设备的计算机系统的结构示意图。具体实施方式79.以下结合附图对本发明的示范性实施例做出说明,其中包括本发明实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本发明的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。80.本技术技术方案中对数据的获取、存储、使用、处理等均符合国家法律法规的相关规定。81.可以理解,本技术所使用的术语“第一”、“第二”等仅用于区分描述,而不能理解为指示或暗示相对重要性。举例来说,在不脱离本技术的范围的情况下,可将第一目标sql语句称为第二目标sql语句,且类似地,也可将第二目标sql语句称为第一目标sql语句。82.如
背景技术:
:所述,由于sql语句具有一定的灵活性,会存在执行了两个sql语句,但实际产生了相同效果的情况。比如,业务人员a在进行条件过滤时使用了whereooa.a=stb.b,而业务人员b使用了wherestb.b=ooa.a,其余部分一致。83.上述两个sql语句,由于ooa.a=stb.b和stb.b=ooa.a所表达的意思相同,两者等价,其实际执行效果一致,也即两个sql语句的语义相同。但是从形成sql语句的字符串角度上来看它们是存在差异的,这是由于比较运算符(=)的存在干扰了算法的判别,因此需要对包含比较运算符的、语义相同的sql语句去重。84.而现有的基于距离公式或者深度学习的方式对sql语句进行相似度检测时,是将sql语句转换为sql字符串,然后计算字符串之间的距离来确定sql语句的相似性,或者使用sql字符串训练词向量模型来计算文本语句的相似度,根本无法对包含比较运算符的sql语句进行相似度检测,也无法解决由于比较运算符号造成的sql语义上的差异性问题。85.另外,基于距离公式的方式,当字符长度过大且样本数量过大时,计算耗时非常严重。基于深度学习的方式,模型训练耗时,且在数据发生变化时需要重新训练模型,造成用户体验差。为了解决上述种种问题,本实施例提供了一种对包含比较运算符的sql语句的相似度检测方法,该方法实现简单、检测计算复杂度低,检测效率高。下面结合附图进行详细说明。86.实施例一87.图1是本发明实施例一的sql语句的相似度检测方法的主要步骤的示意图。如图1所示,本发明实施例一的sql语句的相似度检测方法,主要包括如下步骤:88.步骤s101:获取待测sql语句的目标字符和关键字信息,根据所述目标字符和所述关键字信息的获取结果,确定所述待测sql语句的语句类型。遍历待测sql语句的字符和关键字,判断其是否包含设定的目标字符和目标关键字,根据判断结果确定待测sql语句的语句类型。89.示例性的,目标字符可以为*、%等,具体可以根据实际需要进行设置。目标关键字可以是where、alter、create等,具体也可以根据实际需要进行设置。实施例中,可以通过收集多条sql语句,统计各关键字的数量,将满足设定目标条件(比如处于中位数位置、数量最多等)的关键字作为目标关键字。90.在确定待测sql语句的语句类型时,可以通过以下方式:如果待测sql语句中同时存在目标字符和目标关键字,则确定待测sql语句的语句类型为第一类型;如果待测sql语句中存在目标字符,但不存在目标关键字,则确定待测sql语句的语句类型为第二类型;如果待测sql语句中不存在目标字符,但存在目标关键字,则确定待测sql语句的语句类型为第三类型;如果待测sql语句中不存在目标字符和目标关键字,则确定待测sql语句的语句类型为第四类型。91.步骤s102:根据设定的表达式格式,将所述待测sql语句中包含比较运算符的原始表达式转换为新表达式,得到相应的第一目标sql语句。原始表达式包括比较运算符、位于比较运算符前面的第一字符串和位于比较运算符后面的第二字符串。表达式格式用于根据第一字符串和第二字符串的大小,将原始表达式转换为前小后大或者前大后小的形式。92.其中,前小后大是指转换后位于比较运算符前面的字符串的大小大于位于比较运算符后面的字符串的大小。前大后小是指转换后位于比较运算符前面的字符串的大小小于位于比较运算符后面的字符串的大小。93.步骤s103:获取与所述待测sql语句具有相同语句类型的历史sql语句的第二目标sql语句。预先存储不同语句类型的历史sql语句对应的第二目标sql语句。其中,第二目标sql语句是按照上述表达式格式,对历史sql语句进行转换得到的。本步骤中需根据待测sql语句的语句类型,查找具有相同语句类型的历史sql语句的第二目标sql语句。94.步骤s104:计算所述第一目标sql语句和所述第二目标sql语句的相似度,以确定所述待测sql语句和所述历史sql语句的相似度。计算两个目标sql语句之间的相似度,将该相似度作为待测sql语句和历史sql语句的相似度,至此相似度检测完成。95.本实施例通过对包含比较运算符的待测sql语句进行格式转换,实现了包含比较运算符的sql语句的相似度检测,同时能够兼顾比较运算符带来的语义差异,提高检测精度;另外通过对待测sql语句分组,使得仅需计算与其相同类型的历史sql语句的相似度,提升了检测速度。96.实施例二97.图2是本发明实施例二的sql语句的相似度检测方法的主要流程的示意图。如图2所示,本发明实施例二的sql语句的相似度检测方法,主要包括如下步骤:98.步骤s201:获取历史sql语句集中历史sql语句的目标字符和关键字信息,根据目标字符和关键字信息的获取结果,确定历史sql语句的语句类型。遍历历史sql语句集中各历史sql语句的字符和关键字,判断其是否包含设定的目标字符和目标关键字,根据判断结果确定各历史sql语句的语句类型。99.在确定各历史sql语句的语句类型时,可以通过以下方式:如果历史sql语句中同时存在目标字符和目标关键字,则确定历史sql语句的语句类型为第一类型;如果历史sql语句中存在目标字符,但不存在目标关键字,则确定历史sql语句的语句类型为第二类型;如果历史sql语句中不存在目标字符,但存在目标关键字,则确定历史sql语句的语句类型为第三类型;如果历史sql语句中不存在目标字符和目标关键字,则确定历史sql语句的语句类型为第四类型。100.步骤s202:根据各历史sql语句的语句类型,将历史sql语句集划分为多个历史sql语句子集。由于语句类型为四类,故对历史sql语句集划分所得的历史sql语句子集也为四个。该操作能够减小在相似匹配时的搜索控件,提高相似度检测的效率。101.示例性的,可以将归属于第一类型的历史sql语句添加到第一历史sql语句子集;可以将归属于第二类型的历史sql语句添加到第二历史sql语句子集;可以将归属于第三类型的历史sql语句添加到第三历史sql语句子集;可以将归属于第四类型的历史sql语句添加到第四历史sql语句子集。102.步骤s203:根据设定的表达式格式,将各历史sql语句子集的历史sql语句中包含比较运算符的原始表达式转换为新表达式,得到相应的第二目标sql语句。该步骤用于将历史sql语句中带有比较运算符的原始表达式转换为统一格式,便于后续检测出语义相同的sql语句,避免由于比较运算符造成相似度检测的错误。103.其中,语义相同是指形式上不同的两个sql语句的运行效果相同。形式上不同的两个sql语句是指两个sql语句的字符串不同。比如条件过滤语句:whereooa.a=stb.b和wherestb.b=ooa.a,这两个语句从形成sql语句的字符串角度来看是不同的,但是其实际运行效果相同,因此这两个sql语句的语义相同。104.原始表达式包括比较运算符、位于比较运算符前面的第一个非空字符串(可称为第一字符串)和位于比较运算符后面的第一个非空字符串(称为第二字符串)。比较运算符有多种类型,包括等号(=)、不等号(《》)、不全等(!=)、大于号(》)、小于号(《)、大于等于号(》=)和小于等于号(《=)。不同类型的比较运算符转换存在差异,下面以将原始表达式转换为前小后大和前大后小两种形式为例,对原始表达式的转换过程分别进行详细说明。105.前小后大形式:如果历史sql语句中包含的比较运算符为等号、不等号或者不全等,计算第一字符串的大小以及第二字符串的大小,如果第一字符串的大小大于第二字符串的大小,则调换第一字符串和第二字符串的顺序;如果第一字符串的大小小于等于第二字符串的大小,则不做调整。106.如果历史sql语句中包含的比较运算符为大于号,则将大于号变更为小于号,调换第一字符串和第二字符串的顺序;如果历史sql语句中包含的比较运算符为小于号,则不做调整。如果历史sql语句中包含的比较运算符为大于等于号,则将大于等于号变更为小于等于号,调换第一字符串和第二字符串的顺序;如果历史sql语句中包含的比较运算符为小于等于号,则不做调整。107.前大后小形式:如果历史sql语句中包含的比较运算符为等号、不等号或者不全等,计算第一字符串的大小以及第二字符串的大小,如果第一字符串的大小小于第二字符串的大小,则调换第一字符串和第二字符串的顺序;如果第一字符串的大小大于等于第二字符串的大小,则不做调整。108.如果历史sql语句中包含的比较运算符为小于号,则将小于号变更为大于号,调换第一字符串和第二字符串的顺序;如果历史sql语句中包含的比较运算符为大于号,则不做调整。如果历史sql语句中包含的比较运算符为小于等于号,则将小于等于号变更为大于等于号,调换第一字符串和第二字符串的顺序;如果历史sql语句中包含的比较运算符为大于等于号,则不做调整。109.实施例中,在计算第一字符串的大小以及第二字符串的大小时,可以先获得每个字符的编码(比如unicode编码),逐位比较第一字符串和第二字符串相同位置的两个字符的编码大小,如果相等,则继续比较后续字符;如果不等,则终止比较,编码小的字符所属的字符串为两者中较小的字符串。110.步骤s204:当接收到待测sql语句时,获取待测sql语句的目标字符和关键字信息。待测sql语句即需要进行相似度检测的sql语句,该语句可能包含比较运算符,也可能不包含比较运算符。对于待测sql语句的处理与历史sql语句相同。具体地,遍历待测sql语句的字符和关键字,判断其是否包含设定的目标字符和目标关键字。111.步骤s205:根据目标字符和关键字信息的获取结果,确定待测sql语句的语句类型,以及具有相同语句类型的历史sql语句子集。本步骤中通过确定待测sql语句的语句类型,以及与待测sql语句具有相同语句类型的历史sql语句子集,可以很大程序上减少后续语句比对的次数,大大提升计算效率,加快检测速度。112.如果待测sql语句中同时存在目标字符和目标关键字,则确定待测sql语句的语句类型为第一类型;如果待测sql语句中存在目标字符,但不存在目标关键字,则确定待测sql语句的语句类型为第二类型;如果待测sql语句中不存在目标字符,但存在目标关键字,则确定待测sql语句的语句类型为第三类型;如果待测sql语句中不存在目标字符和目标关键字,则确定待测sql语句的语句类型为第四类型。113.步骤s206:根据设定的表达式格式,将待测sql语句中包含比较运算符的原始表达式转换为新表达式,得到相应的第一目标sql语句。该步骤用于将待测sql语句中带有比较运算符的原始表达式转换为统一格式,避免由于比较运算符造成相似度检测的错误。114.待测sql语句中原始表达式的转换方式与历史sql语句中原始表达式的转换方式相同。即如果历史sql语句中原始表达式转换为前小后大的形式,则也将待测sql语句中的原始表达式转换为前小后大的形式。即如果历史sql语句中原始表达式转换为前大后小的形式,则也将待测sql语句中的原始表达式转换为前大后小的形式。115.以将待测sql语句中的原始表达式转换为前小后大的形式为例,具体转换过程为:如果待测sql语句中包含的比较运算符为等号、不等号或者不全等,计算第一字符串的大小以及第二字符串的大小,如果第一字符串的大小大于第二字符串的大小,则调换第一字符串和第二字符串的顺序;如果第一字符串的大小小于等于第二字符串的大小,则不做调整。116.如果待测sql语句中包含的比较运算符为大于号,则将大于号变更为小于号,调换第一字符串和第二字符串的顺序;如果待测sql语句中包含的比较运算符为小于号,则不做调整。如果待测sql语句中包含的比较运算符为大于等于号,则将大于等于号变更为小于等于号,调换第一字符串和第二字符串的顺序;如果待测sql语句中包含的比较运算符为小于等于号,则不做调整。117.在计算第一字符串的大小以及第二字符串的大小时,同样可以先获得每个字符的编码(比如unicode编码),逐位比较第一字符串和第二字符串相同位置的两个字符的编码大小,如果相等,则继续比较后续字符;如果不等,则终止比较,编码小的字符所属的字符串为两者中较小的字符串。118.步骤s207:计算第一目标sql语句与确定的历史sql语句子集中各历史sql语句的第二目标sql语句之间的相似度,以确定待测sql语句与各历史sql语句的相似度。步骤s205中确定出了与待测sql语句具有相同语句类型的历史sql语句子集,计算第一目标sql语句与该历史sql语句子集中各历史sql语句的第二目标sql语句之间的相似度。119.在计算第一目标sql语句与任一第二目标sql语句的相似度时,首先使用局部敏感哈希算法(simhash算法),分别对第一目标sql语句和第二目标sql语句进行特征提取,得的相应的待测特征向量和参照特征向量。之后计算待测特征向量和参照特征向量的距离,将该距离作为第一目标sql语句和该第二目标sql语句的相似度。120.示例性的,在计算待测特征向量和参照特征向量的距离时,可以通过编辑距离、余弦距离等方式计算。在一优选的实施例中,可以先计算编辑距离,再计算余弦距离,将两者均值作为待测特征向量和参照特征向量最终的距离,以提高检测准确性。121.按照上述方式计算第一目标sql语句与相同语句类型的历史sql语句子集相应的各第二目标sql语句的相似度。第一目标sql语句和各第二目标sql语句的相似度即待测sql语句与相应历史sql语句的相似度。122.步骤s208:根据相似度大小,从历史sql语句子集中筛选出与待测sql语句相似的历史sql语句。本步骤中可以按照相似度大小,对相同语句类型的历史sql语句子集的各历史sql语句进行排序,选择前k个相似度大的历史sql语句作为与待测sql语句相似的历史sql语句;或者还可以选择相似度大于设定阈值的历史sql语句作为与待测sql语句相似的历史sql语句。其中,k为正整数。123.实施例中,根据业务需要,还可以将确定出相似的历史sql语句按照相似度由大到小的顺序进行排序返回。124.包含比较运算符的sql语句字符数量较多,一般在1000字符以上,实施例二的相似度检测方案通过数据清洗、分类等操作,在不影响sql语句相似度检测的前提下,精简了sql语句长度,能够实现高效迅速的相似度检测,适用于mysql、oracle等不同种类的sql语句。另外,本实施例是基于字符串进行操作,实现简单,在数量庞大的历史sql语句基础之上,能够快速找到与待测sql语句相似的语句。125.实施例三126.图3是本发明实施例三的sql语句的相似度检测方法的主要流程的示意图。如图3所示,本发明实施例三的sql语句的相似度检测方法,主要包括如下步骤:127.步骤s301:获取历史sql语句集中历史sql语句的目标字符和关键字信息,根据目标字符和关键字信息的获取结果,确定历史sql语句的语句类型。历史sql语句集的历史sql语句可以包含比较运算符,也可以没有比较运算符。通常情况下,历史sql语句存储在数据库(比如mysql)中,从数据库中导出需要的历史sql语句,得到历史sql语句集。优选的,以包含比较运算符的历史sql语句构建历史sql语句集。128.在构建出历史sql语句集后,对其中的历史sql语句进行预处理,包括数据清洗、统一大小写和分类。其中,数据清洗是删除历史sql语句中的冗余信息,比如注释信息、连续多个空格、换行等,用于降低对相似度检测的干扰,以及减少存储压力。统一大小写,比如将历史sql语句的字符(除汉字、通配符、转义符等之外)统一处理为小写。129.对历史sql语句分类,相当于建立了一个粗索引,该粗索引在一定程度上可以降低sql语句之间的比较次数。在分类时,需要遍历历史sql语句集中各历史sql语句的字符和关键字,判断其是否包含设定的目标字符和目标关键字,根据判断结果确定各历史sql语句的语句类型。130.历史sql语句包括多种类型的命令,比如创建数据库、删除数据库、创建表、删除表、查询、更新、排序、求和等。目标字符和目标关键字可以根据命令类型,以及实际业务需求进行设置。实施例中,还可以随机收集若干条sql语句,统计这些sql语句中关键字的数量,选择处于中位数位置的关键字作为目标关键字。131.以查询语句为例,目标字符可以为*,此时需要判断历史sql语句的select关键字和from关键字之间是否为*;目标关键字可以为where,此时即判断历史sql语句中是否包含where关键字。具体可以划分为如表1所示的四种情况,其中y代表包含,n代表不包含:132.表1133.select与from之间是否包含*是否包含where关键字yyynnynn134.步骤s302:根据各历史sql语句的语句类型,将历史sql语句集划分为多个历史sql语句子集。将历史sql语句逐一分类到所属历史sql语句子集当中,得到四个历史sql语句子集,分别为label_1、label_2、label_3和label_4,完成历史sql语句集的分类工作。需要说明的是,本实施例是以划分四类进行说明,实际应用中可以根据实际需求增减分类类别。135.其中,label_1为第一历史sql语句子集,用于存储表1中属于第一种情况的历史sql语句;label_2为第二历史sql语句子集,用于存储表1中属于第二种情况的历史sql语句;label_3为第三历史sql语句子集,用于存储表1中属于第三种情况的历史sql语句;label_4为第四历史sql语句子集,用于存储表1中属于第四种情况的历史sql语句。136.步骤s303:根据设定的表达式格式,将各历史sql语句子集的历史sql语句中包含比较运算符的原始表达式转换为新表达式,得到相应的第二目标sql语句。该步骤用于将历史sql语句中带有比较运算符的原始表达式转换为统一格式,比如将ooa.a=stb.b和stb.b=ooa.a转换为统一格式,避免由于比较运算符造成相似度检测的错误。137.如前所述,不同类型的比较运算符的转换存在差异,对于历史sql语句中包含的比较运算符为=、《》或者!=时,转换方式相同。对于历史sql语句中包含的比较运算符为》或者《时,转换方式相同。对于历史sql语句中包含的比较运算符为》=或者《=时,转换方式相同。下面进行举例说明。138.以将历史sql语句wherea=b的原始表达式转换为前小后大形式为例,其包含的原始表达式为:a=b,则拆分等号前面和后面的第一个非空字符串,得到字符串a和字符串b;之后计算字符串a和字符串b中每个字符的编码,逐位比较字符串a和字符串b相同位置的两个字符的编码大小,如果相等,则继续比较后续字符;如果不等,则终止比较,编码小的字符所属的字符串为两者中较小的字符串。如果字符串a的大小大于字符串b的大小,则将a=b调整为b=a;如果字符串a的大小等于或者字符串b的大小,则不做调整。139.再以将历史sql语句wherea》b的原始表达式转换为前小后大形式为例,其包含的原始表达式为:a》b,则拆分等号前面和后面的第一个非空字符串,得到字符串a和字符串b;之后将“》”变更为“《”,并将字符串a和字符串b进行调换,即调整为b《a。再以将历史sql语句wherea》=b的原始表达式转换为前小后大形式为例,其包含的原始表达式为:a》=b,则拆分等号前面和后面的第一个非空字符串,得到字符串a和字符串b;之后将“》=”变更为“《=”,并将字符串a和字符串b进行调换,即调整为b《=a。140.需要说明的是,假设历史sql语句为selectnamefromtable_namewherename=‘bob’,由于“=”前后没有使用相同的引号(“”)引用起来,说明两者并非相同含义,此时不做转换。141.在一可选的实施例中,有些业务需要留存原始的历史sql语句,因此可以建立一个字典映射来保存历史sql语句和第二目标sql语句之间的映射关系,以便在进行相似度检测时能迅速的找出原始的历史sql语句。另外还可以将此字典数据存储于redis数据库,便于迅速访问和更新。142.在另一优选的实施例中,在使用一些关键字时,由于编写习惯等原因会造成字符串的顺序出现差异,比如:selecth,j,c、selectj,c,h等。这些语句从字符串角度上并不相同,但是执行效果一致。为了降低后续对相似度检测的影响,对于该情况,需要统一字符串的顺序。143.具体地,计算位于设定的第一关键字和第二关键字之间的多个字符串的大小;之后根据多个字符串的大小,调换多个字符串的顺序。实施例中,计算select关键字和from关键字之间的各个字符串的大小(比如unicode编码值),之后按照字符串大小由小到达或者由大到小的顺序排序。144.对历史sql语句中的原始表达式进行上述格式转换以及字符串顺序调换后,即可得到相应的第二目标sql语句。另外,本实施例中并不限定格式转换以及字符串顺序转换的执行先后顺序。145.步骤s304:使用局部敏感哈希算法,对各第二目标sql语句进行特征提取,得到相应的参照特征向量并保存到数据库中。去除各第二目标sql语句的空格,之后对所得字符串进行固定长度的切割(比如每15个字符进行一次截取),之后使用哈希算法计算每个字符的哈希值,对哈希值进行加权和降维,得到最终的参照特征向量。该处理能够把文本语句降维到哈希数字,便于后续进行快速检测。146.随着业务数据的积累,历史sql语句集越来越大,如果每次都将历史的全量数据进行上述清洗、分类、哈希运算等处理,会影响相似度检测的效率,不满足实时计算和返回要求。因此可以将参照特征向量生成持久化文件并保存到数据库中,以便由检测任务时能够迅速加载,且方便数据更新。另外,由于实施例中将历史sql语句集划分为四类,因此可以将持久化文件也分为四个部分。147.步骤s305:当接收到待测sql语句时,获取待测sql语句的目标字符和关键字信息。以待测sql语句为查询语句为例,遍历待测sql语句的字符和关键字,判断其select关键字和from关键字之间是否为*,以及是否包含where关键字。148.步骤s306:根据目标字符和关键字信息的获取结果,确定待测sql语句的语句类型,以及具有相同语句类型的历史sql语句子集。如果待测sql语句中select关键字和from关键字之间为*,且包含where关键字,则确定待测sql语句的语句类型为第一类型,具有相同语句类型的历史sql语句子集为label_1。149.如果待测sql语句中select关键字和from关键字之间为*,但不存在where关键字,则确定待测sql语句的语句类型为第二类型,具有相同语句类型的历史sql语句子集为label_2。150.如果待测sql语句中select关键字和from关键字之间不存在*,但存在where关键字,则确定待测sql语句的语句类型为第三类型,具有相同语句类型的历史sql语句子集为label_3。151.如果待测sql语句中select关键字和from关键字之间不存在*,且不存在where关键字,则确定待测sql语句的语句类型为第四类型,具有相同语句类型的历史sql语句子集为label_4。152.步骤s307:根据设定的表达式格式,将待测sql语句中包含比较运算符的原始表达式转换为新表达式,得到相应的第一目标sql语句。该步骤的具体实现参见步骤s206,此处不做赘述。153.步骤s308:使用局部敏感哈希算法,对第一目标sql语句进行特征提取,得的相应的待测特征向量。具体地,去除第一目标sql语句的空格,之后对所得字符串进行固定长度的切割(比如每15个字符进行一次截取),之后使用哈希算法计算每个字符的哈希值,对哈希值进行加权和降维,得到最终的待测特征向量。154.步骤s309:计算待测特征向量与确定的历史sql语句子集中各历史sql语句对应的参照特征向量的距离,将该距离作为待测sql语句与相应历史sql语句的相似度。此处的历史sql语句子集为步骤s306确定出的与待测sql语句的语句类型相同的历史sql语句子集。待测特征向量和参照特征向量的距离计算参见步骤s207,此处不做赘述。155.步骤s310:根据相似度大小,从历史sql语句子集中筛选出与待测sql语句相似的历史sql语句并返回。该步骤的具体实现参见步骤s208,此处不做赘述。156.实施例三中通过将历史sql语句对应的参照特征向量保存到数据库中,能够在收到检测任务时,实时从数据库中获取参照特征向量,提升了访问速度,实现了实时相似度计算。157.图4是本发明实施例的sql语句的相似度检测装置的主要模块的示意图。如图4所示,本发明实施例的sql语句的相似度检测装置400,主要包括:158.分类模块401,用于获取待测sql语句的目标字符和关键字信息,根据所述目标字符和所述关键字信息的获取结果,确定所述待测sql语句的语句类型。遍历待测sql语句的字符和关键字,判断其是否包含设定的目标字符和目标关键字,根据判断结果确定待测sql语句的语句类型。159.在确定待测sql语句的语句类型时,可以通过以下方式:如果待测sql语句中同时存在目标字符和目标关键字,则确定待测sql语句的语句类型为第一类型;如果待测sql语句中存在目标字符,但不存在目标关键字,则确定待测sql语句的语句类型为第二类型;如果待测sql语句中不存在目标字符,但存在目标关键字,则确定待测sql语句的语句类型为第三类型;如果待测sql语句中不存在目标字符和目标关键字,则确定待测sql语句的语句类型为第四类型。160.转换模块402,用于根据设定的表达式格式,将所述待测sql语句中包含比较运算符的原始表达式转换为新表达式,得到相应的第一目标sql语句。原始表达式包括比较运算符、位于比较运算符前面的第一字符串和位于比较运算符后面的第二字符串。表达式格式用于根据第一字符串和第二字符串的大小,将原始表达式转换为前小后大或者前大后小的形式。161.其中,前小后大是指转换后位于比较运算符前面的字符串的大小大于位于比较运算符后面的字符串的大小。前大后小是指转换后位于比较运算符前面的字符串的大小小于位于比较运算符后面的字符串的大小。162.获取模块403,用于获取与所述待测sql语句具有相同语句类型的历史sql语句的第二目标sql语句;其中,所述第二目标sql语句是按照所述表达式格式,对所述历史sql语句进行转换得到。预先存储不同语句类型的历史sql语句对应的第二目标sql语句。其中,第二目标sql语句是按照上述表达式格式,对历史sql语句进行转换得到的。本步骤中需根据待测sql语句的语句类型,查找具有相同语句类型的历史sql语句的第二目标sql语句。163.计算模块404,用于计算所述第一目标sql语句和所述第二目标sql语句的相似度,以确定所述待测sql语句和所述历史sql语句的相似度。计算两个目标sql语句之间的相似度,将该相似度作为待测sql语句和历史sql语句的相似度,至此相似度检测完成。164.另外,本发明实施例的sql语句的相似度检测装置400还可以包括:优化模块、保存模块和预处理模块(图4中未示出)。其中,优化模块,用于计算位于设定的第一关键字和第二关键字之间的多个字符串的大小;以及根据所述多个字符串的大小,调换所述多个字符串的顺序。165.保存模块,用于将所述第二目标sql语句的参照特征向量保存到数据库;其中,所述参照特征向量是使用局部敏感哈希算法,对所述第二目标sql语句进行特征提取得到的。166.预处理模块,用于获取历史sql语句集中历史sql语句的所述目标字符和所述关键字信息,根据所述目标字符和所述关键字信息的获取结果,确定所述历史sql语句的语句类型;以及根据所述表达式格式,将所述历史sql语句中包含比较运算符的原始表达式转换为新表达式,得到相应的第二目标sql语句。167.从以上描述可以看出,先确定待测sql语句的语句类型,并对待测sql语句中包含比较运算符的原始表达式进行格式转换,得到第一目标sql语句,进而计算第一目标sql语句与相同类型的历史sql语句的第二目标sql语句之间的相似度,能够兼顾比较运算符带来的语义差异,提高检测精度,且检测速度快。168.图5示出了可以应用本发明实施例的sql语句的相似度检测方法或sql语句的相似度检测装置的示例性系统架构500。169.如图5所示,系统架构500可以包括终端设备501、502、503,网络504和服务器505。网络504用以在终端设备501、502、503和服务器505之间提供通信链路的介质。网络504可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。170.用户可以使用终端设备501、502、503通过网络504与服务器505交互,以接收或发送消息等。服务器505可以是提供各种服务的服务器,例如对用户利用终端设备501、502、503所浏览的购物类网站提供支持的后台管理服务器。后台管理服务器可以对接收到的产品信息查询请求等数据进行分析等处理,并将处理结果(例如目标推送信息、产品信息)反馈给终端设备。171.需要说明的是,本发明实施例所提供的sql语句的相似度检测方法一般由服务器505执行,相应地,sql语句的相似度检测装置一般设置于服务器505中。172.应该理解,图5中的终端设备、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、网络和服务器。173.根据本发明的实施例,本发明还提供了一种电子设备、一种计算机可读介质和一种计算机程序产品。174.本发明的电子设备包括:一个或多个处理器;存储装置,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现本发明实施例的一种sql语句的相似度检测方法。175.本发明的计算机可读介质,其上存储有计算机程序,所述程序被处理器执行时实现本发明实施例的一种sql语句的相似度检测方法。176.本发明的计算机程序产品,包括计算机程序,所述程序被处理器执行时实现本发明实施例的一种sql语句的相似度检测方法。177.下面参考图6,其示出了适于用来实现本发明实施例的电子设备的计算机系统600的结构示意图。图6示出的终端设备仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。178.如图6所示,计算机系统600包括中央处理单元(cpu)601,其可以根据存储在只读存储器(rom)602中的程序或者从存储部分608加载到随机访问存储器(ram)603中的程序而执行各种适当的动作和处理。在ram603中,还存储有系统600操作所需的各种程序和数据。cpu601、rom602以及ram603通过总线604彼此相连。输入/输出(i/o)接口605也连接至总线604。179.以下部件连接至i/o接口605:包括键盘、鼠标等的输入部分606;包括诸如阴极射线管(crt)、液晶显示器(lcd)等以及扬声器等的输出部分607;包括硬盘等的存储部分608;以及包括诸如lan卡、调制解调器等的网络接口卡的通信部分609。通信部分609经由诸如因特网的网络执行通信处理。驱动器610也根据需要连接至i/o接口605。可拆卸介质611,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器610上,以便于从其上读出的计算机程序根据需要被安装入存储部分608。180.特别地,根据本发明公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本发明公开的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分609从网络上被下载和安装,和/或从可拆卸介质611被安装。在该计算机程序被中央处理单元(cpu)601执行时,执行本发明的系统中限定的上述功能。181.附图中的流程图和框图,图示了按照本发明各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。182.描述于本发明实施例中所涉及到的模块可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的模块也可以设置在处理器中,例如,可以描述为:一种处理器包括分类模块、转换模块、获取模块和计算模块。其中,这些模块的名称在某种情况下并不构成对该模块本身的限定,例如,分类模块还可以被描述为“获取待测sql语句的目标字符和关键字信息,根据所述目标字符和所述关键字信息的获取结果,确定所述待测sql语句的语句类型的模块”。183.作为另一方面,本发明还提供了一种计算机可读介质,该计算机可读介质可以是上述实施例中描述的设备中所包含的;也可以是单独存在,而未装配入该设备中。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被一个该设备执行时,使得该设备包括:获取待测sql语句的目标字符和关键字信息,根据所述目标字符和所述关键字信息的获取结果,确定所述待测sql语句的语句类型;根据设定的表达式格式,将所述待测sql语句中包含比较运算符的原始表达式转换为新表达式,得到相应的第一目标sql语句;获取与所述待测sql语句具有相同语句类型的历史sql语句的第二目标sql语句;其中,所述第二目标sql语句是按照所述表达式格式,对所述历史sql语句进行转换得到;计算所述第一目标sql语句和所述第二目标sql语句的相似度,以确定所述待测sql语句和所述历史sql语句的相似度。184.根据本发明实施例的技术方案,先确定待测sql语句的语句类型,并对待测sql语句中包含比较运算符的原始表达式进行格式转换,得到第一目标sql语句,进而计算第一目标sql语句与相同类型的历史sql语句的第二目标sql语句之间的相似度,能够兼顾比较运算符带来的语义差异,提高检测精度,且检测速度快。185.上述具体实施方式,并不构成对本发明保护范围的限制。本领域技术人员应该明白的是,取决于设计要求和其他因素,可以发生各种各样的修改、组合、子组合和替代。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应包含在本发明保护范围之内。当前第1页12当前第1页12
转载请注明原文地址:https://tc.8miu.com/read-316.html