一种利用索引数据文件查询方法\n技术领域\n[0001] 本发明涉及信息查询领域,尤其涉及一种根据查询条件,并利用索引数据文件对产品进行分类检索统计的查询方法。\n背景技术\n[0002] 产品库类的应用,一个重要功能就是对指定的产品分类,按照不同的产品属性,进行分类查找。方便查看相同属性的不同产品之间的差异。以手机产品为例,我们通常看到的手机产品共有的属性有品牌、手机制式、智能操作系统、主屏尺寸、主屏参数、CPU频率等。\n当网友进行的一个查询是:品牌为三星,操作系统为Android4.1,屏幕尺寸大于4.3英寸。\n这个查找网友通常希望得到2个结果:符合条件的产品列表和产品数量。\n[0003] 对这个查询的实现,通常的信息查询系统是通过数据库的查询来进行,将网友给出的查询请求,转换成SQL语句来进行查找。这种解决方案,在查询条件增多时,会导致数据库查询复杂成度增高,从而使查询时间变长。对于产品库类的查询而言,产品的属性不是单一的,并且每个属性的取值也不是单一的,因此查询条件的排列组合是非常复杂和多变的。数据库在处理这类的查询请求时,随着条件数量的增多,花费在查询上的处理时间就会增加。由于查询条件的排列情况不是单一固定的,每次查询的结果很难缓存下来,给后面的查询者使用。\n[0004] 因此用数据库来解决此类查询问题,为了能够获得很好的页面响应,通常会单独提供若干的查询服务器来处理查询请求。基本上是属于用资源来换时间的思路,当访问量达到一定的规模后,查询服务器的部署和维护将是一件相当复杂的工作。\n[0005] 如果查询的条件再复杂一些,针对查询:品牌为三星、操作系统为Android4.1,在查询出符合这个条件的产品时,还能够同时计算符合这个条件的产品的手机制式、主屏尺寸、主屏参数和CPU频率的统计结果,此时用数据库进行查询时,计算过程就会有些复杂了,首先要筛选出符合条件的数据,然后还要针对其它的属性进行分别的统计才能完成。这个过程不但复杂,而且还存在较大的运算量。\n发明内容\n[0006] 本发明的目的在于提供一种利用索引数据文件查询方法,该利用该查询方法可以得到符合查询条件的产品及数量。\n[0007] 本发明利用索引数据文件查询方法包括以下步骤:\n[0008] 1)将索引数据文件加载至内存;\n[0009] 2)将预查询结果文件加载至内存;\n[0010] 预查询结果文件中,包含了全部产品数据在各个产品属性的具体取值上的分配情况;通过预查询结果文件,能够直接获取每个产品属性具体取值上,产品数量信息,和产品名单列表信息;当产品数据发生变化时,例如有新增的产品,就需要重新生成预查询结果文件,并同时更新到内存中;\n[0011] 3)构造查询匹配器\n[0012] 查询匹配器的构造步骤包括:根据产品属性的数量,构造匹配器数组,数组中的每个元素都是一个匹配器,每个匹配器都对应一个产品属性,并且匹配器数组的元素按照索引数据文件中产品属性的顺序排列;根据查询条件来初始化匹配器数组;所述匹配器数组即为查询匹配器;\n[0013] 4)选择匹配数据\n[0014] 当查询条件为单一属性查询时,从预查询结果文件中直接获取产品名单列表和产品数量,不需要进行以下步骤;当查询条件为多属性查询时,选择在索引数据文件内包含查询条件的其中一个属性取值的数据作为匹配数据,进行查询匹配;\n[0015] 5)查询匹配、记录匹配结果\n[0016] 通过查询匹配器对匹配数据进行逐一匹配,并将匹配数据中符合全部匹配条件的数据记录到匹配结果集合中,在此匹配中,只需要对作为查询条件的产品属性进行匹配;匹配完成后,统计匹配结果集合中产品名单及数量;\n[0017] 所述索引数据文件的建立方法包括以下步骤:将每个产品的各属性的取值转换成数字识别码,将产品的数字识别码按产品的属性进行归类,形成集合,再按照索引数据文件格式的要求,将形成集合后的数字识别码转换成索引数据文件;\n[0018] 所述预查询结果文件的建立方法包括以下步骤:构造一个匹配器数组,将产品属性按照索引文件中属性的排列顺序全部放到这个匹配器数组中,根据产品所有属性的取值初始化该匹配器数组,然后把索引数据文件中的全部数据都与该匹配器数组进行匹配,在此匹配中,每次只匹配其中一个属性的一个具体取值,记录匹配结果,统计各属性具体取值的产品数量,将各属性具体取值的产品数量、产品名单列表信息转换成预查询结果文件。\n[0019] 所述步骤3)中,根据查询条件来初始化匹配器数组的步骤包括将没选择作为查询条件的产品属性的匹配器初始化为符合匹配条件;选择作为查询条件的产品属性的匹配器根据查询条件来初始化。\n[0020] 所述索引数据文件的建立方法的步骤中,将产品的各属性的取值转换成数字识别码时,如查询条件中存在部分属性的查询条件属于范围条件时,需将属于同一范围的属性的取值转换成同一数字识别码。\n[0021] 所述索引数据文件采用纯文本方式。\n[0022] 步骤4)中,当查询条件为多属性查询时,根据用户选择的查询产品属性,在预查询结果文件中分别获取每个属性具体取值对应的产品数量,选择在索引数据文件内包含产品数量最少的属性具体取值的数据作为匹配数据。\n[0023] 为了得到查询结果在其它产品属性上的分布,步骤5)中,将匹配数据中符合全部匹配条件的数据记录到匹配结果集合中后,还需要判断符合全部匹配条件的数据是否需要记录在其余属性上。\n[0024] 判断符合全部匹配条件的数据是否需要记录在其余属性上的步骤为:将匹配结果集合分配到查询匹配器中没有作为查询条件的属性上,依次屏蔽其余属性中的一个属性,将匹配结果集合中的数据分配到被屏蔽的属性上,判断各组数据是否包含被屏蔽属性的至少一个具体取值,并对包含被屏蔽属性的各具体取值的数据进行统计。\n[0025] 相对于现有技术,本发明的有益效果为:\n[0026] 1、利用索引数据文件查询,能迅速进行产品的分类检索和统计;\n[0027] 2、查询数据处理量大时,相对于利用数据库的查询方法,本发明对硬件的要求低。\n附图说明\n[0028] 图1为本发明实施例1的流程示意图。\n具体实施方式\n[0029] 实施例1\n[0030] 一种利用索引数据文件查询方法,其实现流程如图1所示,包括以下步骤:\n[0031] 1)将索引数据文件加载至内存;\n[0032] 2)将预查询结果文件加载至内存;\n[0033] 预查询结果文件中,包含了全部产品数据在各个产品属性的具体取值上的分配情况;通过预查询结果文件,能够直接获取每个产品属性具体取值上,产品数量信息,和产品名单列表信息;当产品数据发生变化时,例如有新增的产品,就需要重新生成预查询结果文件,并同时更新到内存中;\n[0034] 3)构造查询匹配器\n[0035] 查询匹配器的构造步骤包括:根据产品属性的数量,构造匹配器数组,数组中的每个元素都是一个匹配器,每个匹配器都对应一个产品属性,并且匹配器数组的元素按照索引数据文件中产品属性的顺序排列;根据查询条件来初始化匹配器数组,其中初始化匹配器数组的步骤包括:将没选择作为查询条件的产品属性的匹配器初始化为符合匹配条件,选择作为查询条件的产品属性的匹配器根据查询条件来初始化;所述匹配器数组即为查询匹配器;\n[0036] 4)选择匹配数据\n[0037] 当查询条件为单一属性查询时,从预查询结果文件中直接获取产品名单列表和产品数量,不需要进行以下步骤;当查询条件为多属性查询时,根据用户选择的查询产品属性,在预查询结果文件中分别获取每个属性具体取值对应的产品数量,选择在索引数据文件内包含产品数量最少的属性具体取值的数据作为匹配数据;\n[0038] 5)查询匹配、记录匹配结果\n[0039] 通过查询匹配器对匹配数据进行逐一匹配,并将匹配数据中符合全部匹配条件的数据记录到匹配结果集合中;判断符合全部匹配条件的数据是否需要记录在其它的属性上;匹配完成后,统计匹配结果集合中产品名单及数量;\n[0040] 判断符合全部匹配条件的数据是否需要记录在其余属性上的步骤为:将匹配结果集合分配到查询匹配器中没有作为查询条件的属性上,依次屏蔽其余属性中的一个属性,将匹配结果集合中的数据分配到被屏蔽的属性上,判断各组数据是否包含被屏蔽属性的至少一个具体取值,并对包含被屏蔽属性的各具体取值的数据进行统计。\n[0041] 所述索引数据文件的建立方法包括以下步骤:将每个产品的各属性的取值转换成数字识别码,将产品的数字识别码按产品的属性进行归类,形成集合,再按照索引数据文件格式的要求,将形成集合后的数字识别码转换成索引数据文件。所述索引数据文件的建立方法的步骤中,将产品的各属性的取值转换成数字识别码时,如查询条件中存在部分属性的查询条件属于范围条件时,需将属于同一范围的属性的取值转换成同一数字识别码。所述索引数据文件采用纯文本方式。\n[0042] 所述预查询结果文件的建立方法包括以下步骤:构造一个匹配器数组,将产品属性按照索引文件中属性的排列顺序全部放到这个匹配器数组中,根据产品所有属性的取值初始化该匹配器数组,然后把索引数据文件中的全部数据都与该匹配器数组进行匹配,在此匹配中,每次只匹配其中一个属性的一个具体取值,记录匹配结果,统计各属性具体取值的产品数量,将各属性具体取值的产品数量、产品名单列表信息转换成预查询结果文件。\n[0043] 实施例2\n[0044] 实施例2为本发明利用索引数据文件查询方法具体应用于手机分类查询的实施方法。其中,索引数据文件的建立包括以下步骤:\n[0045] 1)产品属性ID化\n[0046] 产品属性的类型比较多,有品牌、制式、系统、主屏尺寸、特色功能等多种类型。为了能够快速进行产品属性的比对,将产品属性的取值全部转换为数字识别码能够对快速检索起到明显的帮助,数字之间的比较是直接并且快速的。\n[0047] 产品属性转换为数字识别码的方式有:\n[0048] 将品牌的取值转换为数字ID,例如[三星,HTC,苹果,华为]→[9344,3443,5544,4342];\n[0049] 将制式的取值转换为枚举,例如[GSM,WCDMA,TD-CDMA,CDMA2000,LTE(4G)]→[1,2,3,4,5];\n[0050] 将系统的取值转换为枚举,例如[Android4.0,Android4.1,WP7.5,IOS]→[1,2,3,\n4];\n[0051] 将主屏尺寸的取值转为范围,例如2.0英寸以下→[0-20],2.1~3.0英寸→[21-30],3.1英寸~3.6英寸→[31-36]。\n[0052] 2)生成索引数据文件\n[0053] 将全部能够用来查询的产品属性数据,按照索引数据文件格式的要求,转换成为索引数据文件。具体的转换方法如下:\n[0054] 将产品属性按顺序排列,并且将每个产品属性的取值转换后的数字识别码,也根据此顺序进行排列,排列后的格式类似:\n[0055] 产品ID 品牌 制式 系统 主屏尺寸 特色功能\n[0056] 2343 9344 1:2:4 1 31-36 1:2:3\n[0057] 2456 3443 1:2 2 38-42 2:3\n[0058] 将产品属性取值的数字识别码,按照产品全部属性的分类,进行归类,归类后的数据类似下面的形式:\n[0059] 品牌—三星→[9434,3449,344,4343,5667,5445]\n[0060] 品牌—HTC→[556,4680,7940,9889,6755,6937]\n[0061] 制式—GSM→[4545,67678,4554,3,767]\n[0062] ……\n[0063] 特色功能—双核→[4879,46,78,766,344,5787]\n[0064] 将产品属性取值的数字识别码,按照产品属性形成集合,再按照索引数据文件格式的要求,将形成集合后的数字识别码、产品数量转换成索引数据文件。索引数据文件采用纯文本方式,使用时首先全部加载到内存。下面按照例子进行说明索引数据文件的格式:\n[0065] @config:\n[0066] 5\n[0067] @match:\n[0068] BR:1,0-27\n[0069] BR:2,27-30\n[0070] BR:3,30-42\n[0071] GT:9,42\n[0072] @record:\n[0073] 1,2,3,4,1,6\n[0074] 2,3,4:99,5,3,7\n[0075] 索引数据文件分为@config,@macth,@record三段,@config:由数字组成,表示IndexField数组的长度;@match:段定义了预定义的屏幕尺寸条件Match,冒号后面紧接着的数字表示Match的数字识别码,后面是真正的条件;BR表示Between with right limit,0-27表示:v>0&&v<=27,GT表示Greater Than,42表示v>42;@record:段定义了记录数据,采用逗号分隔,顺序为Id,IndexField。当某个属性有多个取值时,用冒号分隔(价格不可能有多个取值)。\n[0076] 预查询结果文件的建立方法包括以下步骤:\n[0077] 1)构造一个匹配器数组,将产品属性按照索引文件中属性的排列顺序全部放到这个匹配器数组中,根据产品所有属性的取值初始化该匹配器数组。\n[0078] 2)把索引数据文件中的全部数据都与该匹配器数组进行匹配,在此匹配中,每次只匹配其中一个属性的一个取值,记录匹配结果,统计各属性具体取值的产品数量。如统计手机中,系统为Android4.0的产品数量及产品名单、系统为Android4.1的产品数量及产品名单等。\n[0079] 3)将各属性具体取值的产品数量以及各属性的产品数量、产品名单列表信息转换成预查询结果文件。\n[0080] 利用索引数据文件查询方法的流程如下:\n[0081] 1)将索引数据文件加载至内存。\n[0082] 2)将预查询结果文件加载至内存;\n[0083] 3)构造查询匹配器\n[0084] 根据产品属性的数量,构造匹配器数组。匹配器数组和索引数据的结构类似,通过查询匹配器,能够迅速过滤出符合条件的数据。查询匹配器的构造步骤包括:根据产品属性的数量,构造一个match[]匹配器数组,数组中的每个元素都是一个匹配器,每个匹配器都对应一个产品属性,并且匹配器数组的元素按照索引数据文件中产品属性的顺序排列;其中用户没选择作为查询条件的产品属性的匹配器,其匹配结果在查询中恒设定为1,表示用户没有选中的那些产品属性,在本次查询中不需要进行匹配;用户选择作为查询条件的产品属性,根据查询条件来初始化该匹配器,从而得到查询匹配器。\n[0085] 查询匹配器类似下面的结构:\n[0086] match:m(0|1|2|3|4|)=(mid|val|v1,v2||...)\n[0087] m0=mid表示查询索引数据文件中预定义id为mid的Match;\n[0088] m1=val表示查询第二个IndexField,使用val来进行等于查询,v==val;\n[0089] m2=val1,val2表示查询第三个IndexField,使用val1和val2来进行等于查询,v==val1OR v==val2,可以指定多个值来进行匹配;\n[0090] m3表示第四个IndexField,以此类推。\n[0091] 4)选择匹配数据\n[0092] 当查询条件为单一属性查询时,从预查询结果文件中直接获取产品名单列表和产品数量,不需要进行以下步骤;当查询条件为多属性查询时,根据用户选择的查询产品属性,在预查询结果文件中分别获取每个属性具体取值对应的产品数量,选择在索引数据文件内包含产品数量最少的属性具体取值的数据作为匹配数据,可减少匹配次数。\n[0093] 5)查询匹配、记录匹配结果\n[0094] 查询匹配的过程基本类似下面的表格:\n[0095] \n[0096] 通过查询匹配器对索引数据,进行逐条匹配。匹配的结果记录在类似下面的结构中:\n[0097] \n[0098] 对于IndexField实际上是按顺序排列的产品属性,当一个产品数据和查询匹配器进行了匹配后,匹配的结果就按照产品属性的顺序进行记录。“1”表示该数据的这个属性符合匹配规则,“0”表示该数据的这个属性不符合匹配规则。一条产品数据,完成了全部匹配器的匹配后,如果全部属性都匹配,也就是说整行都是“1”,说明这条数据符合了全部的匹配条件,是这次查询的结果数据之一,需要将该数据记录到查询结果集合中。\n[0099] 由于我们的查询除了需要知道完全符合查询条件的数据外,还需要知道查询结果在其余产品属性上的分布,因此我们还需要能够判断该数据是否需要记录在其余属性上。\n[0100] 判断数据是否需要记录在其余属性上的步骤为:\n[0101] 1)将匹配结果集合分配到查询匹配器中没有作为查询条件的属性上,依次屏蔽其余属性中的一个属性,将匹配结果集合中的数据分配到被屏蔽的属性上。在构造查询匹配器时,将没有作为查询条件的产品属性对应的匹配器初始化为1,即除了被屏蔽的属性外其余各列匹配的结果都为1,因而匹配结果集合中的数据都满足该匹配条件。\n[0102] 2)判断各组数据是否包含被屏蔽属性的至少一个具体取值,并对包含被屏蔽属性的各具体取值的数据进行统计。手机系统包括:windowsphone8、windowsphone7.5、Android4.0、ios等,每台手机只对应其中一个系统,即每组数据中,系统的具体取值只能为一个。手机制式包括:GSM、WCDMA、CDMA2000、TD-SCDMA、LTE等,每台手机可以具有多个制式,即每组数据中,手机制式的具体取值可以为多个。\n[0103] 统计查询结果集合中产品名单及数量。\n[0104] 以上所述实施例仅表达了本发明的两种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。