著录项信息
专利名称 | 一种多级分类检索方法及系统 |
申请号 | CN200910080362.5 | 申请日期 | 2009-03-19 |
法律状态 | 权利终止 | 申报国家 | 中国 |
公开/公告日 | 2010-09-22 | 公开/公告号 | CN101840400A |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | G06F17/30 | IPC分类号 | G;0;6;F;1;7;/;3;0查看分类表>
|
申请人 | 北大方正集团有限公司;北京大学;北京北大方正电子有限公司 | 申请人地址 | 北京市海淀区成府路298号方正大厦
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 北大方正集团有限公司,北京大学,北京北大方正电子有限公司 | 当前权利人 | 北大方正集团有限公司,北京大学,北京北大方正电子有限公司 |
发明人 | 王洪昌;卢作伟;宫丽杰 |
代理机构 | 北京天悦专利代理事务所(普通合伙) | 代理人 | 田明;任晓航 |
摘要
本发明公开了一种多级分类检索方法及系统,属于数据库检索技术领域。现有技术中,对分类数据的检索效率低或者扩展性差。本发明所述方法及系统根据数据分类信息在数据表中设置分类字段,存储分类节点之间的层次关系;根据分类节点之间的层次关系将每个节点拆分成独立的字段,与数据表中其他字段组合,生成分类关联表;检索时利用数据库索引在分类关联表中检索数据。本发明所述方法及系统提高了分类数据的检索效率,扩展性强,特别适用于大数据量的数据库检索中。
1.一种多级分类检索方法,包括以下步骤:
(1)将业务数据的分类信息存储在分类表中,所述分类表包括用于存储分类节点层次ID的字段、用于存储分类节点ID的字段、用于存储分类节点名称的字段以及用于存储分类节点父节点的字段;
(2)将业务数据存储在数据表中,所述数据表包括分类字段,所述分类字段用于存储分类路径,所述分类路径根据分类表中用于存储分类节点父节点的字段内容获得,分类路径上的分类节点用从分类表中获得的分类节点ID表示;
(3)根据数据表生成与该数据表相对应的分类关联表,所述分类关联表存储数据表中除分类字段外的全部或部分字段内容,以及根据数据表中分类字段存储的分类路径拆分成的多个分类层次字段,按照层次关系存储拆分后的分类节点;
(4)在分类表中获得分类节点层次ID和分类节点ID,设置检索条件,利用数据库索引在分类关联表中检索数据。
2.如权利要求1所述的一种多级分类检索方法,其特征在于:步骤(2)中所述数据表的分类字段中存储一种或多种分类路径。
3.如权利要求1所述的一种多级分类检索方法,其特征在于:步骤(3)中所述数据表与分类关联表之间的对应关系为一对一、一对多、多对一或多对多。
4.如权利要求1至3之一所述的一种多级分类检索方法,其特征在于,步骤(3)中所述根据数据表生成与该数据表相对应的分类关联表的过程包括以下步骤:
①选择数据表中除分类字段外的全部或部分字段作为分类关联表中的字段,并确定分类关联表中的分类层次字段的个数;所述分类层次字段的个数不小于数据表中分类字段存储的最深分类路径的层次深度,分类层次字段的名称中包含分类节点的层次ID;
②建立数据表中字段与分类关联表中字段的对应关系,将被步骤①选中的字段内容写入到分类关联表记录中相应的字段内,将数据表分类字段存储 的分类路径按照层次关系进行拆分,将拆分后的分类节点按照该分类节点所处的层次分别写入到分类关联表记录中相应的分类层次字段内。
5.如权利要求4所述的一种多级分类检索方法,其特征在于:步骤②中,当数据表的分类字段中存储多种分类路径时,一种分类路径形成分类关联表中的一条记录,除分类层次字段外,所有分类路径形成的分类关联表中记录的其他字段内容相同。
6.如权利要求4所述的一种多级分类检索方法,其特征在于:所述方法在建立分类关联表后,还包括在与分类关联表相对应的数据表上创建触发器的步骤,更新数据表中的数据时,利用所述触发器对分类关联表中的数据进行同步更新。
7.如权利要求6所述的一种多级分类检索方法,其特征在于:所述更新数据表中的数据包括增加记录、更新记录和删除记录,所述更新记录包括在原记录的分类字段中增加分类路径。
8.如权利要求7所述的一种多级分类检索方法,其特征在于:在数据表中增加记录时,所述利用触发器对分类关联表中的数据进行同步更新的过程包括以下步骤:
①更新数据表时触发该表上的触发器;
②触发器根据数据表中更新的记录,获取新增加的记录内容;
③根据新增加的记录内容,更新与该数据表对应的分类关联表中的记录。
9.如权利要求7所述的一种多级分类检索方法,其特征在于:在原记录的分类字段中增加分类路径时,所述利用触发器对分类关联表中的数据进行同步更新的过程包括以下步骤:
①更新数据表时触发该表上的触发器;
②触发器根据数据表记录中更新的分类字段,获取该分类字段更新后的分类路径;
③根据更新后的分类路径,更新与该数据表对应的分类关联表中的记录。
10.一种多级分类检索系统,包括用于将业务数据的分类信息存储在分类表中的分类信息存储模块(11),所述分类表包括用于存储分类节点层次ID的字段、用于存储分类节点ID的字段、用于存储分类节点名称的字段以 及用于存储分类节点父节点的字段;
用于将业务数据存储在数据表中的业务数据存储模块(12),所述数据表包括分类字段,所述分类字段用于存储分类路径,所述分类路径根据分类表中用于存储分类节点父节点的字段内容获得,分类路径上的分类节点用从分类表中获得的分类节点ID表示;
用于根据数据表生成与该数据表相对应的分类关联表的分类关联表生成模块(13),所述分类关联表存储数据表中除分类字段外的全部或部分字段内容,和根据数据表中分类字段存储的分类路径拆分成的多个分类层次字段,按照层次关系存储拆分后的分类节点;
以及用于呈现分类表、在分类表中获得分类节点层次ID和分类节点ID、设置检索条件、利用数据库索引在分类关联表中检索数据并呈现检索结果的检索模块。
11.如权利要求10所述的一种多级分类检索系统,其特征在于:所述系统还包括用于在数据表中创建触发器的触发器生成模块(15),所述触发器用于将数据表中的数据和与其相对应的分类关联表中的数据进行同步更新。
一种多级分类检索方法及系统 \n技术领域\n[0001] 本发明属于数据库检索技术领域,具体涉及一种多级分类检索方法及系统。本发明尤其适用于海量数据的数据库检索中。 \n背景技术\n[0002] 在信息系统中,往往对数据进行分类存储,便于用户对数据进行分类检索和查看分类数据,尤其在海量数据的情况下,这样可以提高检索的效率。例如,假设一篇文章含有地区分类属性:亚洲→中国→北京。这是一种典型多级分类结构,如果将该地区的分类属性设置为“中国”,则系统在存储时通常只存储一个节点即“中国”或者将分类路径写死到一个或多个字段上。检索时,通过SQL中的like语句进行模糊查询。一方面,这种检索方式在数据量较大的情况下效率较低,即使建立数据库索引也无法达到很好的检索效率。另一方面,这种检索方式检索出的结果只包含“中国”的数据,而通常的需求是能够按照分类路径进行检索,即按照“中国”检索时能够检索出所有“中国”和“北京”的数据,也就是说,能够检索出该节点以及该节点后所有节点的数据。 \n[0003] 现有的检索方式中,针对检索效率低的问题,还存在一种将多个分类属性存储到数据表的多个字段上,然后利用数据库索引进行检索的方式。例如,上例中,可以将“亚洲”、“中国”、“北京”存储在三个字段上,这种方式虽然能够在一定程度上提高检索的效率,但其扩展性极差,当增加多个分类时(如上例中还需要存储栏目分类、体裁分类等等)会增加很多字段,从而使表的结构变得越来越臃肿。 \n发明内容\n[0004] 针对现有技术中存在的缺陷,本发明的目的是提供一种速度快、扩展性好的多级分类检索方法及系统。 \n[0005] 为了实现上述目的,本发明采用的技术方案如下: \n[0006] 一种多级分类检索方法,包括以下步骤: \n[0007] (1)将业务数据的分类信息存储在分类表中,所述分类表包括用于存储分类节点层次ID的字段、用于存储分类节点ID的字段、用于存储分类节点名称的字段以及用于存储分类节点父节点的字段; \n[0008] (2)将业务数据存储在数据表中,所述数据表包括分类字段,所述分类字段用于存储分类路径,所述分类路径根据分类表中用于存储分类节点父节点的字段内容获得,分类路径上的分类节点用从分类表中获得的分类节点ID表示; \n[0009] (3)根据数据表生成与该数据表相对应的分类关联表,所述分类关联表存储数据表中除分类字段外的全部或部分字段内容,以及根据数据表中分类字段存储的分类路径拆分成的多个分类层次字段,按照层次关系存储拆分后的分类节点; \n[0010] (4)在分类表中获得分类节点层次ID和分类节点ID,设置检索条件,利用数据库索引在分类关联表中检索数据。 \n[0011] 一种多级分类检索系统,包括用于将业务数据的分类信息存储在分类表中的分类信息存储模块(11),所述分类表包括用于存储分类节点层次ID的字段、用于存储分类节点ID的字段、用于存储分类节点名称的字段以及用于存储分类节点父节点的字段; [0012] 用于将业务数据存储在数据表中的业务数据存储模块(12),所述数据表包括分类字段,所述分类字段用于存储分类路径,所述分类路径根据分类表中用于存储分类节点父节点的字段内容获得,分类路径上的分类节点用从分类表中获得的分类节点ID表示; [0013] 用于根据数据表生成与该数据表相对应的分类关联表的分类关联表生成模块(13),所述分类关联表存储数据表中除分类字段外的全部或部分字段内容,和根据数据表中分类字段存储的分类路径拆分成的多个分类层次字段,按照层次关系存储拆分后的分类节点; \n[0014] 以及用于呈现分类表、在分类表中获得分类节点层次ID和分类节点ID、 设置检索条件、利用数据库索引在分类关联表中检索数据并呈现检索结果的检索模块(14)。 [0015] 本发明所述方法及系统,通过先生成将数据表中分类字段存储的分类路径自动拆分后按照层次关系存储成多个字段的分类关联表,再利用数据库索引在分类关联表中进行精确检索的方式,克服了现有技术直接在数据表中进行模糊检索带来的效率低的缺陷,提高了分类数据检索的效率,而且不但能够检索出符合条件的分类节点信息,同时又能够检索出该节点后的所有节点信息。此外,通过将数据表中分类字段存储的多种分类路径拆分后存储在分类关联表中的多条记录的方式,支持多种分类分别检索,并具有很好的扩展性。 [0016] 附图说明\n[0017] 图1是具体实施方式中所述系统结构图; \n[0018] 图2是具体实施方式中所述方法流程图; \n[0019] 图3是数据表、触发器、分类表和分类关联表之间的关系示意图。 \n[0020] 具体实施方式\n[0021] 下面结合具体实施方式和附图对本发明进行详细描述。 \n[0022] 本发明的核心思想是:在数据表中设置分类字段,存储分类节点之间的层次关系(即分类路径);根据分类节点之间的层次关系将每个节点拆分成独立的字段,生成分类关联表,在分类关联表中检索数据。 \n[0023] 图1出示了一种多级分类检索系统的结构,包括用于将业务数据的分类信息存储在分类表中的分类信息存储模块11,所述分类表包括用于存储分类节点层次ID的字段、用于存储分类节点ID的字段、用于存储分类节点名称的字段以及用于存储分类节点父节点的字段; \n[0024] 用于将业务数据存储在数据表中的业务数据存储模块12,所述数据表包括分类字段,所述分类字段用于存储分类路径,所述分类路径根据分类表中用于存储分类节点父节点的字段内容获得,其上的节点用从分类表中获得的分类节点ID表示; \n[0025] 用于根据数据表生成与该数据表相对应的分类关联表的分类关联表生成 模块\n13,所述分类关联表存储数据表中除分类字段外的全部或部分字段内容,和根据数据表中分类字段存储的分类路径拆分成的多个分类层次字段,按照层次关系存储拆分后的分类节点; \n[0026] 以及用于呈现分类表、设置检索条件、利用数据库索引在分类关联表中检索数据并呈现检索结果的检索模块14。 \n[0027] 该系统还包括用于在数据表中创建触发器的触发器生成模块15,当更新数据表中的数据时,触发器可以将数据表中的数据和与其相对应的分类关联表中的数据进行同步更新。 \n[0028] 图2出示了采用图1所示系统实现多级分类检索的方法流程,主要包括以下步骤: \n[0029] (1)分类信息存储模块11将业务数据的分类信息存储在分类表中。 \n[0030] 分类表可以是一种树形结构表,包括存储分类节点层次ID的字段、存储分类节点ID的字段、存储分类节点名称的字段以及存储分类节点父节点的字段等。分类表的主要结构如下表所示: \n[0031] \n分类层次ID 分类节点ID 分类名称 父节点\n[0032] 分类表的创建数量根据信息系统中对数据的分类方式来确定,一个分类表对应一种分类。 \n[0033] (2)业务数据存储模块12将业务数据存储在数据表中。 \n[0034] 数据表包括分类字段,该字段用于存储分类路径。如果数据表中一条记录可以按照不同的角度进行多种分类,则该字段中可以存储多种分类路径,分类的层次关系以及多种分类路径之间可以采用事先约定的符号表示。 \n[0035] (3)分类关联表生成模块13生成分类关联表。 \n[0036] 分类关联表生成模块13根据数据表建立与该数据表相对应的分类关联表。该表存储数据表中除分类字段外的全部或部分字段内容,以及根据数据表中分类字段存储的分类路径拆分成的多个分类层次字段,按照层次关系存储拆分后的分类节点,结构和与其对应的数据表的结构相似,优选的创建方 法可以概括为如下两个步骤: \n[0037] ①选择数据表中除分类字段外的全部或部分字段作为分类关联表中的字段,并确定分类关联表中的分类层次字段的个数;所述分类层次字段的个数不小于数据表中分类字段存储的最深分类路径的层次深度,分类层次字段的名称中包含分类节点的层次ID。 [0038] 例如,假设分类关联表中分类层次字段的个数为10个,字段名称为“分类_1”、“分类_2”……“分类_9”、“分类_10”,其中的数字1、2……9、10表示分类节点的层次ID,如下表所示: \n[0039] \n...... 分类_1 分类_2 ...... 分类_9 分类_10\n[0040] ②建立数据表中字段与分类关联表中字段的对应关系,将被步骤①选中的字段内容写入到分类关联表记录中相应的字段内,将数据表分类字段存储的分类路径按照层次关系进行拆分,将拆分后的分类节点按照该分类节点所处的层次分别写入到分类关联表记录中相应的分类层次字段内。 \n[0041] 假设读取的数据表中分类字段存储的分类路径为“10_11_12_13”(其中“_”为层次间隔符,10、11、12、13表示分类节点ID),根据其结构可知:10为第1层、11为第2层、13为第3层、14为第4层,将其写入分类关联表中相应的层次字段中,如果分类路径没有预先设定的分类层次字段深,则在不存在分类节点的层次字段中写入0,如下表所示: [0042] \n...... 分类_1 分类_2 分类_3 分类_4 ...... 分类_10\n 10 11 12 13 0 0\n[0043] 当数据表的分类字段中存储多种分类路径时,一种分类路径形成分类关联表中的一条记录,除分类层次字段外,所有分类路径形成的分类关联表中记录的其他字段内容相同。 \n[0044] 在上述方法中,分类关联表中冗余的字段内容可以根据具体的需要进行选择,对于一些大文本字段或二进制字段则不必进行冗余。这种方式当检索后需要展示的结果仅涉及到冗余的字段内容时,则无需与数据表进行关联查询,从而可以进一步提高检索的效率;\n当检索后需要展示分类关联表中没有的字段内容时,可以从与该分类关联表对应的数据表中获取。 \n[0045] 此外,该方法中还预先设定了分类关联表中的分类层次字段的个数。这种方式虽然易于实现,但会造成一定的空间浪费。当然也可以根据读取的分类路径的深度进行动态拆分,使分类路径的深度与分类关联表中的分类层次字段的个数相同。但是,当一个数据表中分类字段存储多种分类路径且深度不同;或者数据表中不同记录中分类字段存储的分类路径深度不同时,分类关联表中分类层次字段的深度仍然需要与数据表分类字段存储的分类路径的最深层次相同,没有达到这种深度的分类路径中不存在分类节点的层次字段仍然需要用0占位。这种方式虽然可以节省空间,但稍显复杂。 \n[0046] 数据表与分类关联表的对应关系可以为一对一,即一个数据表对应一个分类关联表,当然也可以是一对多(一个数据表对应多个分类关联表)、多对一或多对多,本发明不对两者之间的对应关系进行限制,任何一种方式均可。 \n[0047] (4)触发器生成模块14创建触发器。 \n[0048] 当分类关联表建立后,如果需要更新分类关联表,则还应该在与分类关联表相对应的数据表上根据数据库类型自动生成符合数据库语法的触发器,用于将数据表中的数据与分类关联表中的数据进行同步,即当更新数据表中的数据时,与该数据表对应的分类关联表也进行同步更新,以保证分类关联表与对应的数据表之间的一致性。数据表中数据更新主要包括增加记录、更新记录和删除记录,其中更新记录包括更新非分类字段内容和更新分类字段内容,更新分类字段内容包括在原记录的分类字段中增加分类路径等,在原记录中增加分类路径的更新过程可以概括为如下步骤: \n[0049] ①更新数据表时触发该表上的触发器; \n[0050] ②触发器根据数据表记录中更新的分类字段,获取该分类字段更新后的分类路径; \n[0051] ③根据更新后的分类路径,更新与该数据表对应的分类关联表中的记录。更新分类关联表中记录的方法与建立分类关联表的方法相似。 \n[0052] 例如,假设原数据表的结构如下: \n[0053] \n 字段1 字段2 字段3 字段n 分类字段\n A_B_C\n[0054] 原分类关联表的结构如下: \n[0055] \n 字段1 字段2 字段3 分类_1 分类_2 分类_3\n A B C\n[0056] 现在原数据表的分类字段中增加一种分类路径,修改的数据表结构如下: [0057] \n 字段1 字段2 字段3 字段n 分类字段\n A_B_C;X_Y_X\n[0058] 则利用触发器更新分类关联表的表结构如下: \n[0059] \n 字段1 字段2 字段3 分类_1 分类_2 分类_3\n A B C\n X Y Z\n[0060] 其中,第1条记录与第2条记录除分类字段外,其他字段的内容相同。 [0061] 如果数据表中增加一条新的记录,则更新分类关联表的方法可以概括如下步骤: [0062] ①更新数据表时触发该表上的触发器; \n[0063] ②触发器根据数据表中更新的记录,获取数据表中新增加的记录内容; [0064] ③根据数据表中字段与分类关联表中字段的对应关系,将数据表中的字段内容写入到分类关联表记录中相应的字段内,将数据表分类字段存储的分类路径按照层次关系进行拆分,将拆分后的分类节点按照该分类节点所处的层次分别写入到分类关联表记录中相应的分类层次字段内。 \n[0065] 如果数据表中删除一条记录,则利用触发器直接根据主键删除分类关联表中相应的记录即可。 \n[0066] 创建触发器的方法为现有技术,可参阅相关文献,此处不再展开说明。 [0067] 图3出示了数据表31、触发器34、分类表32和分类关联表33之间的关系。建立数据表时需要从分类表中获得分类信息,以及分类路径上分类节点的ID;分类关联表的建立需要依据数据表,触发器建立在数据表上,更新数据表时利用触发器保持数据表与分类关联表的同步更新。 \n[0068] (5)检索模块15在分类关联表中检索数据。 \n[0069] 检索模块15展示分类表的结构,可以从中获得分类节点层次ID和分类节点ID,根据分类节点层次ID和分类节点ID在检索模块15中设置检索条件,检索模块15利用数据库索引在分类关联表中进行检索,并显示检索结果。 \n[0070] 实施例1 \n[0071] 本实施例中,假设数据存在如下一种分类方式:A、B、C、D。其中,A为根节点,层次ID为1,分类节点ID为100;B为A节点的子节点,层次ID为2,分类节点ID为101;C为B节点的子节点,层次ID为3,分类节点ID为102;D为节点C的子节点,层次ID为4,分类节点ID为103。 \n[0072] 假设建立如下结构的分类表: \n[0073] \n分类层次ID 分类节点ID 分类名称 父节点\n 1 100 A 0\n 2 101 B 1\n 3 102 C 2\n 4 103 D 3\n[0074] 根据分类表获得分类节点ID后,假设建立如下结构的数据表: \n[0075] \n 字段1 字段2 字段3 字段n 分类字段\n 100_101_102_103\n[0076] 上表中分类字段中的“_”表示节点之间的层次关系。当然,也可以采用其他符号表示,本发明不对分类字段的具体存储格式进行限定,只要能够识别出分类节点之间的层次关系即可。 \n[0077] 本实施例中,数据表建立后,选择该表中的字段1、字段2和字段3作为分类关联表中的字段,分类层次字段的个数为4。然后建立数据表中字段与分类关联表中字段的对应关系,将数据表中字段存储的内容写入分类关联表中的相应字段;拆分数据表分类字段存储的分类路径,将分类节点分别写入分类关联表中相应的分类层次字段内,生成如下结构的分类关联表: \n[0078] \n字段1字段2字段3 分类_1 分类_2 分类_3 分类_4\n 100 101 102 103\n[0079] 其中,“分类_1、分类_2、分类_3、分类_4”中的数字“1、2、3、4”表示分类层次ID,“100、101、102、103”表示分类节点ID。 \n[0080] 分类关联表建立后,在与其相对的数据表上创建触发器,当数据表更新数据时使用该触发器保持数据表和与其对应的分类关联表中的数据同步。 \n[0081] 检索时,首先从分类表中获得分类层次ID和分类节点ID;然后设置检索条件,假设本实施例中设置的检索条件为“分类_2=101”;最后利用数据库索引根据检索条件在分类关联表中进行检索。不仅可以检索出“分类_2=101”的信息,还可以检索出其后所有节点102和103的信息。 \n[0082] 实施例2 \n[0083] 与实施例1不同的是,数据表中的分类字段存储多个分类路径,假设其结构如下表所示: \n[0084] \n字段1字段2字段3字段n 分类\n 100_101;100_101_102;101_102_103\n[0085] 上表中,分类字段中不同的分类层次之间的层次关系用“;”间隔,当然也可以采用其他符号,只要能够将不同的分类区别开来即可。生成的分类关联表结构如下表所示: [0086] \n字段1字段2字段3 分类_1 分类_2 分类_3 分类_4\n 100 101 0 0\n 100 101 102 0\n 101 102 103 0\n[0087] 其中,3条记录的“字段1”、“字段2”、“字段3”的内容相同。 [0088] 显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其同等技术的范围之内,则本发明也意图包含这些改动和变型在内。
法律信息
- 2020-03-10
未缴年费专利权终止
IPC(主分类): G06F 17/30
专利号: ZL 200910080362.5
申请日: 2009.03.19
授权公告日: 2012.02.01
- 2012-02-01
- 2010-11-24
实质审查的生效
IPC(主分类): G06F 17/30
专利申请号: 200910080362.5
申请日: 2009.03.19
- 2010-09-22
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 |
1
| |
2002-07-24
|
2002-01-30
| | |
2
| |
2009-03-18
|
2008-11-05
| | |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有被任何外部专利所引用! |