具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
在本发明实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本发明。在本发明实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义,“多种”一般包含至少两种,但是不排除包含至少一种的情况。
应当理解,本文中使用的术语“和/或”仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。
取决于语境,如在此所使用的词语“如果”、“若”可以被解释成为“在……时”或“当……时”或“响应于确定”或“响应于识别”。类似地,取决于语境,短语“如果确定”或“如果识别(陈述的条件或事件)”可以被解释成为“当确定时”或“响应于确定”或“当识别(陈述的条件或事件)时”或“响应于识别(陈述的条件或事件)”。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的商品或者***不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种商品或者***所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的商品或者***中还存在另外的相同要素。
下面结合附图对本发明的一些实施方式作详细说明。在各实施例之间不冲突的情况下,下述的实施例及实施例中的特征可以相互组合。另外,下述各方法实施例中的步骤时序仅为一种举例,而非严格限定。
图1为本发明实施例提供的一种搜索方法的流程图。本发明实施例提供的该搜索方法可以由接收记录数据的服务器执行。更具体来说是由服务器中的处理器执行。可以理解的是,该服务器可以实现为软件、或者软件和硬件的组合。
并且在对图1所示实施例提供的搜索方法进行说明之前,还可以进行以下说明:
承接背景技术中的描述,在线上服务的提供过程和实际生产过程中均可以实时产生数据,此数据也即是本发明提供的各实施例中的记录数据。对于线上服务或者工业生产场景,往往需要能够快速地进行记录数据的实时搜索,从而及时了解服务状态以及生产设备的运行情况。这些场景比如可以是订单配送场景、流水线生产场景等等。其中,结合背景技术中的描述,记录数据的实时搜索可以理解为:记录数据被写入服务器中的数据库后即可被搜索到。
在订单配送场景中,实时生成的记录数据用以表明订单运输状态,该记录数据中可以包括用户ID,订单编号,订单价格,订单中商品的物流位置等字段。记录数据可以实时地被写入服务器配置的数据库中。
当订单的运输状态发生变化,具体说即是订单中商品的位置由A地变化至B地时,可以实时生成一条记录数据1。对于存储于数据库中的记录数据1,服务器中的处理器需要能够借助索引从数据库中将其实时、快速地搜索出来,并进一步将搜索出的记录数据1实时更新至用户的终端设备上,从而使用户能够及时了解商品的配送状态。并且相比于其他类型的订单,外卖订单对于记录数据实时搜索的效率具有更高的要求,以使用户能够及时了解到外卖订单的配送状态。
在流水线生产场景中,类似的,记录数据用以表明流水线上各设备工作状态。该记录数据中可以包括设备标识、工作状态信息等字段。其中,工作状态信息用于反映设备工作是否异常。记录数据可以实时地被写入服务器配置的数据库中。
在实际生产过程中,流水线上的各设备都可以定时检测自身的工作状态,以生成包含设备标识、工作状态信息等字段的记录数据。服务器中的处理器需要能够从数据库中实时、快速地搜索出反映设备工作出现异常的记录数据,并将搜索出的记录数据反馈给相关人员,以使相关人员能够根据搜索出的记录数据及时了解流水线上各设备的工作状态。
除了上述流水线上的生产设备之外,对于提供不同线上服务时所使用的各种网络设备,也需要快速地进行记录数据的实时搜索,以了解各网络设备的工作状态。当然,本发明并不对设备的类型进行限定,任何需要及时了解设备运行正常与否的场景均可以使用本发明各实施例提供的搜索方法,以搜索出反映设备工作异常的记录数据。
另外,本发明也不对使用场景进行限定,任意需要进行数据实时搜索的场景也均可以使用本发明各实施例提供的搜索方法,实现实时搜索的同时也能够保证搜索速度。
基于上述描述,下述各实施例均以外卖订单配送场景为例进行说明。如图1所示,该搜索方法具体可以包括如下步骤:
S101,响应于写入操作,将记录数据写入内存。
用户可以借助终端设备上安装的应用程序生成外卖订单,并由订单配送***进行订单分配。在配送人员配送外卖订单的过程中,订单中商品的位置是实时变化的,并且随着位置的实时变化,订单配送***中的服务器可以根据实时采集到的位置信息实时地生成记录数据。
响应于写入操作,服务器中的处理器可以将生成的记录数据实时写入服务器的内存中。可选地,此记录数据还可以被同时写入服务器的磁盘中,用于服务器异常宕机后的数据恢复,以确保生成的记录数据不丢失。
可选地,记录数据通常包含至少一个字段。举例来说,生成的记录数据1可以具有以下格式:doc ID=1;user ID:Alice.Anderson; Position:BuildingA1,StreetA2; orderID:100;Time:T1。
其中,记录数据1中包括doc ID、user ID、Position、order ID和Time这5个字段。doc ID表示记录数据的标识信息即记录数据编号,user ID表示用户标识,Position表示商品位置,order ID表示订单编号,Time表示记录数据的生成时间。则该记录数据表明:用户Alice.Anderson的外卖订单,该外卖订单的订单编号为100,且此订单在T1时间处于A位置。
S102,响应于写入操作,根据记录数据更新内存中的第一索引表。
进一步的,响应于记录数据的写入操作,处理器还可以立即根据记录数据,对内存中的第一索引表进行更新,也即是将记录数据的内容补充到第一索引表中。可选地,第一索引表具体可以包括倒排索引表和正排索引表。可选地,由于记录数据包括至少一个字段,则第一索引表的更新也是是将记录数据中各个字段都补充到第一索引表中,即记录数据中包含的不同字段均可以具有对应的第一索引表,并且每个字段都有一张对应的正排索引表和一张倒排索引表。
第一索引表中可以包括在T1时间之前生成的若干条记录数据对应的索引,则承接上述的举例,第一索引表更新的过程为:响应于写入操作,进一步将记录数据1补充到第一索引表中。对于记录数据1中包含的5个字段,每个字段都有一张对应的倒排索引表以及一张正排索引表。
可选地,上述第一索引表的实时更新可以由处理器建立的数据写入线程执行。当记录数据被更新至第一索引表中后,处理器还可以生成写入成功消息,以控制数据写入线程继续写入下一条记录数据。并且在同一场景中,实时生成的记录数据往往具有相同的字段,因此,随着记录数据不断写入,虽然第一索引表中包含的内容会不断增多,但第一索引表的数量不会发生变化。也即是在同一场景中的多条记录时间会复用相同的第一索引表。
可选地,随着第一索引表的实时更新,第一索引表中记录的内容越来越多,其占用的内存资源也越来越多,从而有可能影响记录数据的正常写入。为了保证数据的正常写入,可选地,处理器可以通过周期性地调用Flush操作,将内存中的第一索引表刷新到磁盘中,也即是根据内存中存储的第一索引表生成全新的第二索引表同时删除存储中的第一索引表,从而实现内存资源的释放。可选地,处理器也可以通过调用Commit操作和Fsync操作将第一索引表周期性地刷新到磁盘中。
可选地,调用Flush操作、Commit操作和Fsync操作的周期可以人为设置。但为了减少第一索引表对内存资源的占用,调用上述各操作的周期可以设置为一个较短的周期,以使内存中的第一索引表可以尽快持久化到磁盘中。
可选地,第二索引表的生成也可以由数据写入线程执行。并且由于定期刷新第一索引表到磁盘中表明第二索引表是定期生成的,而不是定期更新的,因此,随着第一索引表被周期性地刷新至磁盘中,磁盘中第二索引表的数量会不断增加。
根据上述描述可知,处理器能够实时更新第一索引表、定期生成第二索引表,并且内存中第一索引表的数量稳定,磁盘中第二索引表的数量不断增加。
S103,响应于搜索操作,借助支持不同数据存储结构的预设接口,根据第一索引表和磁盘中的第二索引表确定搜索结果,第二索引表和第一索引表具有不同的存储结构。
当用户想要知晓外卖订单中包含商品的位置时,则可以借助终端设备触发搜索操作。服务器中的处理器响应于搜索操作,借助预设接口,根据内存中的第一索引表和磁盘中的第二索引表进行记录数据的搜索,以确定出在触发搜索操作时产生的记录数据,并将记录数据中包含的商品所处的位置通知至用户。
其中,第一索引表和第二索引表还可以具有不同的存储结构。第一索引表具有的第一存储结构,用以保证第一索引表可以在内存中可读;第二索引表具有的第二存储结构,用以保证第二索引表可以在磁盘中可读。并且预设接口也能够支持两个索引表各自具有的存储结构,因此,借助预设接口可以分别读取内存中的第一索引表和磁盘中的第二索引表,从而实现记录数据的实时搜索。
其中,可选地,在每次将第一索引表刷新到磁盘中后,处理器还可以建立搜索线程,以使处理器借助此搜索线程进行记录数据的搜索。并且搜索线程和步骤102中提及的数据写入线程包含于同一进程中。
上述描述中,服务器中的处理器对第一索引表的实时更新、第二索引表的定期生成以及对记录数据的搜索过程可以结合图2所示的处理器的结构示意图理解。
本实施例中,响应于数据的写入操作,将记录数据写入内存,并对存储于内存中的第一索引表进行更新。响应于搜索操作,借助预设接口,分别在存储于内存中的第一索引表和存储于磁盘中的第二索引表中确定搜索结果。其中,存储于不同位置的两个索引表具有不同的存储结构,借助预设接口能够实现具有不同存储结构的索引表的读取和搜索。
可见,上述方法中,写入内存的记录数据可以被实时更新至第一索引表中,则借助此第一索引表能够实现记录数据的实时搜索。同时,写入的记录数据会通过更新的方式补充至索引表中,不会导致索引表数量的增加,即第一索引表的数量较为稳定,则可以在少量的第一索引表和第二索引表中进行搜索,提高实时搜索的效率。
另外,对于索引表的生成,除了图1所示实施例中提供的第一索引表和第二索引表的生成方式,可选地,还有一种方式:
处理器响应于记录数据写入内存的操作,可以通过实时调用Flush操作生成处理器可读取的、具有第二存储结构的索引表(简称为第三索引表),此第三索引表存储于内存中。也即是对于实时写入的每条记录数据都会为其实时生成一张对应的第三索引表。这就导致随着记录数据的不断写入,内存中的第三索引表的数量会不断增加。
同时,对于内存中的第三索引表,处理器还可以通过周期性调用Flush操作或者Commit操作将内存中的众多第三索引表进行合并再刷新到磁盘中,以得到存储于磁盘中的索引表(称为第四索引表),也即是实现索引表在磁盘中的持久化,并且第四索引表也具有第二存储结构。
但在上述过程中,一方面,在调用flush操作生成第三索引表后,处理器才会可以返回写入成功消息,以使处理器继续写入下一条记录数据。这种生成上一条记录数据的索引表后才继续写入下一条记录数据的方式,会大大降低记录数据的写入速度。另一方面,响应于搜索操作,处理器可以根据存储于内存中的第三索引表和存储于磁盘中的第四索引表实现记录数据的实时搜索。但处理器内存中存储有众多的索引表,不仅占用内存资源,而且在进行搜索时,处理器还需要打开众多的索引表进行搜索,从而大大影响搜索效率。
针对上述的问题,在图1所示实施例中,记录数据会在内存中存储的第一索引表中实时更新,而非为每条条记录数据重新生成一张索引表,以使得存储中第一索引表的数量不会增加,从而可以大大减少内存中存储的第一索引表的数量,处理器在借助第一索引表和第二索引表进行记录数据搜索时,所要打开的索引表的数量也大大减少,从而搜索效率。同时,当记录数据更新至第一索引表后,便可以返回写入成功消息,以继续写入下一条记录数据。因此,相较于索引表的生成,索引表的更新所需的时间更短,从而能够提高记录数据的写入速度。
图3为本发明实施例提供的另一种搜索方法的流程图。如图3所示,该方法可以包括如下步骤:
S201,响应于写入操作,将记录数据写入内存,记录数据中包含至少一个字段。
上述步骤201的执行过程可以参见如图1所示实施例中的相关描述,在此不赘述。
S202,响应于写入操作,将记录数据中至少一个字段包含的数据划分成至少一个数据片段。
每条记录数据都包括至少一个字段,则对写入内存的记录数据进行划分后即可得到至少一个数据片段。其中,数据片段可以认为是可搜索的最小单元,即索引表中是以数据片段为单位对记录数据进行存储的。并且数据片段、字段和记录数据之间的关系为:一条记录数据可以包括至少一个字段、一个字段又可以包括至少一个数据片段。
承接图1所示实施例中的举例,记录数据1包括docID、order ID、Time、user ID、Position这5个字段。则对于数据类型为文本型的字段user ID和Position,对该字段的划分可以理解为分词处理,也即是将Alice.Anderson划分为Alice和Anderson两个数据片段,将BuildingA1,StreetA2划分为BuildingA1和StreetA2两个数据片段。对于数据类型为数值型的字段docID、order ID和Time,每个字段中包含的内容也即是一个数据片段。
S203, 根据至少一个数据片段各自的数据类型,更新至少一个数据片段所属字段各自对应的第一索引表。
记录数据中每个字段都有对应的第一索引表,并且第一索引表具体可以包括一张正排索引表和一张倒排索引表。基于此,还可以根据划分得到的至少一个数据片段各自的数据类型,将每个数据片段更新到各自对应的倒排索引表和正排索引表中,也即是完成了将记录数据更新至第一索引表中。
S204,响应于搜索操作,借助支持不同存储结构的预设接口,根据第一索引表和磁盘中的第二索引表确定搜索结果,第二索引表和第一索引表具有不同的存储结构。
上述步骤204的执行过程可以参见如图1所示实施例中的相关描述,在此不赘述。
本实施例中,通过对记录数据包含的内容进行划分,以得到最小的可搜索单位即至少一个数据片段,再基于数据片段实现第一索引表的更新。本实施例中未详细描述的内容以及所能实现的技术效果可以参见图1所示实施例中的相关描述,在此不再赘述。
基于上述的外卖订单场景,在图3所示实施例中已经公开记录数据可以包含至少一个字段,并且不同字段可以具有不同的数据类型,比如user ID和Position为文本型数据,doc ID、order ID和Time字段为数值型数据,因此,划分出的至少一个数据片段也具有不同的数据类型。此时,对于不同数据类型的数据片段,也可以采用不同的方式将数据片段更新其所属的字段对应的第一索引表中。其中,不同字段各自对应的第一索引表又可以包括倒排索引表和正排索引表。则文本型数据片段所属字段对应的倒排索引表和正排索引表的存储结构具体可以表现为多层数组。数值型数据片段所属字段对应的正排索引表和正排索引表的存储结构具体可以表现为映射关系。
对一条记录数据进行划分后,可以得到至少一个文本型数据片段,也可以得到至少一个数值型数据片段。可选地,文本型的数据片段具体可以包括字符串、日期、数组等等。并且由于同一类型的各数据片段更新到索引表中的过程都是相同的,因此,可以以相同类型的至少一个数据片段中的任一数据片即目标数据片段为例进行更新过程的说明。
可选地,若该目标数据片段为文本型数据片段,则将目标数据片段更新到构成倒排索引表的多层数组中的过程可以如图4所示。倒排索引表的更新过程还可以结合图5理解。倒排索引表的更新过程具体可以包括以下步骤:
S301,根据目标数据片段所属记录数据的标识信息的哈希值和目标数据片段的哈希值,更新目标数据片段所属字段对应的倒排索引表中的第一数组。
具体地,根据目标数据片段所属记录数据的标识信息的哈希值,确定目标数据片段在第一数组中对应的第一元素。同时,根据目标数据片段的哈希值,确定第一元素在第一数组中的下标。最终,根据第一元素以及第一元素的下标,更新第一数组。
继续承接图1、图3所示实施例中的举例,记录数据1为:doc ID=1;user ID:Alice.Anderson; Position:BuildingA1,StreetA2; order ID:100;Time:T1。
通过对记录数据1中各字段进行划分,可以得到Alice、Anderson、BuildingA1,StreetA2这几个文本型的数据片段。其中,Alice、Anderson属于一个字段,其会被更新到同一张倒排索引表中,BuildingA1,StreetA2会被更新到另一张倒排索引表中。
则将文本型数据片段“Alice”作为目标数据片段,结合图5中的(b)说明倒排索引表中第一数组的更新过程:
确定“Alice”所属记录数据的标识信息为1,且该标识信息的哈希值也为1,则哈希值“1”也是目标数据片段“Alice”在第一数组中对应的第一元素。再计算“Alice”的哈希值为3,则“3”是上述第一元素“1”在第一数组中的下标,也即是表示第一元素“1”在第一数组中的位置。则第一数组中下标为“3”的元素会被更新有第一元素“1”。可选地,第一数组的下标可以由0开始计数。
S302,根据第一数组包含的数组元素和目标数据片段的编码结果的长度值,更新目标数据片段所属字段对应的倒排索引表中的第二数组。
具体地,将步骤301中得到的第一元素,确定为目标数据片段在第二数组中对应的第二元素的下标。再根据倒排索引表中的第三数组已包含的其他数据片段的编码结果的长度值和其他数据片段的数量,确定第二元素。最终,根据第二元素以及第二元素的下标,更新第二数组。可选地,第二数组的下标可以由0开始计数。
继续以“Alice”为目标数据片段为例, 结合图5中的(b)说明倒排索引表中第二数组的更新过程:
将目标数据片段“Alice”在第一数组中的第一元素“1”确定为目标数据片段“Alice”在第二数组中的第二元素的下标。
接着,根据图5中(a)所示的倒排索引表可知,在将目标数据片段“Alice”更新至倒排索引表中的第二数组之前,倒排索引表中的第三数组已经存储有记录数据0中user ID字段对应的1个数据片段(Bob)的编码结果,并且该编码结果的长度值3,即第三数组中下标为0~3的位置已经填充了记录数据0中user ID对应的数据片段的编码结果“Bob”,以及该编码结果的长度值“3”。其中,记录数据0是在记录数据1之前写入的,记录数据0为:doc ID=0;user ID: Bob; Position:BuildingB1,StreetB2; order ID:80;Time:T0。并且根据图5中的(a)可知,“Bob”这一数据片段的哈希值为7,记录数据0的标识信息为0,该标识信息的哈希值也为0。
此时,可以将记录数据0中user ID对应的数据片段的数量(数量为1个)和各数据片段的编码结果的长度值(长度值为3)之和确定为记录数据1中的目标数据片段“Alice”在第二数组中的第二元素为4。也即是在第三数组中,“Alice”的编码结果以及编码结果的长度值会以下标为4的位置为起点进行填充。
最终,第二数组中下标为“1”的位置上会更新有第二元素“4”。
为了便于理解,上述描述中,第三数组中包含的数据片段的编码结果可以与原始数据片段相同,但在实际中二者也可以是不同的。
S303,根据第二数组包含的数组元素和目标数据片段的编码结果,更新目标数据片段所属字段对应的倒排索引表中的第三数组。
具体地,将目标数据片段在第二数据中的第二元素,确定为目标数据片段在第三数组中对应的第一类型的第三元素的下标。再按照第一类型数的第三元素的下标,将目标数据片段的编码结果的长度值作为第一类型的第三元素,更新第三数组,同时将目标数据片段的编码结果作为第二类型的第三元素,更新第三数组。其中,第三数组中第一类型的第三元素表明目标数据片段编码结果的长度值。第二类型的第三元素表明目标数据片段的编码结果。可选地,第三数组的下标可以由0开始计数。
继续以“Alice”为目标数据片段为例, 结合图5中的(b)说明倒排索引表中第三数组的更新过程:
将目标数据片段“Alice”在第二数组中的第二元素“4”确定为目标数据片段“Alice”在第三数组中第一类型的第三元素的下标,并将“Alice”的编码结果的长度值“5”确定为第一类型的第三元素,同时将目标数据片段“Alice”的编码结果“Alice”确定为第二类型的第三元素,并将两种类型的第三元素依次填充至第三数组,也即是实现了第三数组的更新。
S304,建立第三数组包含的数组元素和目标数据片段所属记录数据的标识信息之间的关联关系,以得到目标数据片段所属字段对应的倒排索引表中的第四数组。
基于上述更新完成的第三数据,进一步可以建立第三数组中的数组元素与目标数据片段所属记录数据的标识信息之间的关联关系,具体说是建立第一类型的第三元素与标识信息之间的关联关系,该关联关系也即为倒排索引表中的第四数组。
继续以“Alice”为目标数据片段为例, 结合图5中的(b)说明倒排索引表中第四数组的更新过程:
建立目标数据片段“Alice”在第三数组中的第一类型的第三元素“5”与目标数据片段“Alice”所属记录数据的标识信息“1”之间的关联关系,从而实现第四数组的更新。
按照上述步骤将目标数据片段“Alice”更新至user ID对应的倒排索引表后,该倒排索引表可以如图5中的(b)所示。
基于上述描述可知,构成倒排索引表的多层数组之间可以具有以下关系:目标数据片段在第一数组中的第一元素是该数据片段在第二数组中的第二元素的下标,目标数据片段在第二数组中的第二元素是该数据片段在第三数据中第一类型的第三元素的下标。
可选地,在实际中,先后写入的多条记录数据可以被划分为多个相同的数据片段,比如在T2时间,写入记录数据2为doc ID=2;user ID:Alice.Anderson; Position:BuildingA3,StreetA4; order ID:100;Time:T2。则仍然可以划分出“Alice”这一文本型的数据片段,则此数据片段仍然可以按照上述方式更新至构成倒排索引表的第一数组~第四数组中,更新后的倒排索引表可以如图6所示。但由于计算出的记录数据2中的“Alice”的哈希值为3,与第一数组中下标为3的元素发生冲突,则记录数据2的标识信息会被更新到倒排索引表的第四数组中。
本实施例中,对于记录数据中包含的文本类型的数据片段,可以依次对多层数组中的各个数组进行更新,从而完成整个倒排索引表的更新。并且上述结构的倒排索引表能够直接在内存中被读取。
可选地,与图4所示实施例类似的,对于文本型的目标数据片段,还可以将其更新至正排索引表中,则更新过程可以如图7所示。正排索引表的更新过程还可以结合图8理解。更新过程具体可以包括以下步骤:
S401,根据目标数据片段所属记录数据的标识信息和目标数据片段的哈希值,更新目标数据片段所属字段对应的正排索引表中的第七数组。
具体地,根据目标数据片段所属记录数据的标识信息,确定目标数据片段在第七数组中对应的第七元素。再根据目标数据片段的哈希值,确定第一元素在第七数组中的下标。最终,根据第七元素以及第七元素的下标,更新第七数组。可选地,第七数组的下标可以由0开始计数。
继续承接图1、图3所示实施例中的举例,记录数据1为:doc ID=1;user ID:Alice.Anderson; Position:BuildingA1,StreetA2; order ID:100;Time:T1。则以“Alice”为目标数据片段为例, 结合图8中的(b)说明正排索引表中第七数组的更新过程:
确定“Alice”所属记录数据的标识信息为1,则“1”也是目标数据片段“Alice”在第七数组中对应的第七元素。再计算“Alice”的哈希值为3,则“3”是上述的第七元素“1”在第七数组中的位置。则第七数组中下标为“3”的位置上会被更新有第七元素“1”。
S402, 根据第七数组包含的数组元素和目标数据片段的编码结果的长度值,更新目标数据片段所属字段对应的正排索引表中的第八数组。
具体地,将步骤401中得到的第七元素,确定为目标数据片段在第八数组中对应的第八元素的下标。再根据倒排索引表中第九数组已包含的其他数据片段的编码结果的长度值和其他数据片段的数量,确定第八元素。最终,根据第八元素以及第八元素的下标,更新第八数组。可选地,第八数组的下标可以由0开始计数。
继续以“Alice”为目标数据片段为例, 结合图8中的(b)说明倒排索引表中第八数组的更新过程:
将目标数据片段“Alice”在第七数组中的第七元素“1”确定为目标数据片段“Alice”在第八数组中的第八元素的下标。
接着,根据图8中(a)所示的正排索引表可知,在将目标数据片段“Alice”更新至正排索引表中的第八数组之前,正排索引表中的第九数组已经存储有记录数据0中user ID对应的1个数据片段(Bob)的编码结果,并且该编码结果的长度值3,即第九数组中下标为0~3的位置已经填充了记录数据0中user ID对应的数据片段的编码结果“Bob”,以及该编码结果的长度值“3”。其中,记录数据0是在记录数据1之前写入的,记录数据0为:doc ID=0;userID: Bob; Position:BuildingB1,StreetB2; order ID:80;Time:T0。
则可以将记录数据0中user ID对应的数据片段的数量(数量为1个)和各数据片段的编码结果的长度值(长度值为3)之和确定为记录数据1中的目标数据片段“Alice”在第八数组中的第八元素为4。也即是在第九数组中,“Alice”的编码结果以及编码结果的长度值会以下标为4的位置为起点进行填充。
最终,第八数组中下标为“1”的位置上会更新有第二元素“4”。
为了便于理解,上述描述中,第九数组中包含的数据片段的编码结果可以与原始数据片段相同,但在实际中二者也可以是不同的。
S403, 根据第八数组包含的数组元素和目标数据片段的编码结果,更新目标数据片段所属字段对应的正排索引表中的第九数组。
具体地,将目标数据片段在第二数据中的第二元素,确定为目标数据片段在第三数组中对应的第一类型的第三元素的下标。再按照第一类型数的第三元素的下标,将目标数据片段的编码结果的长度值作为第一类型的第三元素,更新第三数组,将目标数据片段的编码结果作为第二类型的第三元素,更新第三数组。其中,第三数组中第一类型的第三元素表明目标数据片段编码结果的长度值。第二类型的第三元素表明目标数据片段的编码结果。
继续以“Alice”为目标数据片段为例, 结合图8中的(b)说明倒排索引表中第三数组的更新过程:
将目标数据片段“Alice”在第二数组中的第二元素“4”确定为目标数据片段“Alice”在第三数组中第一类型的第三元素的下标,并将“Alice”的编码结果的长度值“5”确定为第一类型的第三元素,同时将“Alice”的编码结果“Alice”确定为第二类型的第三元素,并将两种类型的第三元素依次填充至第三数组,也即是实现了第三数组的更新。
根据上述描述的更新方式可知,构成正排索引表的多层数组之间的关系:目标数据片段在第七数组中的第七元素是该数据片段在第八数组中的第八元素的下标,目标数据片段在第八数组中的第八元素是该数据片段在第九数据中第一类型的第三元素的下标。
可选地,在实际中,先后写入的多条记录数据也可以被划分为相同的数据片段,比如在T2时间写入的记录数据2为:doc ID=2;user ID:Alice.Anderson; Position:BuildingA3,StreetA4; order ID:100;Time:T2。则目标数据片段“Alice”仍然可以按照上述方式更新至第七数组~第九数组中,更新后的正排索引表可以如图9所示。但由于计算出的记录数据2中的“Alice”的哈希值为3,与第一数组中下标为3的元素发生冲突,则将“Alice”的哈希值加1变为4,之后继续按照上述方式将记录数据2中的目标数据片段“Alice”更新到正排索引表中。
本实施例中,对于记录数据中包含的文本类型的数据片段,可以依次对多层数组中的各个数组进行更新,从而完成整个正排索引表的更新。并且上述结构的正排索引表能够直接在内存中被读取。
综合图4和图7所示实施例可知,正排索引表和倒排索引表具有相似的更新过程,但其中,更新倒排索引表中的第一数组时使用的目标数据片段的所搜记录数据的标识信息的哈希值,更新正排索引表中的第七数组时是直接使用的目标数据片段的所搜记录数据的标识信息。
并且正排索引表和倒排索引表的存储结构虽然都是多层数组,但数组之间的多层关系存在差异,正排索引表和倒排索引表的具体结构差异可以对比图8和图5理解。
可选地,若目标数据片段为数值型数据片段,则将该目标数据片段更新至倒排索引表中的过程可以描述为:将目标数据片段所属记录数据的标识信息和目标数据片段之间的关联关系更新至倒排索引表中的第五数组。
继续承接上述举例,记录数据1为:doc ID=1;user ID: Alice.Anderson;Position:BuildingA1,StreetA2; order ID:100;Time:T1。
通过对记录数据1中各字段进行划分,以得到100、T1这几个数值型的数据片段。其中,“100”属于一个字段,其会被更新到一张倒排索引表中,“T1”会被更新到另一张倒排索引表中。则以“100”为目标数据片段为例,倒排索引表中第五数组的更新过程即为:建立“100”与doc ID=1之间的关联关系。
可选地,数值型目标数据片段所属字段对应的倒排索引表中还可以包括第六数组,用于存储在预设时间段内写入的记录数据中,同一字段中多个数据片段的最值。
若目标数据片段的数值大于倒排索引表中第六数组包含的最大值,则根据目标数据片段更新第六数组中的最大值,否则不更新第六数组中的最大值。
若目标数据片段的数值小于倒排索引表中第六数组包含的最小值,则根据目标数据片段更新第六数组中的最小值,否则不更新第六数组中的最小值。
举例来说,在写入记录数据1之前,已经写入的记录数据0为:doc ID=0;user ID:Bob; Position:BuildingB1,StreetB2; order ID:80;Time:T0。此时,如图10中的(a)所示,在写入记录数据1之前,在order ID对应的倒排索引表包含的第六数组中,最大值为80,最小值为1。在写入记录数据1:doc ID=1;user ID: Alice.Anderson; Position:BuildingA1,StreetA2; order ID:100;Time:T1后,第六数组中包含的最大值会被更新为100,最小值不变,可以如图10中的(b)所示。
可选地,对于数值型的目标数据片段,将其更新至正排索引表中的过程可以描述为:根据目标数据片段所属记录数据的标识信息和目标数据片段建立的键值对;根据键值对更新正排索引表。也即是建立起目标数据片段所属记录数据的标识信息与目标数据片段之间的映射关系。
继续承接上述举例,记录数据1为:doc ID=1;user ID: Alice.Anderson;Position:BuildingA1,StreetA2; order ID:100;Time:T1。
通过对记录数据1中各字段进行划分,以得到100、T1这几个数值型的数据片段。其中,“100”属于一个字段,其会被更新到一张倒排索引表中,T1会被更新到另一张倒排索引表中。则以“100”为目标数据片段为例,正排索引表的更新过程即为:将“doc ID=1”作为KEY,将“100”作为Value,由二者构成键值对,也即是建立二者之间的映射关系。正排索引表的更新过程可以结合图11理解。
基于上述提供的方式可以将不同类型的数据片段更新至其所属字段对应的正排索引表和倒排索引表中。并且实时写入的记录数据会被实时更新到存储于内存中的正排索引表和倒排索引表中。之后响应于搜索操作,处理器还可以基于内存中更新后的正排索引表和倒排索引表以及磁盘中的第二索引表中实现记录数据的实时搜索。
可选地,对于文本型数据片段对应的正排索引表和倒排索引表,在进行上述更新后,还可以根据预设规则,比如按照字母顺序,对重新调整倒排索引表中第一数组中元素的顺序。按照字母顺序可知,Alice应该排在Bob之前,因此,图5中(b)所示的倒排索引表会被调整为图12所示的倒排索引表。类似的,正排索引表也可以进行上述调整。由于在实际搜索过程中,往往采用二分法进行搜索,而通过对正排索引表和倒排索引表的调整,可以提高搜索效率。
可选地,基于上述得到的第一索引表和第二索引表,在实际搜索过程中,当以docID为关键词进行搜索时,可以直接使用正排索引表表进行查找,依照到对应的记录数据。当以非doc ID的其他字段中的某一文本型数据片段为关键词进行搜索时,可以先使用倒排索引表找到包含该关键词的doc ID,再利用正排索引表找到具有此doc ID的记录数据,以及关键词在此条记录数据中的位置。
本发明实施例提供的一种搜索***的结构示意图。如图2所示,该***具体可以包括:磁盘、内存和处理器。在实际中可选地,该***对应的硬件表现形式具体可以为服务器。
其中,内存,用于存储第一索引表。磁盘,用于存储第二索引表,第二索引表和第一索引表具有不同的存储结构;
处理器,用于响应于写入操作,将记录数据写入内存;响应于写入操作,根据记录数据更新第一索引表;响应于搜索操作,借助支持不同存储结构的预设接口,根据第一索引表和第二索引表确定搜索结果。
该***中各部分的具体工作过程可以参见图1所示实施例中的相关描述。可选地,处理器中还具体建立有数据写入线程和搜索线程,两个线程的具体工作过程和工作时机可以参见上述图1~图12所示实施例中的相关描述,在此不再赘述。
另外,本实施例中其他未详细描述的内容也可以参见上述图1~图12所示实施例中的相关描述,在此不再赘述。
以下将详细描述本发明的一个或多个实施例的搜索装置。本领域技术人员可以理解,这些搜索装置均可使用市售的硬件组件通过本方案所教导的步骤进行配置来构成。
图13为本发明实施例提供的一种搜索装置的结构示意图,如图13所示,该装置包括:
写入模块11,用于响应于写入操作,将记录数据写入内存。
更新模块12,用于响应于所述写入操作,根据所述记录数据更新内存中的第一索引表。
搜索模块13,用于响应于搜索操作,借助支持不同存储结构的预设接口,根据所述第一索引表和磁盘中的第二索引表确定搜索结果,所述第二索引表和所述第一索引表具有不同的存储结构。
可选地,所述记录数据中包含至少一个字段;所述更新模块12具体包括:
划分单元121,用于将所述记录数据中至少一个字段包含的数据划分成至少一个数据片段。
更新单元122,用于根据所述至少一个数据片段各自的数据类型,更新所述至少一个数据片段所属字段各自对应的所述第一索引表。
可选地,数据片段包括文本型数据,所述第一索引表包括存储结构为多层数组的倒排索引表;
所述更新单元122具体用于:根据所述目标数据片段所属记录数据的标识信息的哈希值和所述目标数据片段的哈希值,更新所述目标数据片段所属字段对应的倒排索引表中的第一数组,所述目标数据片段为所述至少一个数据片段中的任一数据片段;
根据所述第一数组包含的数组元素和所述目标数据片段的编码结果的长度值,更新所述目标数据片段所属字段对应的倒排索引表中的第二数组;
根据所述第二数组包含的数组元素和所述目标数据片段的编码结果,更新所述目标数据片段所属字段对应的倒排索引表中的第三数组;
建立所述第三数组包含的数组元素和所述目标数据片段所属记录数据的标识信息之间的关联关系,以得到所述目标数据片段所属字段对应的倒排索引表中的第四数组。
可选地,所述更新单元122具体用于:根据所述目标数据片段所属记录数据的标识信息的哈希值,确定所述目标数据片段在所述第一数组中对应的第一元素;
根据所述目标数据片段的哈希值,确定所述第一元素在所述第一数组中的下标;
根据所述第一元素以及所述第一元素的下标,更新所述第一数组。
可选地,所述更新单元122具体用于:将所述第一元素,确定为所述目标数据片段在所述第二数组中对应的第二元素的下标;
根据所述倒排索引表中第三数组已包含的其他数据片段的编码结果的长度值和所述其他数据片段的数量,确定所述第二元素;
根据所述第二元素以及所述第二元素的下标,更新所述第二数组。
可选地,所述更新单元122具体用于:将所述第二元素,确定为所述目标数据片段在所述第三数组中对应的第一类型的第三元素的下标;
按照所述第一类型数的第三元素的下标,将所述目标数据片段的编码结果的长度值作为所述第一类型的第三元素,更新所述第三数组;
将所述目标数据片段的编码结果作为第二类型的第三元素,更新所述第三数组。
可选地,数据片段包括数值型数据;所述第一索引表包括倒排索引表;
所述更新单元122具体用于:所述根据所述至少一个数据片段各自的数据类型,更新所述至少一个数据片段所属字段各自对应的所述第一索引表,包括:
将目标数据片段所属记录数据的标识信息和所述目标数据片段之间的关联关系更新至所述倒排索引表中的第五数组,所述目标数据片段为所述至少一个数据片段中的任一数据片段
可选地,所述更新单元122具体用于:若所述目标数据片段的数值大于所述倒排索引表中第六数组包含的最大值,则根据所述目标数据片段更新所述第六数组中的最大值;
或者,
若所述目标数据片段的数值小于所述倒排索引表中第六数组包含的最小值,则根据所述目标数据片段更新所述第六数组中的最小值。
可选地,数据片段包括文本型数据,所述第一索引表包括存储结构为多层数组的正排索引表;
所述更新单元122具体用于:根据所述目标数据片段所属记录数据的标识信息和所述目标数据片段的哈希值,更新所述目标数据片段所属字段对应的正排索引表中的第七数组,所述目标数据片段为所述至少一个数据片段中的任一数据片段;
根据所述第七数组包含的数组元素和所述目标数据片段的编码结果的长度值,更新所述目标数据片段所属字段对应的正排索引表中的第八数组;
根据所述第八数组包含的数组元素和所述目标数据片段的编码结果,更新所述目标数据片段所属字段对应的正排索引表中的第九数组。
图13所示装置可以执行图1至图12所示实施例的方法,本实施例未详细描述的部分,可参考对图1至图12所示实施例的相关说明。该技术方案的执行过程和技术效果参见图1至图12所示实施例中的描述,在此不再赘述。
以上描述了搜索装置的内部功能和结构,在一个可能的设计中,搜索装置的结构可实现为一电子设备,如图14所示,该电子设备可以包括:处理器21和存储器22。其中,所述存储器22用于存储支持该电子设备执行上述图1至图12所示实施例中提供的搜索方法的程序,所述处理器21被配置为用于执行所述存储器22中存储的程序。
所述程序包括一条或多条计算机指令,其中,所述一条或多条计算机指令被所述处理器21执行时能够实现如下步骤:
响应于写入操作,将记录数据写入内存;
响应于所述写入操作,根据所述记录数据更新内存中的第一索引表;
响应于搜索操作,借助支持不同存储结构的预设接口,根据所述第一索引表和磁盘中的第二索引表确定搜索结果,所述第二索引表和所述第一索引表具有不同的存储结构。
可选地,所述处理器21还用于执行前述图1至图12所示实施例中的全部或部分步骤。
可选地,所述电子设备的结构中还可以包括通信接口23,用于该电子设备与其他设备或通信网络通信。
另外,本发明实施例提供了一种计算机存储介质,用于储存上述电子设备所用的计算机软件指令,其包含用于执行上述图1至图12所示方法实施例中搜索方法所涉及的程序。
基于上述各实施例,对于记录数据中包含的文本型数据片段,本发明实施例还提供的另一种电子设备,如图15所示,该电子设备包括处理器31和存储器32;其中,所述存储器32以预设存储结构存储记录数据对应的索引数据;该预设存储结构包括第一数组、第二数组、第三数组和第四数组。
其中,第一数组的元素,根据数据片段所属记录数据的标识信息的哈希值和数据片段的哈希值得到。
第二数组的元素,根据第一数组的元素和数据片段的编码结果的长度值得到。
第三数组的元素,根据第二数组的元素和数据片段的编码结果得到。
第四数组记录有第三数组的元素和数据片段所属记录数据的标识信息之间关联关系。
其中,上述的索引数据具有的预设存储结构具体可以为图5或图6所示的倒排索引表。
所述存储器32还存储有可执行代码,当所述可执行代码被所述处理器执行时,使所述处理器执行前述图1至图12所示实施例中的全部或部分步骤。
可选地,所述电子设备的结构中还可以包括通信接口33,用于该电子设备与其他设备或通信网络通信。
对于记录数据中包含的文本型数据片段,本发明实施例还提供的又一种电子设备,如图16所示,该电子设备包括处理器41和存储器42,其中,所述存储器42以预设存储结构存储记录数据对应的索引数据;该预设存储结构包括第一数组、第二数组和第三数组。
其中,第一数组的元素,根据目标数据片段所属记录数据的标识信息和数据片段的哈希值得到。
第二数组的元素,根据第一数组的元素和数据片段的编码结果的长度值得到。
第三数组的元素,根据第二数组的元素和数据片段的编码结果得到。
其中,本实施例中的第一数组~第三数组也即是图7所示实施例中的第七数组~第九数组。则本实施例提供的索引数据具有的预设存储结构具体可以为图8或图9所示的正排索引表。
所述存储器32还存储有可执行代码,当所述可执行代码被所述处理器执行时,使所述处理器执行前述图1至图12所示实施例中的全部或部分步骤。
可选地,所述电子设备的结构中还可以包括通信接口43,用于该电子设备与其他设备或通信网络通信。
对于录数据中包含的数值型数据片段,本发明实施例提供的又一种电子设备。该电子设备包括处理器和存储器,其中,所述存储器以预设存储结构存储记录数据对应的索引数据;该预设存储,该索引数据具有的预设存储结构具体可以为上述图10或图11所示实施例中提供的正排索引表和倒排索引表
此外,本发明实施例还提供了一种计算机程序产品,所述计算机程序产品包括:计算机程序/指令,其中,当计算机程序被处理器执行时,致使所述处理器实现如图1至图12所示方法实施例中的搜索方法。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。