CN117290523B - 基于动态索引表的全文检索方法及装置 - Google Patents
基于动态索引表的全文检索方法及装置 Download PDFInfo
- Publication number
- CN117290523B CN117290523B CN202311562345.1A CN202311562345A CN117290523B CN 117290523 B CN117290523 B CN 117290523B CN 202311562345 A CN202311562345 A CN 202311562345A CN 117290523 B CN117290523 B CN 117290523B
- Authority
- CN
- China
- Prior art keywords
- search
- index
- node
- keyword
- key
- 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
- 238000000034 method Methods 0.000 title claims abstract description 85
- 230000008569 process Effects 0.000 claims description 40
- 238000004364 calculation method Methods 0.000 claims description 19
- 239000000203 mixture Substances 0.000 claims description 10
- 238000012966 insertion method Methods 0.000 claims description 9
- 238000003491 array Methods 0.000 abstract description 9
- 230000006870 function Effects 0.000 description 40
- 238000010586 diagram Methods 0.000 description 12
- 230000005540 biological transmission Effects 0.000 description 3
- 230000009286 beneficial effect Effects 0.000 description 2
- 230000006872 improvement Effects 0.000 description 2
- 238000013507 mapping Methods 0.000 description 2
- 238000004321 preservation Methods 0.000 description 2
- 238000012545 processing Methods 0.000 description 2
- 238000009825 accumulation Methods 0.000 description 1
- 239000000969 carrier Substances 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 239000006185 dispersion Substances 0.000 description 1
- 239000000284 extract Substances 0.000 description 1
- 230000010365 information processing Effects 0.000 description 1
- 238000011835 investigation Methods 0.000 description 1
- 230000009191 jumping Effects 0.000 description 1
- 239000000463 material Substances 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000005457 optimization Methods 0.000 description 1
- 230000008520 organization Effects 0.000 description 1
- 238000012827 research and development Methods 0.000 description 1
- 230000004044 response Effects 0.000 description 1
- 230000011218 segmentation Effects 0.000 description 1
- 238000012163 sequencing technique Methods 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
- 239000002699 waste material Substances 0.000 description 1
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/30—Information retrieval; Database structures therefor; File system structures therefor of unstructured textual data
- G06F16/38—Retrieval characterised by using metadata, e.g. metadata not derived from the content or metadata generated manually
- G06F16/387—Retrieval characterised by using metadata, e.g. metadata not derived from the content or metadata generated manually using geographical or spatial information, e.g. location
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/30—Information retrieval; Database structures therefor; File system structures therefor of unstructured textual data
- G06F16/31—Indexing; Data structures therefor; Storage structures
- G06F16/316—Indexing structures
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Library & Information Science (AREA)
- Software Systems (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及一种基于动态索引表的全文检索方法及装置,属于信息检索的技术领域,该发明的方法包括:设置两个关键字索引表一和二,它们均采用链表数组的存储结构,分别对应地存储检索关键字首次检索成功和失败时所记录的相关信息;在执行用户的检索操作时,直接读取前述两个关键字索引表中的数据以快速返回检索成功或失败的结果信息,在未能返回结果信息时则首次地在文档文本中检索关键字并将检索结果相应地写入索引表一或二;两个关键字索引表链表数组的编址和寻址,均参照检索关键字经哈希函数运算后所产生的码值,以实现两个关键字索引表中对应数组元素的直接读写。本发明适用于用户检索请求频繁且用户输入的检索关键字趋于集中的应用场景。
Description
技术领域
本发明涉及一种关键字检索的方法及装置,尤其涉及一种基于动态索引表的全文检索方法及装置,属于信息检索的技术领域。
背景技术
信息检索是一种通过计算机技术和信息学方法,从大量信息中找到与用户需求相匹配的特定信息的过程。信息检索不仅仅是一种简单的搜索过程,还涉及许多复杂的算法,如分词、索引、排序、聚类等,这些算法可以帮助我们更准确、更高效地查找需求的信息,这也正是信息检索技术研究和开发的意义所在。全文检索所研究的内容通常是整个文档信息的表示、存储、组织和访问,即根据用户的查询要求,如何从整个文档中检索出相关的文本字串。全文检索的中心环节是文件内容的表达、信息查询的获得以及相关信息的匹配,并将输出信息进行相关性排列,以最终输出用户满意的检索结果。全文检索是信息处理中一个极为重要的技术领域分支,全文检索的目的,除了返回文档文本中是否存在要检索的关键字之外,还要对文本中的每个字、词进行位置标引。从全文检索的基本算法来看,目前通常采用的是在文档全文中将检索关键字与从头到尾逐一扫描的字串进行对比的数据匹配方式。在图书馆藏、法律文库、专利文献、国家标准等数据库应用技术领域中文本信息海量的情况下,全文检索将消耗较多的算力资源,尤其是在用户数量较多,用户检索请求频繁、计算机检索任务繁重时,全文检索的效率性能将直接决定用户体验的好坏,检索操作结果的反馈速度始终是检索技术领域中一个长期追求的性能目标。
目前,针对同一文本文档,当同一用户或不同用户针对同一关键字多次反复进行检索操作时,每一次的检索结果无论是成功还是失败,计算机检索系统通常会重复执行同一关键字匹配的相同过程,即先后执行的两次检索过程各自独立,在后的检索过程无法充分利用在先检索成功或失败时已经获取的某些“捷径”信息,换言之,为提高检索效率,在后检索的一个完整匹配过程中某些环节也许是可以略去的。当文档文本中的字符数量规模庞大,尤其是当用户的检索请求比较频繁时,这会给计算机检索系统的运行带来更大的任务负担,对检索结果的漫长等待过程甚至会直接影响用户的心理感受,尤其是检索不成功时的漫长等待更会给用户带来不良的使用体验。其中,同一用户或不同用户针对同一文档中同一检索关键字多次反复提交检索申请时计算机重复执行同一匹配运算过程,是导致整体检索效率不尽人意的原因之一,同时这也正是全文检索效率优化的空间所在。
发明内容
本发明所要解决的技术问题是,在大语料的文本环境中,尤其是在先后执行的检索过程中用户所输入的关键字趋于相同或集中的情况下,如何提高用户关键字的检索效率,即无论其最终的检索结论是成功还是失败,都如何尽可能快地返回本次检索的结果,其目的在于为用户提供一种较佳的检索操作体验。
为了解决上述技术问题,本发明提供了一种基于动态索引表的全文检索方法及装置,并采取如下技术方案:
第一方面,本发明提供了一种基于动态索引表的全文检索方法,查找检索关键字在文档文本中的所有出现位置并向用户返回查找结果,所述方法包括:
步骤S1、在计算机存储器中设置两个关键字索引表,即关键字索引表一和关键字索引表二,所述两个关键字索引表均采用链表数组的存储结构,分别记为Index_1[]和Index_2[],它们的下标编址范围均为0~65535,两个链表数组Index_1[]和Index_2[]中的每一个数组元素均对应存储一个线性链表的头指针,其中Index_1[]中数组元素所指示线性链表内的各结点均包括用于存储检索关键字在所述文档文本中一处出现位置的指针P和用于存储当前结点之直接后继结点存储位置的指针N这两个域,Index_2[]中数组元素所指示线性链表内的各结点均包括用于存储检索关键字的字串S和用于存储当前结点之直接后继结点存储位置的指针N这两个域,两个链表数组Index_1[]和Index_2[]中的每一个数组元素均初始化取值为NULL;
步骤S2、在获取用户输入的检索关键字之后,首先判断该关键字先前是否在文档文本中曾经检索过,即利用哈希函数计算该关键字的码值C,通过读取数组元素Index_1[C]所指示的一条线性链表中的各结点数据判断该关键字先前是否曾经检索过且检索结果为成功,通过读取数组元素Index_2[C]所指示的一条线性链表中的各结点数据判断该关键字先前是否曾经检索过且检索结果为失败,若既未成功地检索过也未失败地检索过则视为该关键字先前在文档文本中从未检索过;然后,
若该关键字先前曾成功地检索过则返回其首次检索成功时所保存的检索结论信息,若该关键字先前曾失败地检索过则返回其首次检索失败时所保存的检索结论信息,若该关键字先前从未检索过则在文档文本中进行该关键字的首次检索并保存相应的检索结论信息;
所述哈希函数为C=Hash(U1,U2,U3……Uk),式中C为大于等于0且小于65536的整数,k表示该检索关键字构成中的字符总数,U1、U2、U3……Uk为该检索关键字依次构成中各字符表示的二进制Unicode编码中的低16位所对应的数值。
优选地:
所述若该关键字先前曾成功地检索过则返回其首次检索成功时所保存的检索结论信息,其判断及返回方法是,设置一个当前指针并初始化取值为Index_1[C],即指向关键字索引表一内的一个线性链表的头结点,依次读取该线性链表中当前指针所指结点内P域指针在文档文本内指示字符位置起始且与检索关键字等长的一个字串,若所读取的一个字串与检索关键字匹配,则返回检索关键字在文档文本中出现的当前一处位置,即当前指针所指示结点内的P指针域数值,否则当前指针位置后移,直至读完链表中的最后一个结点,以返回检索关键字在文档文本中出现的所有位置;
所述若该关键字先前曾失败地检索过则返回其首次检索失败时所保存的检索结论信息,其判断及返回方法是,设置一个当前指针并初始化取值为Index_2[C],即指向关键字索引表二内的一个线性链表的头结点,依次读取该线性链表中当前指针所指结点内S域所保存的一个字串,直至读完链表中的最后一个结点,若所读取的一个字串与检索关键字一旦匹配,则返回检索关键字在文档文本中不存在的检索失败信息;
所述若该关键字先前从未检索过则在文档文本中进行该关键字的首次检索并保存相应的检索结论信息,其判断及操作方法是,设置一个当前指针并初始化取值为文档文本中的首字符位置,在文档文本内依次读取由当前指针所指示字符开始且与检索关键字等长的一个字串,若所读取的一个字串与检索关键字匹配,则记录检索关键字在文档文本中出现的当前一处位置,即当前指针的数值,并在数组元素Index_1[C]所指示的一条线性链表内插入一个新结点,且该新结点内的P指针域赋值为当前指针的数值,否则当前指针位置后移一个字符并重新进行上述判断及操作过程,直至文档文本的尾部位置,以在关键字索引表一中保存检索关键字在文档文本中出现的所有位置,若直至文档文本的尾部位置所读取的每一字串与检索关键字均不匹配,则在数组元素Index_2[C]所指示的一条线性链表内插入一个新结点,且该新结点内的S字串域赋值为检索关键字。
优选地,所述哈希函数C=Hash(U1,U2,U3……Uk)=U1+U2+U3+……+Uk,并且当计算所产生的和值大于或等于2^16时,则C调整取值为所述和值的二进制数值表示中低16位数所对应的数值。
优选地,所述哈希函数C=Hash(U1,U2,U3……Uk)=|U1-U2-U3-……-Uk|,或者C=Hash(U1,U2,U3……Uk)=|Uk-Uk-1-Uk-2-……-U1|,并且当计算所产生的绝对值大于或等于2^16时,则C调整取值为所述绝对值的二进制数值表示中低16位数所对应的数值。
优选地,所述在数组元素Index_1[C]所指示的一条线性链表内插入一个新结点,其插入方法是,首先新创建一个结点,然后将该新创建结点中的N指针域取值为数组元素Index_1[C]的数值,最后将数组元素Index_1[C]的数值更新为该新创建结点在创建时所生成的自身保存位置的指针值。
优选地,所述在数组元素Index_1[C]所指示的一条线性链表内插入一个新结点,其插入方法是,首先新创建一个结点,然后将该新创建结点中的N指针域取值为NULL,依次读取Index_1[C]所指示链表中的各结点直至其尾结点,最后将尾结点的N指针域数值更新为该新创建结点在创建时所生成的自身保存位置的指针值。
优选地,所述在数组元素Index_2[C]所指示的一条线性链表内插入一个新结点,其插入方法是,首先新创建一个结点,然后将该新创建结点中的N指针域取值为数组元素Index_2[C]的数值,最后将数组元素Index_2[C]的数值更新为该新创建结点在创建时所生成的自身保存位置的指针值。
优选地,在所述步骤S2中,还包括字符编码转换的子步骤:在获取用户输入的检索关键字之后、利用哈希函数计算该检索关键字的码值C之前,将所述用户输入的检索关键字中所涉各字符的编码,由其他非Unicode形式的编码转化为Unicode形式的编码即所述的U1、U2、U3……Uk。
第二方面,本发明提供了一种基于动态索引表的全文检索装置,查找检索关键字在文档文本中的所有出现位置并向用户返回查找结果,所述装置包括:
模块M1、用于:在计算机存储器中设置两个关键字索引表,即关键字索引表一和关键字索引表二,所述两个关键字索引表均采用链表数组的存储结构,分别记为Index_1[]和Index_2[],它们的下标编址范围均为0~65535,两个链表数组Index_1[]和Index_2[]中的每一个数组元素均对应存储一个线性链表的头指针,其中Index_1[]中数组元素所指示线性链表内的各结点均包括用于存储检索关键字在所述文档文本中一处出现位置的指针P和用于存储当前结点之直接后继结点存储位置的指针N这两个域,Index_2[]中数组元素所指示线性链表内的各结点均包括用于存储检索关键字的字串S和用于存储当前结点之直接后继结点存储位置的指针N这两个域,两个链表数组Index_1[]和Index_2[]中的每一个数组元素均初始化取值为NULL;然后,
模块M2、用于:在获取用户输入的检索关键字之后,首先判断该关键字先前是否在文档文本中曾经检索过,即利用哈希函数计算该关键字的码值C,通过读取数组元素Index_1[C]所指示的一条线性链表中的各结点数据判断该关键字先前是否曾经检索过且检索结果为成功,通过读取数组元素Index_2[C]所指示的一条线性链表中的各结点数据判断该关键字先前是否曾经检索过且检索结果为失败,若既未成功地检索过也未失败地检索过则视为该关键字先前在文档文本中从未检索过;
若该关键字先前曾成功地检索过则返回其首次检索成功时所保存的检索结论信息,若该关键字先前曾失败地检索过则返回其首次检索失败时所保存的检索结论信息,若该关键字先前从未检索过则在文档文本中进行该关键字的首次检索并保存相应的检索结论信息;
所述哈希函数为C=Hash(U1,U2,U3……Uk),式中C为大于等于0且小于65536的整数,k表示该检索关键字构成中的字符总数,U1、U2、U3……Uk为该检索关键字依次构成中各字符表示的二进制Unicode编码中的低16位所对应的数值。
优选地,在所述模块M2中,还包括字符编码转换的子模块,用于:在获取用户输入的检索关键字之后、利用哈希函数计算该检索关键字的码值C之前,将所述用户输入的检索关键字中所涉各字符的编码,由其他非Unicode形式的编码转化为Unicode形式的编码即所述的U1、U2、U3……Uk。
本发明的技术方案所产生的有益效果,如下所述:
在基于文本的全文检索的技术方案设计中,其关键点在于对文档文本的索引方式,即如何将源文档中所有基本元素的检索信息以适当的形式记录到索引库中,这是影响检索效率的一个重要因素。在现有技术的全文检索技术中,尽管有时也会建立索引数据表,但该索引表往往是对关键字进行分类或排序,通过缩小检索范围的方法提高检索效率,而在缩小了的文本检索范围内,通常仍然使用将用户输入的检索关键字在计算机保存中的内码与文档文本字串的计算机保存内码进行逐一对比,因此,即使缩小了文本检索的范围,其算法的时间复杂度改善也较有限。而在本发明中,为提升用户关键字的检索效率,利用关键字所涉字符自身在计算机存储中所使用的机内编码信息,并以哈希函数规则将检索关键字映射到所创建的两个关键字索引表中的相应位置,并借助这种映射关系实现检索成功或失败结论的快速得出,即无论最终的检索结论是检索成功还是检索失败,均能够通过少量次数的数据匹配过程即可得出该相应的检索结论,从而摆脱了目前在文档文本的全文或分块中逐一字串地进行关键字匹配的冗长过程,因此,相对于现有技术,本发明技术方案的检索效率有所提高。
本方案通过设置两个关键字索引表,将其作为经成功检索或失败检索后所创建的一种“预检索结果”的信息保存载体,同时借用检索关键字Unicode编码信息的哈希函数值对两个关键字索引表进行编址和寻址,从而优化了检索成功和失败两种情形下的数据匹配计算的时间成本,这特别适合于用户关键字检索请求特别频繁且检索响应要求快速的应用场景。尤其是当用户请求检索的关键字趋于相同或相对集中时,在后提交的用户请求的关键字相对于同一用户或其他用户先前所提交的检索关键字相同的命中率较高,本发明对于检索效率的综合提升效果将更加明显。
附图说明
图1是本发明方法的总框图;
图2是本发明装置的总框图;
图3是关键字索引表一使用的链表数组的存储结构示意图;
图4是关键字索引表二使用的链表数组的存储结构示意图;
图5是关键字索引表一使用的线性链表及其结点的存储结构示意图;
图6是关键字索引表二使用的线性链表及其结点的存储结构示意图;
图7是两个关键字索引表相同的初始化数据设置状态示意图;
图8是作为举例的一个文档文本的示意图;
图9是作为举例的两个关键字索引表经检索操作之前的数据记录状态;
图10是作为举例的两个关键字索引表经检索操作之后的数据记录状态;
图11是本发明方法中所述步骤S2的一级工作流程图;
图12是本发明方法中所述步骤S2的二级工作流程图实施例之一;
图13是本发明方法中所述步骤S2的二级工作流程图实施例之二;
图14是本发明方法中所述步骤S2的三级工作流程图;
图15是本发明方法中所述步骤S2的四级工作流程图的起始部分;
图16是图15中断点A之后的工作流程部分;
图17是图16中断点B之后的工作流程部分。
具体实施方式
为能更清楚地说明本发明技术方案的特点,下面通过具体实施方式,并结合附图,对本发明作进一步的详细阐述。
本发明所涉的全文检索,是指以电子文档中的全部文本信息作为检索对象的一种关键字检索。按照检索的对象来区分,全文检索通常可分为基于文本的全文检索和基于Web的全文检索这两种类型,本发明所涉的全文检索,只是针对于前一种类型的检索。
在各种语言文档中的全文检索中,所检索的基本元素可以是单个字符,也可以是连续的多个字符即字串。在本发明中,将约定部分术语的具体含义如下:用户在电子文档中检索单个字符或连续字串时所使用的关键字称为检索关键字,即用户所实际输入并传输给本发明具体实施方案的检索关键字,在有些教材和文献中也称为检索关键词;作为用户关键字检索范围的目标或对象,则是电子文档的整个文本,简称为文档文本,其中的每个单字或字串,均可用文件指针表示其在整个文档文本中的保存位置,特定的单字或字串在文档文本中的存在与否将直接决定针对其检索的结论是成功还是失败;在本发明中将根据用户先前曾使用过的检索关键字的历史记录构建两个关键字索引表,它们是对应记录成功检索情形的关键字索引表一和记录失败检索情形的关键字索引表二,并借助这两个关键字索引表快速实现检索关键字在文档文本中的查找过程以及查找结论的得出;本申请文件中称谓的结点(node),在某些教材和文献中也称为节点。
对于本技术领域的普通技术人员而言,可视具体情况理解有关术语在本申请文件中的具体含义。
如图1所示,本发明提供了一种基于动态索引表的全文检索方法,查找检索关键字在文档文本中的所有出现位置并向用户返回查找结果,所述方法包括:
步骤S1、在计算机存储器中设置两个关键字索引表,即关键字索引表一和关键字索引表二,所述两个关键字索引表均采用链表数组的存储结构,分别记为Index_1[]和Index_2[],它们的下标编址范围均为0~65535,两个链表数组Index_1[]和Index_2[]中的每一个数组元素均对应存储一个线性链表的头指针,其中Index_1[]中数组元素所指示线性链表内的各结点均包括用于存储检索关键字在所述文档文本中一处出现位置的指针P和用于存储当前结点之直接后继结点存储位置的指针N这两个域,Index_2[]中数组元素所指示线性链表内的各结点均包括用于存储检索关键字的字串S和用于存储当前结点之直接后继结点存储位置的指针N这两个域,两个链表数组Index_1[]和Index_2[]中的每一个数组元素均初始化取值为NULL;
步骤S2、在获取用户输入的检索关键字之后,首先判断该关键字先前是否在文档文本中曾经检索过,即利用哈希函数计算该关键字的码值C,通过读取数组元素Index_1[C]所指示的一条线性链表中的各结点数据判断该关键字先前是否曾经检索过且检索结果为成功,通过读取数组元素Index_2[C]所指示的一条线性链表中的各结点数据判断该关键字先前是否曾经检索过且检索结果为失败,若既未成功地检索过也未失败地检索过则视为该关键字先前在文档文本中从未检索过;然后,
若该关键字先前曾成功地检索过则返回其首次检索成功时所保存的检索结论信息,若该关键字先前曾失败地检索过则返回其首次检索失败时所保存的检索结论信息,若该关键字先前从未检索过则在文档文本中进行该关键字的首次检索并保存相应的检索结论信息;
所述哈希函数为C=Hash(U1,U2,U3……Uk),式中C为大于等于0且小于65536的整数,k表示该检索关键字构成中的字符总数,U1、U2、U3……Uk为该检索关键字依次构成中各字符表示的二进制Unicode编码中的低16位所对应的数值。
本发明的上述技术方案,简言之,即:为快速获取用户所输入关键字的检索结果而设置了两个起辅助功能的关键字索引表,即关键字索引表一和关键字索引表二,通过跟踪记录该关键字先前曾检索成功或检索失败的历史记录,将首次检索成功时所获取的该关键字在文档文本中各出现位置的信息记录于关键字索引表一,将首次检索失败时所产生的该关键字在文档文本中不存在的信息记录于关键字索引表二,在用户对文档文本进行关键字检索的日常操作中,动态并结构化地逐步搭建上述两个关键字索引表中的数据,以便为日后对同一关键字再次检索时快速获取检索结论创造便利;在关键字索引表一和关键字索引表二的数据创建时,其数组元素的存储编址以及读取寻址,均由用户检索历史中各关键字自身所天然携带的字符编码信息即Unicode编码及哈希函数运算直接产生,并将关键字索引表一中相应位置保存的地址指针直接读取文档文本中的一个字串,或者将关键字索引表二中相应位置保存的一个字串,与用户关键字作进一步的精准对比,以最终确认对关键字的检索结论;在文档文本中先前曾经检索过相同关键字的情况下,对两个关键字索引表中数组元素的读写、对文档文本中指定位置字串的直接数据读取以及对两个关键字索引表的线性链表中有限个数结点的数据读写,决定了本发明技术方案检索效率的整体提升。总之,两个关键字索引表数据存储结构的设置、两个关键字索引表的编址与寻址方式以及由两个关键字索引表辅助实现的关键字检索判断方法,构成了本发明技术方案的要点。
本发明技术方案的思路在于:针对同一检索关键字,利用其首次在文档文本中检索成功或失败的信息,作为其日后被再次检索时快速获取检索结论创造数据库,并由同一用户或不同用户后续更多输入的不同的检索关键字,对该数据库日趋丰富,从而进一步提高再后续输入检索关键字的命中率并进一步提高检索效率。将用户每一次检索时所使用的检索关键字均视为之后由本人或他人再次检索时所潜在使用的检索关键字,对于一个首次被检索关键字而言,无论其检索结果是成功还是失败,都会其检索的结果信息对应保存到两个关键字索引表的其中之一,经过持续的数据积累,两个关键字索引表中最终保存的将是针对同一文档文本所有用户共同输入的不同检索关键字的集合,其中,关键字索引表一对应存储的是检索成功时当前关键字在文档文本中出现位置的所有地址指针,并利用当前检索关键字的Unicode编码信息数值进行编址,关键字索引表二对应存储的是检索失败时当前关键字的字串本身,并同样是利用当前检索关键字的Unicode编码信息数值进行编址。在执行关键字的检索时,由检索关键字Unicode编码数据经哈希函数运算所映射的地址,读取关键字索引表一中相应的一条链表,在该链表非空的情况下再继续索读取其中的所有结点中的P指针域,并将P指针域所指示的所有文档文本字串与用户关键字进行对比,对比一致则表明先前曾检索过同一关键字且本次检索成功,此时返回当前的P指针数值作为检索关键字在文档文本中的一个出现位置;在关键字索引表一中所读取的一条链表为空或者字串对比不一致的情况下,则读取关键字索引表二中相应的一条链表,在该链表非空的情况下再继续索读取其中的所有结点中的S字串域,并将S字串域所保存的所有字串与用户关键字进行对比,若其中之一与用户关键字对比一致则表明先前曾检索过同一关键字且检索失败,这也作为本次检索失败的结论;在先前未检索过同一关键字的情形下则需对关键字进行首次检索,并对检索成功或失败的结果信息对应地写入关键字索引表一或关键字索引表二,作为对两个关键字索引表的数据丰富并用于日后相同关键字的检索提供依据。
两个关键字索引表的数据创建与用户的关键字检索是交叉进行、相互依赖的过程。其中两个索引表创建所基于的数据是用户的关键字检索记录,并且有对应于检索成功和检索失败的存储进行分工处理,换言之,两个关键字索引表中的数据均是对用户所输入关键字检索过程中动态积累且不断丰富的。
在本发明中,总是将哈希函数计算产生的检索关键字的码值作为两个关键字索引表的链表数组的下标访问地址。当需判断检索关键字先前是否成功检索过时,读取关键字索引表一即链表数组Index_1[]中相应位置的一个数组元素,若其值为NULL(空),即可立即得出先前未曾成功检索过的结论;在其值非NULL的情况下,也只需在检索关键字与非空的线性链表中各结点所指示的文档文本内各处位置的字串之间,经少量次数的匹配运算,即可精准地得出当前的检索关键字在文档文本中先前是否曾成功检索过的确切结论,若是则直接返回先前记录的检索关键字在文档文本中的各处出现位置以及本次检索成功的信息。当需判断检索关键字先前是否失败检索过时,读取关键字索引表二即链表数组Index_2[]中相应位置的一个数组元素,若其值为NULL,即可立即得出先前未曾失败检索过的结论;在其值非NULL的情况下,也只需在检索关键字与非空的线性链表中各结点所保存的字串之间,经少量次数的匹配运算,即可精准地得出当前的检索关键字在文档文本中先前是否曾失败检索过的确切结论,若是则直接返回先前记录的检索关键字在文档文本中不存在的检索失败信息。只有在通过两个关键字索引表均匹配失败的情况下,方才对文档文件执行逐一字符串地匹配运算过程并将该匹配运算的最终结果相应地写入关键字索引表一或关键字索引表二。总之,在文档文本中先前曾检索过用户输入的检索关键字的情况下,无论其曾经的检索结果是成功还是失败,本发明均可快速返回本次检索的结论信息,并且随着日后更多检索关键字的使用以及两个关键字索引表的数据丰富,尤其是在用户输入的检索关键字趋于集中的情况下,本发明方法的整体检索效率会有较大提升。
针对两个关键字索引表即链表数组Index_1[]和Index_2[]的存储结构及其初始化数据设置状态,具体说明如下:
如图3和图4所示,关键字索引表一和关键字索引表二采用链表数组的存储结构,故这两个关键字索引表可分别表示为链表数组Index_1[]和Index_2[],两个关键字索引表内的数组元素均用于保存各线性链表中头结点位置的指针数据。
如图5所示,在关键字索引表一内,各线性链表中的每一结点至少包括两个域,即P指针域和N指针域,其中:所有结点的P指针域保存了关键字首次成功检索时所记录的信息,即文档文本中各种检索关键字在文档文本中的各自出现位置,而同一链表中所有结点的P指针域保存的是具有同一码值C的所有相同或不同检索关键字在文档文本中的各自出现位置;在线性链表中由上一结点的N指针域指向本链表中下一直接后继结点的保存位置,每一线性链表中以最后一个结点的N指针域数值为NULL作为链尾标志,链表头结点的保存位置则由链表数组Index_1[]中的数据元素来指示,通过该链表数组Index_1[]中每一数组元素数值所指向的一条线性链表的头结点位置,以及该链表中每一结点的N指针域数值,可依次读取该链表中各结点的P指针域数值。
如图6所示,在关键字索引表二内,各线性链表中的每一结点至少包括两个域,即S字串域和N指针域,其中:所有结点的S字串域保存了关键字首次失败检索时所记录的信息,即用户所输入检索关键字本身的字串构成;在线性链表中由上一结点的N指针域指向本链表中下一直接后继结点的保存位置,每一线性链表中以最后一个结点的N指针域数值为NULL作为链尾标志,链表头结点的保存位置则由链表数组Index_2[]中的数组元素来指示,通过该链表数组Index_2[]中每一数组元素数值所指向的一条线性链表的头结点位置,以及该链表中每一结点的N指针域数值,可依次读取该链表中各结点的S字串域数据。
两个关键字索引表即链表数组Index_1[]和Index_2[]在创建后的初始化数据设置状态,由图7示意,两个关键字索引表内所有数组元素的初始化取值均为NULL,即由该链表数组Index_1[]或Index_2[]所指向的每一个线性链表在初始化设置状态下实际均不存在;而经若干结点数据的创建后,作为举例的两个关键字索引表Index_1[]和Index_2[]的存储状态由图9和图10示意。
为结构化地存储先前检索关键字在检索成功或失败时所记录的结论信息,两个关键字索引表在整体上均采用了一维数组和线性链表的存储方式。之所以采用一维数组的存储结构,是因为由哈希函数所生成的检索关键字的码值C的取值范围0~65535是要求事先确定的,在软件源码的编写时该数组的创建定义也需要确定这个参数;之所以采用线性链表的存储结构,是因为用户输入的检索关键字的具体构成及分布都无法事先预料,而这里可长可短、便于灵活设置的线性链表存储结构更便于数据的创建,在算法的软件实现上也更为容易一些。
根据Unicode编码规范,Unicode最多使用四个字节并利用编码0~0x0010FFFF来映射各种语言文字中的不同字符,在本发明中,无论是计算文档关键字的码值,还是计算用户关键字的码值,其哈希函数中的自变量均采用所涉字符二进制Unicode编码值中的低16位,具体就是,对于双字节存储的字符,直接取其Unicode编码对应的数值作为哈希函数中的自变量,对于三或四字节存储的字符,则取其Unicode编码中的低16位对应的数值作为哈希函数中的自变量。
为实现检索关键字在文档文本中的高效检索过程,在本发明的技术方案中,借助于两个关键字索引表的途径实现检索结果的快速返回,即由用户检索时所使用的关键字,提取其天然携带的编码信息,再通过简单的计算及少量的匹配即可定位其在文档中的出现位置。这里所谓提取其天然携带的编码信息,是指在计算机文档系统中,文本字符是以机内码的形式进行文档存储和信息交换的,对于给定的文档文本字串或用户关键字,自然便获取了其构成中每一个字符的机内码信息,例如字符的Unicode编码。将用户关键字构成中各字符的Unicode编码值,通过简单的Hash函数运算,生成一个对应的码值C,再在码值C与关键字索引表数组Index_1[]及Index_2[]的下标地址之间建立一一对应的映射关系,实现由用户关键字到两个关键字索引表的直接寻址方式。虽然线性链表采用的是从头结点开始逐个结点依次读取数据的方法,但由于文档关键字被随机且相对均匀地映射在关键字索引表内的2^16条线性链表上,在获取一个链表数组元素所指向的一条线性链表之后,在该链表上读取所有结点所消耗的时间复杂度通常会远小于读取整个文档文本所消耗的时间复杂度。
在两个关键字索引表的初始化设置中,关键字索引表一中链表数组Index_1[]及关键字索引表二中链表数组Index_2[]的下标编址位数均为16,故其编址空间大小、即数组中所包含的数组元素的数量、也即线性链表的总数为2^16(=64K=65536),保存这些链表头结点指针的数组元素的下标编址范围为0~(2^16-1),或者0~65535;另一方面,检索关键字的码值C的取值范围也是0~65535内的整数,这便为检索关键字在两个关键字索引表数组Index_1[]和Index_2[]中的数组元素访问创造了可能。
由两个关键字索引表记录的首次检索使用的关键字,实际上都可以理解为用户日后再次使用的一种潜在的检索关键字,通过陆续创建每一个首次使用的检索关键字在文档文本中的检索结论,以及后续检索中对检索关键字的预先对比以及预保存检索成功或检索失败的保存信息的快速访问,尽量避免对同一关键字重复执行的漫长检索过程,从而实现快速获取用户关键字检索结果的发明目的。
对文档文本中各指定字串的读取,是通过文件对象来完成的,对于文档文本读取时的定位,即本说明书中所涉及的字串在文档文本中的定位问题,计算机编程语言中通常提供tell()、seek()等之类的方法(或过程、函数等),并利用表示文件当前读位置的读指针,实现对文档文本中指定位置、指定长度的一个字串的读取。为表达方便,在本说明书及其附图中,对于关键字索引表一,使用“P("跟踪",1)”的形式来表示关键字“跟踪”在文档文本中第1处出现位置的指针,并以此类推;对于关键字索引表二,使用“S("专利")”的形式来表示文档文本中不存在的关键字“专利”,并以此类推。
需要说明的是,尽管检索关键字的码值C与两个关键字索引表即链表数组Index_1[]和Index_2[]的下标数值之间是一一对应的映射关系,但检索关键字本身与这两个链表数组的下标地址之间并非一一对应关系,换言之,字符构成或字符数量不同的两个检索关键字经哈希函数运算后所各自产生的码值C有可能是相同的,此时它们在文档文本中出现位置的指针数据将保存在Index_1[]内同一链表的不同结点中,或者曾检索失败的两个不同的检索关键字的字串将保存在Index_2[]内同一链表的不同结点中;另外,对于同一检索关键字在文档文本中反复出现的多处位置,也会保存在Index_1[]内同一链表的不同结点中。总之,在Index_1[]中同一链表内不同结点保存的是对应于相同或不同字串在文档文本中的不同出现位置的指针,其中一个结点保存的是一个字串在文档文本中的一处出现位置,这些相同或不同的字串可谓是同位关系;Index_2[]中同一链表内不同结点保存的则是不同的检索关键字本身,它们先前均曾被失败检索过且其具有相同的码值,这些不同的字串也可谓是同位关系。
关键字索引表一Index_1[]中同一线性链表内保存的是具有相同码值C的不同关键字以及同一关键字在文档文本中出现的多处位置,关键字索引表二Index_2[]中同一线性链表内保存的则是具有相同码值C的不同关键字本身,因此,检索关键字经哈希函数规则计算产生其对应的一个码值C后,由数组元素Index_1[C]所指向的一条链表即使非空,其内所有结点的P指针域数值,也未必都是当前检索关键字在文档文本中的出现位置,甚至无一是当前用户关键字在文档文本中的出现位置,同样地,Index_2[C]所指向一条链表即使非空,其内结点S字串域所保存的字串也未必就是当前的检索关键字。由此可见,由Index_1[C]所指示链表内所有结点的P指针域数值只能算是该检索关键字在文档文本中出现的各处疑似位置,由Index_2[C]所指示链表内所有结点的S字串域数据也只能算是各种疑似的检索关键字,对检索关键字码值进行的Hash函数计算其码值C以及查询Index_1[C]或Index_2[C]数值的寻址过程,也只能算是一种模糊检索的过程,还需将每一疑似位置的文档文本字串或疑似的检索关键字与当前检索所使用的关键字作精准的匹配运算后,方能得出先前是否曾检索过同一检索关键字。上述疑似位置和模糊检索的意义,便在于其大大缩小了用户关键字与文档文本之间进行字串匹配的工作量。在模糊检索成功的条件下,只需经少量次数的精准匹配过程便能得出先前是否曾成功检索过或失败检索过的确切结论,而无需经历对整个文档文本逐一字串对比的漫长匹配过程。
相对于文档文本的字符数量规模而言,模糊检索和精准匹配这两个过程均大大缩小了运算工作量,从而提高了用户关键字的检索效率,当然这种时间的节省是以预先创建的两个关键字索引表为空间存储代价的,即以存储空间的成本换取效率上的有益效果。本发明以空间换时间的发明思想,也正是适用于文档文本字符数量规模较大、用户检索请求频繁或用户检索任务繁重且检索关键字趋于相同的应用场景。
作为优选实施例:
所述若该关键字先前曾成功地检索过则返回其首次检索成功时所保存的检索结论信息,其判断及返回方法是,设置一个当前指针并初始化取值为Index_1[C],即指向关键字索引表一内的一个线性链表的头结点,依次读取该线性链表中当前指针所指结点内P域指针在文档文本内指示字符位置起始且与检索关键字等长的一个字串,若所读取的一个字串与检索关键字匹配,则返回检索关键字在文档文本中出现的当前一处位置,即当前指针所指示结点内的P指针域数值,否则当前指针位置后移,直至读完链表中的最后一个结点,以返回检索关键字在文档文本中出现的所有位置;
所述若该关键字先前曾失败地检索过则返回其首次检索失败时所保存的检索结论信息,其判断及返回方法是,设置一个当前指针并初始化取值为Index_2[C],即指向关键字索引表二内的一个线性链表的头结点,依次读取该线性链表中当前指针所指结点内S域所保存的一个字串,直至读完链表中的最后一个结点,若所读取的一个字串与检索关键字一旦匹配,则返回检索关键字在文档文本中不存在的检索失败信息;
所述若该关键字先前从未检索过则在文档文本中进行该关键字的首次检索并保存相应的检索结论信息,其判断及操作方法是,设置一个当前指针并初始化取值为文档文本中的首字符位置,在文档文本内依次读取由当前指针所指示字符开始且与检索关键字等长的一个字串,若所读取的一个字串与检索关键字匹配,则记录检索关键字在文档文本中出现的当前一处位置,即当前指针的数值,并在数组元素Index_1[C]所指示的一条线性链表内插入一个新结点,且该新结点内的P指针域赋值为当前指针的数值,否则当前指针位置后移一个字符并重新进行上述判断及操作过程,直至文档文本的尾部位置,以在关键字索引表一中保存检索关键字在文档文本中出现的所有位置,若直至文档文本的尾部位置所读取的每一字串与检索关键字均不匹配,则在数组元素Index_2[C]所指示的一条线性链表内插入一个新结点,且该新结点内的S字串域赋值为检索关键字。
作为优选实施例,所述哈希函数C=Hash(U1,U2,U3……Uk)=U1+U2+U3+……+Uk,并且当计算所产生的和值大于或等于2^16时,则C调整取值为所述和值的二进制数值表示中低16位数所对应的数值。
在该优选实施例中,由所涉字符各自对应的Unicode编码值作加法运算,其计算方法较为简单,执行效率也较高,占用的计算资源较少。
在上述加法运算中,U1、U2、U3……Uk在计算机内均为16位二进制数据,当上述函数运算结果的和值产生高位溢出即其和值大于或等于2^16时,则应舍弃溢出的高位而仅保留两个低字节中的16位二进制数,表现为十进制的数值便是作为最终哈希函数计算结果的码值C总会小于2^16,否则在访问数组元素Index_1[C]或Index_2[C]时会出现数组读写越界的问题。总之,舍弃溢出的高位,其目的在于保证码值C被限定在0~(2^16-1)数据取值范围之内,以匹配与链表数组Index_1[C]和Index_2[C]的下标取值范围。
另外,取两个低字节而不是高字节数据作为最终的码值C的运算结果,还有一个原因就是,经过加法运算后的两个低字节数据中的数据,其码值分布更具有随机性和均匀性,其离散度性能较佳。
发明人尝试以当今各主流中文输入法中所默认及扩展定义的字词输入单元库作为测试对象,并按照该优选实施例中所采用的加法运算,对各输入法字词库汇总并经剔除重复数据后共计223678条互不重复的字词进行哈希函数码值的计算和统计,发现其码值相同的一组字词的最大个数为21。因此,尽管线性链表采用顺序依次读取结点数据的算法,在由最多21个结点构成的线性链表中逐一结点的数据读取过程所产生的时间复杂度毕竟是可控的,相对于在整个文档文本中逐一、反复进行字符对比的传统关键字检索方法而言。
针对上述21个码值重复的一组字词,其字词构成中各字符Unicode编码数值以及整个字词码值C的计算过程及计算数值,不妨部分地罗列如下:(均以十进制数值表示)
烂漫:28866+28459=57325;
荒岛:33618+23707=57325;
跳出:36339+20986=57325;
听证:21548+35777=57325;
资助:36164+21161=57325;
白跑一趟:30333+36305+19968+36255=122861,122861-65536=57325;
贫穷落后:36139+31351+33853+21518=122861,122861-65536=57325;
……
下面结合附图,通过具体例子,详细说明关键字索引表一Index_1[]和关键字索引表二Index_2[]的创建过程:
图8给出了文档文本的一个具体例子,假设在该文档文本中,先前曾检索过关键字“跟踪”并成功地查找到了“跟踪”的一处出现位置,先前也曾检索过关键字“专利”但检索失败,在此情形下,两个关键字索引表的数据记录状态如图9所示。
下面再结合图10,通过四个例子说明关键字在文档文本中的检索和判断过程。
作为举例之一,假设目前要检索的关键字为“跟踪”,首先,在读取用户输入的“跟踪”这一关键字时,由其字符的计算机保存内码,获取两个字符各自对应的Unicode编码,这里不妨用二进制、十六进制、十进制分别表示为:
跟~1000110111011111(Bin)/8ddf(Hex)/36319(Dec),
踪~1000111000101010(Bin)/8e2a(Hex)/36394(Dec);
然后,根据上面采用加法的哈希规则,两数相加得其和值为:
10001110000001001(Bin)/11c09(Hex)/72713(Dec);
由于在上面的和值计算中产生了超出两个字节长度的高位溢出,故在将溢出的高位舍弃而仅保留两个低字节后,检索关键字“跟踪”的码值C最终取值为:
0001110000001001(Bin)/1c09(Hex)/7177(Dec)。
参照图9,在数组元素Index_1[7177]所指示的一条线性链表中,逐个读取其中各结点的P指针数据,并将P指针在文档文本中所指示的一个字串逐个地与检索关键字进行对比,由于图例中该线性链表内的结点数量唯一并且字串与检索关键字对比一致,此时可直接返回检索关键字“跟踪”在文档文本中的出现位置P("跟踪",1)。
作为举例之二,假设目前要检索的关键字为“专利”,根据哈希函数计算“专利”的码值C为41020,于是读取数组元素Index_1[41020],若其值为NULL,或者尽管其值非NULL但其所指示的一条线性链表中所有结点内P指针在文档文本内所指首字符位置起始且与检索关键字等长的各字串与检索关键字对比均不一致(为了简化,图9及图10中并未标出Index_1[41020]的这种数值存储情况),则表明先前未曾成功检索过“专利”;接着再读取数组元素Index_2[41020]所指示一条线性链表中的所有结点,其中一个结点中保存的S字串域数据与检索关键字“专利”对比一致,这表明先前曾失败检索过“专利”,最终便返回“专利”在文档文本中不存在的检索失败信息。
作为举例之三,假设目前要检索的关键字为“业务系统”,根据哈希函数计算“业务系统”的码值C为40085,于是读取数组元素Index_1[40085],其值为NULL,表明先前未曾成功检索过“业务系统”;接着再读取数组元素Index_2[40085],若其值为NULL,或者尽管其值非NULL但其所指示的一条线性链表中所有结点内S域所保存的字串与检索关键字对比均不一致(为了简化,图9及图10中并未标出Index_2[40085]的这种数值存储情况),则表明先前也未曾失败检索过“业务系统”;此时在文档文本中检索“业务系统”并发现其两处出现位置P("业务系统",1)和P("业务系统",2),最终除了返回这两处出现位置和检索成功的信息之外,还要创建两个结点分别保存这两处出现位置的指针数值,并将之插入到Index_1[40085]所指示的一条线性链表中,如图10所示。
作为举例之四,假设目前要检索的关键字为“知识产权”,根据哈希函数计算“知识产权”的码值C为47509,读取数组元素Index_1[47509]和Index_2[47509],其值均为NULL(为了简化,图9及图10中并未标出Index_1[47509]的这种数值存储情况),表明先前从未检索过“知识产权”;此时在文档文本中检索“知识产权”但检索失败,最终除了返回该关键字在文档文本中不存在的检索失败信息之外,还要创建一个结点用于保存该关键字的字串本身,并将之插入到Index_2[47509]所指示的一条线性链表中,如图10所示。此时如果再接着检索关键字“后文”,由于该关键字在文档文本中不存在,需将之插入到关键字索引表二中,因“后文”经哈希函数计算后的码值为47509,故需将之插入到Index_2[47509]所指示的一条链表中,即“知识产权”与“后文”的检索失败信息保存在同一条链表中。
作为优选实施例,所述哈希函数C=Hash(U1,U2,U3……Uk)=|U1-U2-U3-……-Uk|,或者C=Hash(U1,U2,U3……Uk)=|Uk-Uk-1-Uk-2-……-U1|,并且当计算所产生的绝对值大于或等于2^16时,则C调整取值为所述绝对值的二进制数值表示中低16位数所对应的数值。
在该优选实施例中,采用减法运算规则的方案思路与前面的加法运算一样,都是因为相对于其他运算规则而言,这两种运算所产生的结果在0~65535的码值资源中分布得更均匀,这会使两个关键字索引表的编址空间均得到充分利用,即尽可能地在两个关键字索引表内,通过增加线性链表的条数而使得各条线性链表的长度趋于最短化,以减少一条链表在结点数据的顺序读取时所消耗的平均时间。
和值的计算结果或者差值的绝对值的计算结果在0~65535范围内码值分配较为均匀的原因在于,尽管Unicode编码在整体上存在中断、空缺现象,但不同字符的Unicode编码在局部上是线性连续的,更不存在重码问题,若干字符的Unicode编码经加减运算后的数值依然会保留线性特征,尤其是在加减运算结果产生高位溢出时仅保留两个低字节数据的规则下,原中断、空缺的编码资源可能会被随机性地占用,使得0~65535范围的整个编码资源都能得到充分利用。
作为优选实施例,所述在数组元素Index_1[C]所指示的一条线性链表内插入一个新结点,其插入方法是,首先新创建一个结点,然后将该新创建结点中的N指针域取值为数组元素Index_1[C]的数值,最后将数组元素Index_1[C]的数值更新为该新创建结点在创建时所生成的自身保存位置的指针值。
在该优选实施例中,当关键字索引表一需要补充数据时,将新创建的链表结点插入线性链表的头部位置,使之成为新的头结点,这会提高关键字索引表在结点插入时的执行效率。根据线性链表顺序读取结点数据的特点,如果每一个新结点在创建后都被插入在线性链表的尾部位置,则每次都需从链表的头结点指针开始,依次读完链表中每一结点内的N指针域数值之后才能找到要插入的链尾位置。反之,若将每个新创建的结点都插入链表的头部位置,则可免除上述依次读取链表内所有结点的耗时过程。
作为优选实施例,所述在数组元素Index_1[C]所指示的一条线性链表内插入一个新结点,其插入方法是,首先新创建一个结点,然后将该新创建结点中的N指针域取值为NULL,依次读取Index_1[C]所指示链表中的各结点直至其尾结点,最后将尾结点的N指针域数值更新为该新创建结点在创建时所生成的自身保存位置的指针值。
在该优选实施例中,当关键字索引表一需要补充数据时,将新创建的链表结点插入线性链表的尾部位置,将能保证关键字检索成功时所先后返回的其在文档文本中各出现位置的顺序,与该关键字在文档中出现的先后顺序是保持一致的,以满足某种特定要求,例如用户可能会要求关键字检索操作的返回结果,必须是按照该关键字在文档文本中出现的先后顺序进行排列。
作为优选实施例,所述在数组元素Index_2[C]所指示的一条线性链表内插入一个新结点,其插入方法是,首先新创建一个结点,然后将该新创建结点中的N指针域取值为数组元素Index_2[C]的数值,最后将数组元素Index_2[C]的数值更新为该新创建结点在创建时所生成的自身保存位置的指针值。
在该优选实施例中,当关键字索引表二需要补充数据时,将新创建的链表结点插入线性链表的头部位置,使之成为新的头结点,同样是出于提高关键字索引表在结点插入时执行效率的考虑,并且,对于保存失败检索时所使用关键字的关键字索引表二而言,将新创建结点插入链表的其他位置除了会增加该结点插入时所消耗的时间之外,对于失败检索时各关键字在关键字索引表二的线性链表内的排列顺序所导致的结点读取顺序通常并没有什么意义。
作为优选实施例,在所述步骤S2中,还包括字符编码转换的子步骤:在获取用户输入的检索关键字之后、利用哈希函数计算该检索关键字的码值C之前,将所述用户输入的检索关键字中所涉各字符的编码,由其他非Unicode形式的编码转化为Unicode形式的编码即所述的U1、U2、U3……Uk。
在本发明的技术方案中,哈希函数运算所基于的字符编码采用Unicode编码方案。Unicode作为一种字符编码标准,它包括了世界上几乎所有语言中的字母、数字、标点符号和特殊符号,目前已经成为全球广泛使用的字符集和编码方案之一,尤其是在文字处理、文档保存领域,该字符编码支持多语言环境,字符编码的统一化标准等也使得数据传输过程中不会因为字符集的不同而导致无法识别或者乱码等问题。
由用户输入并待执行检索的关键字如果采用的是Unicode标准的字符编码方案,则在创建两个关键字索引表时自然可以直接根据检索关键字构成中各字符的Unicode编码值进行哈希运算,但是对于检索关键字未采用Unicode编码格式进行字符数据传送的情况下,则需考虑本发明技术方案的适用性问题,尽管Unicode字符编码格式在文档保存和传输中具有普遍性和趋势性。非Unicode标准的字符编码方案,就中文字符而言,常见的有GB2312、GBK、GB18030等标准。
在该优选实施例中,针对的就是由于接口原因,本发明技术方案所接收到的并由用户所输入的检索关键字采用非Unicode编码标准的特殊情况,此时在创建关键字索引表一和关键字索引表二中的各结点数据时时,对于每次获取的检索关键字,均需额外地生成这些关键字中各字符的Unicode编码值,然后才进行相应哈希函数规则的码值计算,幸运的是,目前绝大多数的软件开发语言都提供了该字符编码形式转换的功能函数。
如图2所示,本发明提供了一种基于动态索引表的全文检索装置,查找检索关键字在文档文本中的所有出现位置并向用户返回查找结果,所述装置包括:
模块M1、用于:在计算机存储器中设置两个关键字索引表,即关键字索引表一和关键字索引表二,所述两个关键字索引表均采用链表数组的存储结构,分别记为Index_1[]和Index_2[],它们的下标编址范围均为0~65535,两个链表数组Index_1[]和Index_2[]中的每一个数组元素均对应存储一个线性链表的头指针,其中Index_1[]中数组元素所指示线性链表内的各结点均包括用于存储检索关键字在所述文档文本中一处出现位置的指针P和用于存储当前结点之直接后继结点存储位置的指针N这两个域,Index_2[]中数组元素所指示线性链表内的各结点均包括用于存储检索关键字的字串S和用于存储当前结点之直接后继结点存储位置的指针N这两个域,两个链表数组Index_1[]和Index_2[]中的每一个数组元素均初始化取值为NULL;
模块M2、用于:在获取用户输入的检索关键字之后,首先判断该关键字先前是否在文档文本中曾经检索过,即利用哈希函数计算该关键字的码值C,通过读取数组元素Index_1[C]所指示的一条线性链表中的各结点数据判断该关键字先前是否曾经检索过且检索结果为成功,通过读取数组元素Index_2[C]所指示的一条线性链表中的各结点数据判断该关键字先前是否曾经检索过且检索结果为失败,若既未成功地检索过也未失败地检索过则视为该关键字先前在文档文本中从未检索过;然后,
若该关键字先前曾成功地检索过则返回其首次检索成功时所保存的检索结论信息,若该关键字先前曾失败地检索过则返回其首次检索失败时所保存的检索结论信息,若该关键字先前从未检索过则在文档文本中进行该关键字的首次检索并保存相应的检索结论信息;
所述哈希函数为C=Hash(U1,U2,U3……Uk),式中C为大于等于0且小于65536的整数,k表示该检索关键字构成中的字符总数,U1、U2、U3……Uk为该检索关键字依次构成中各字符表示的二进制Unicode编码中的低16位所对应的数值。
作为优选实施例,在所述模块M2中,还包括字符编码转换的子模块,用于:在获取用户输入的检索关键字之后、利用哈希函数计算该检索关键字的码值C之前,将所述用户输入的检索关键字中所涉各字符的编码,由其他非Unicode形式的编码转化为Unicode形式的编码即所述的U1、U2、U3……Uk。
下面通过流程图,对本发明方法中所述步骤S2的工作过程进行详细说明:
为能更清楚地表述本发明技术方案的具体实施方式,由图11~图17给出了基于两个关键字索引表在文档文本中检索用户输入的关键字的整个工作过程。需要说明的是,上述几个流程图是以四个不同级别,将关键字检索的整个过程由概括到具体、层次化地逐步展现出来的,其中由图11给出的流程图最为概括,由图15、图16和图17共同构成的一个完整流程图最为具体,图12和图13则属于同一级别的等效替换方案,其区别在于检索关键字先前曾成功检索过与检索关键字先前曾失败检索过这两种情形判断顺序的先后上,并且由图14给出的一个流程图以及由图15、图16和图17共同构成的一个流程图均基于图12的判断顺序。
最后需要说明的是,尽管通过具体实施方式对本发明进行了示例性说明,但其不构成对本发明专利保护范围的限制,所属技术领域的技术人员应当理解,对本发明的具体实施例依然可以进行各种等同替换和优化改进,而未脱离本发明精神的任何替换和改进,均应涵盖在本发明的专利保护范围之内。
Claims (8)
1.一种基于动态索引表的全文检索方法,查找检索关键字在文档文本中的所有出现位置并向用户返回查找结果,其特征在于,所述方法包括:
步骤S1,在计算机存储器中设置两个关键字索引表,即关键字索引表一和关键字索引表二,所述两个关键字索引表均采用链表数组的存储结构,分别记为Index_1[]和Index_2[],它们的下标编址范围均为0~65535,两个链表数组Index_1[]和Index_2[]中的每一个数组元素均对应存储一个线性链表的头指针,其中Index_1[]中数组元素所指示线性链表内的各结点均包括用于存储检索关键字在所述文档文本中一处出现位置的指针P和用于存储当前结点之直接后继结点存储位置的指针N这两个域,Index_2[]中数组元素所指示线性链表内的各结点均包括用于存储检索关键字的字串S和用于存储当前结点之直接后继结点存储位置的指针N这两个域,两个链表数组Index_1[]和Index_2[]中的每一个数组元素均初始化取值为NULL;
步骤S2,在获取用户输入的检索关键字之后,首先判断该关键字先前是否在所述文档文本中曾经检索过,即利用哈希函数计算该关键字的码值C,通过读取数组元素Index_1[C]所指示的一条线性链表中的各结点数据判断该关键字先前是否曾经检索过且检索结果为成功,通过读取数组元素Index_2[C]所指示的一条线性链表中的各结点数据判断该关键字先前是否曾经检索过且检索结果为失败,若既未成功地检索过也未失败地检索过则视为该关键字先前在文档文本中从未检索过;然后,
若该关键字先前曾成功地检索过则返回其首次检索成功时所保存的检索结论信息,若该关键字先前曾失败地检索过则返回其首次检索失败时所保存的检索结论信息,若该关键字先前从未检索过则在文档文本中进行该关键字的首次检索并保存相应的检索结论信息;
所述哈希函数为C=Hash(U1,U2,U3……Uk)=U1+U2+U3+……+Uk,或C=Hash(U1,U2,U3……Uk)=|U1-U2-U3-……-Uk|,再或C=Hash(U1,U2,U3……Uk)=|Uk-Uk-1-Uk-2-……-U1|,式中C为大于等于0且小于65536的整数,k表示该检索关键字构成中的字符总数,U1、U2、U3……Uk为该检索关键字依次构成中各字符表示的二进制Unicode编码中的低16位所对应的数值,并且当计算所产生的和值或绝对值大于或等于2^16时,则C调整取值为所述和值或所述绝对值的二进制数值表示中低16位数所对应的数值。
2.根据权利要求1所述的全文检索方法,其特征在于:
所述若该关键字先前曾成功地检索过则返回其首次检索成功时所保存的检索结论信息,其判断及返回方法是,设置一个当前指针并初始化取值为Index_1[C],即指向关键字索引表一内的一个线性链表的头结点,依次读取该线性链表中当前指针所指结点内P域指针在文档文本内指示字符位置起始且与检索关键字等长的一个字串,若所读取的一个字串与检索关键字匹配,则返回检索关键字在文档文本中出现的当前一处位置,即当前指针所指示结点内的P指针域数值,否则当前指针位置后移,直至读完链表中的最后一个结点,以返回检索关键字在文档文本中出现的所有位置;
所述若该关键字先前曾失败地检索过则返回其首次检索失败时所保存的检索结论信息,其判断及返回方法是,设置一个当前指针并初始化取值为Index_2[C],即指向关键字索引表二内的一个线性链表的头结点,依次读取该线性链表中当前指针所指结点内S域所保存的一个字串,直至读完链表中的最后一个结点,若所读取的一个字串与检索关键字一旦匹配,则返回检索关键字在文档文本中不存在的检索失败信息;
所述若该关键字先前从未检索过则在文档文本中进行该关键字的首次检索并保存相应的检索结论信息,其判断及操作方法是,设置一个当前指针并初始化取值为文档文本中的首字符位置,在文档文本内依次读取由当前指针所指示字符开始且与检索关键字等长的一个字串,若所读取的一个字串与检索关键字匹配,则记录检索关键字在文档文本中出现的当前一处位置,即当前指针的数值,并在数组元素Index_1[C]所指示的一条线性链表内插入一个新结点,且该新结点内的P指针域赋值为当前指针的数值,否则当前指针位置后移一个字符并重新进行上述判断及操作过程,直至文档文本的尾部位置,以在关键字索引表一中保存检索关键字在文档文本中出现的所有位置,若直至文档文本的尾部位置所读取的每一字串与检索关键字均不匹配,则在数组元素Index_2[C]所指示的一条线性链表内插入一个新结点,且该新结点内的S字串域赋值为检索关键字。
3.根据权利要求2所述的全文检索方法,其特征在于,所述在数组元素Index_1[C]所指示的一条线性链表内插入一个新结点,其插入方法是,首先新创建一个结点,然后将该新创建结点中的N指针域取值为数组元素Index_1[C]的数值,最后将数组元素Index_1[C]的数值更新为该新创建结点在创建时所生成的自身保存位置的指针值。
4.根据权利要求2所述的全文检索方法,其特征在于,所述在数组元素Index_1[C]所指示的一条线性链表内插入一个新结点,其插入方法是,首先新创建一个结点,然后将该新创建结点中的N指针域取值为NULL,依次读取Index_1[C]所指示链表中的各结点直至其尾结点,最后将尾结点的N指针域数值更新为该新创建结点在创建时所生成的自身保存位置的指针值。
5.根据权利要求2所述的全文检索方法,其特征在于,所述在数组元素Index_2[C]所指示的一条线性链表内插入一个新结点,其插入方法是,首先新创建一个结点,然后将该新创建结点中的N指针域取值为数组元素Index_2[C]的数值,最后将数组元素Index_2[C]的数值更新为该新创建结点在创建时所生成的自身保存位置的指针值。
6.根据权利要求1-5中任意一项所述的全文检索方法,其特征在于,在所述步骤S2中,还包括字符编码转换的子步骤:在获取用户输入的检索关键字之后、利用哈希函数计算该检索关键字的码值C之前,将所述用户输入的检索关键字中所涉各字符的编码,由其他非Unicode形式的编码转化为Unicode形式的编码即所述的U1、U2、U3……Uk。
7.一种基于动态索引表的全文检索装置,查找检索关键字在文档文本中的所有出现位置并向用户返回查找结果,其特征在于,所述装置包括:
模块M1,用于:在计算机存储器中设置两个关键字索引表,即关键字索引表一和关键字索引表二,所述两个关键字索引表均采用链表数组的存储结构,分别记为Index_1[]和Index_2[],它们的下标编址范围均为0~65535,两个链表数组Index_1[]和Index_2[]中的每一个数组元素均对应存储一个线性链表的头指针,其中Index_1[]中数组元素所指示线性链表内的各结点均包括用于存储检索关键字在所述文档文本中一处出现位置的指针P和用于存储当前结点之直接后继结点存储位置的指针N这两个域,Index_2[]中数组元素所指示线性链表内的各结点均包括用于存储检索关键字的字串S和用于存储当前结点之直接后继结点存储位置的指针N这两个域,两个链表数组Index_1[]和Index_2[]中的每一个数组元素均初始化取值为NULL;
模块M2,用于:在获取用户输入的检索关键字之后,首先判断该关键字先前是否在文档文本中曾经检索过,即利用哈希函数计算该关键字的码值C,通过读取数组元素Index_1[C]所指示的一条线性链表中的各结点数据判断该关键字先前是否曾经检索过且检索结果为成功,通过读取数组元素Index_2[C]所指示的一条线性链表中的各结点数据判断该关键字先前是否曾经检索过且检索结果为失败,若既未成功地检索过也未失败地检索过则视为该关键字先前在文档文本中从未检索过;然后,
若该关键字先前曾成功地检索过则返回其首次检索成功时所保存的检索结论信息,若该关键字先前曾失败地检索过则返回其首次检索失败时所保存的检索结论信息,若该关键字先前从未检索过则在文档文本中进行该关键字的首次检索并保存相应的检索结论信息;
所述哈希函数为C=Hash(U1,U2,U3……Uk)=U1+U2+U3+……+Uk,或C=Hash(U1,U2,U3……Uk)=|U1-U2-U3-……-Uk|,再或C=Hash(U1,U2,U3……Uk)=|Uk-Uk-1-Uk-2-……-U1|,式中C为大于等于0且小于65536的整数,k表示该检索关键字构成中的字符总数,U1、U2、U3……Uk为该检索关键字依次构成中各字符表示的二进制Unicode编码中的低16位所对应的数值,并且当计算所产生的和值或绝对值大于或等于2^16时,则C调整取值为所述和值或所述绝对值的二进制数值表示中低16位数所对应的数值。
8.根据权利要求7所述的全文检索装置,其特征在于,在所述模块M2中,还包括字符编码转换的子模块,用于:在获取用户输入的检索关键字之后、利用哈希函数计算该检索关键字的码值C之前,将所述用户输入的检索关键字中所涉各字符的编码,由其他非Unicode形式的编码转化为Unicode形式的编码即所述的U1、U2、U3……Uk。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311562345.1A CN117290523B (zh) | 2023-11-22 | 2023-11-22 | 基于动态索引表的全文检索方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311562345.1A CN117290523B (zh) | 2023-11-22 | 2023-11-22 | 基于动态索引表的全文检索方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN117290523A CN117290523A (zh) | 2023-12-26 |
CN117290523B true CN117290523B (zh) | 2024-01-30 |
Family
ID=89244680
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311562345.1A Active CN117290523B (zh) | 2023-11-22 | 2023-11-22 | 基于动态索引表的全文检索方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117290523B (zh) |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6865577B1 (en) * | 2000-11-06 | 2005-03-08 | At&T Corp. | Method and system for efficiently retrieving information from a database |
CN103092974A (zh) * | 2013-01-25 | 2013-05-08 | 浪潮电子信息产业股份有限公司 | 云os中一种基于内存索引的云主机查询方法 |
CN103607405A (zh) * | 2013-11-27 | 2014-02-26 | 东北大学 | 一种面向云存储的密文搜索认证方法 |
CN104834736A (zh) * | 2015-05-19 | 2015-08-12 | 深圳证券信息有限公司 | 构建索引库的方法、装置及检索的方法、装置和系统 |
CN115391495A (zh) * | 2022-10-28 | 2022-11-25 | 强企宝典(山东)信息科技有限公司 | 在中文语境中检索关键词的方法、装置及设备 |
CN115994210A (zh) * | 2022-11-21 | 2023-04-21 | 江西金格科技有限公司 | 一种ofd文档中快速检索文本的方法、装置和电子设备 |
CN116644146A (zh) * | 2023-05-10 | 2023-08-25 | 中电科网络安全科技股份有限公司 | 一种文档搜索方法、装置、系统、电子设备及存储介质 |
CN116821395A (zh) * | 2023-08-31 | 2023-09-29 | 简单汇信息科技(广州)有限公司 | 基于全文检索的贸易数据疑似命中检索方法及系统 |
-
2023
- 2023-11-22 CN CN202311562345.1A patent/CN117290523B/zh active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6865577B1 (en) * | 2000-11-06 | 2005-03-08 | At&T Corp. | Method and system for efficiently retrieving information from a database |
CN103092974A (zh) * | 2013-01-25 | 2013-05-08 | 浪潮电子信息产业股份有限公司 | 云os中一种基于内存索引的云主机查询方法 |
CN103607405A (zh) * | 2013-11-27 | 2014-02-26 | 东北大学 | 一种面向云存储的密文搜索认证方法 |
CN104834736A (zh) * | 2015-05-19 | 2015-08-12 | 深圳证券信息有限公司 | 构建索引库的方法、装置及检索的方法、装置和系统 |
CN115391495A (zh) * | 2022-10-28 | 2022-11-25 | 强企宝典(山东)信息科技有限公司 | 在中文语境中检索关键词的方法、装置及设备 |
CN115994210A (zh) * | 2022-11-21 | 2023-04-21 | 江西金格科技有限公司 | 一种ofd文档中快速检索文本的方法、装置和电子设备 |
CN116644146A (zh) * | 2023-05-10 | 2023-08-25 | 中电科网络安全科技股份有限公司 | 一种文档搜索方法、装置、系统、电子设备及存储介质 |
CN116821395A (zh) * | 2023-08-31 | 2023-09-29 | 简单汇信息科技(广州)有限公司 | 基于全文检索的贸易数据疑似命中检索方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN117290523A (zh) | 2023-12-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6470347B1 (en) | Method, system, program, and data structure for a dense array storing character strings | |
US11899641B2 (en) | Trie-based indices for databases | |
US8572126B2 (en) | Systems and methods for optimizing very large n-gram collections for speed and memory | |
US8473501B2 (en) | Methods, computer systems, software and storage media for handling many data elements for search and annotation | |
US8645350B2 (en) | Dictionary compilations | |
US10691753B2 (en) | Memory reduced string similarity analysis | |
US8244530B2 (en) | Efficient indexing of documents with similar content | |
US8244767B2 (en) | Composite locality sensitive hash based processing of documents | |
US7756859B2 (en) | Multi-segment string search | |
CN107153647B (zh) | 进行数据压缩的方法、装置、系统和计算机程序产品 | |
JP4365162B2 (ja) | 構造化文書のデータを検索する装置および方法 | |
US20020152219A1 (en) | Data interexchange protocol | |
CN102411580B (zh) | 可扩展标记语言文档的检索方法及装置 | |
US7979438B2 (en) | Document management method and apparatus and document search method and apparatus | |
WO2014047214A1 (en) | Hierarchical ordering of strings | |
US9720976B2 (en) | Extracting method, computer product, extracting system, information generating method, and information contents | |
Navarro | Document listing on repetitive collections with guaranteed performance | |
US8392433B2 (en) | Self-indexer and self indexing system | |
CN117290523B (zh) | 基于动态索引表的全文检索方法及装置 | |
JP2005242416A (ja) | 自然言語文の検索方法および検索装置 | |
Hsu et al. | UCIS-X: an updatable compact indexing scheme for efficient extensible markup language document updating and query evaluation | |
CN117235291B (zh) | 基于静态索引表的全文检索方法及装置 | |
JP3728264B2 (ja) | インデックス作成装置、検索システム、及び制御方法 | |
CN117349295B (zh) | 字词频度统计方法及装置 | |
US9009200B1 (en) | Method of searching text based on two computer hardware processing properties: indirect memory addressing and ASCII encoding |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |