著录项信息
专利名称 | 一种修改Lucene索引文件中词的方法及装置 |
申请号 | CN201410830430.6 | 申请日期 | 2014-12-26 |
法律状态 | 授权 | 申报国家 | 中国 |
公开/公告日 | 2015-03-25 | 公开/公告号 | CN104462558A |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | G06F17/30 | IPC分类号 | G;0;6;F;1;7;/;3;0查看分类表>
|
申请人 | 浙江宇视科技有限公司 | 申请人地址 | 浙江省杭州市滨江区西兴街道江陵路88号10幢南座1-11层
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 浙江宇视科技有限公司 | 当前权利人 | 浙江宇视科技有限公司 |
发明人 | 王新成 |
代理机构 | 杭州君度专利代理事务所(特殊普通合伙) | 代理人 | 诸佩艳 |
摘要
本发明公开了一种修改Lucene索引文件中词的方法及装置,该方法首先获取修改参数,然后对于索引文件夹中每一个段,查找该段中要修改字段是否存在旧词,如果存在则进入下一步,否则放弃对该段的修改;对要修改的段,生成新词对应的信息;并根据该段中原先就存在的除旧词和新词外其他词对应的信息、以及新词对应的信息,新生成四个倒排文件;最后在所有段都处理完成后,用新生成的四个倒排文件集中替换原索引文件夹中对应的文件。本发明还同时公开了实现上述方法的装置,本发明的方法及装置通过直接操作索引文件的方式,避免了重新创建索引的繁琐,极大地提高了修改的性能。
1.一种修改Lucene索引文件中词的方法,其特征在于,所述方法包括步骤:
步骤1、获取修改参数,包括要修改字段、要修改的旧词以及修改后的新词;
步骤2、对于索引文件夹中每一个段,查找该段中要修改字段是否存在旧词,如果存在则进入下一步,否则放弃对该段的修改;
步骤3、获取当前处理的段中旧词所对应的信息,判断当前处理的段中要修改字段是否已经存在与新词相同的词,如果存在与新词相同的词,则将与新词相同的词对应的信息与旧词对应的信息进行合并,生成新词对应的信息,否则直接根据旧词对应的信息生成新词对应的信息;
步骤4、根据当前处理的段中原先就存在的除旧词和新词外其他词对应的信息、以及新词对应的信息,新生成四个倒排文件segment.tim、segment.tip、segment.doc以及segment.pos;
步骤5、等到所有的段都处理完毕,用新生成的四个倒排文件集中替换原索引文件夹中对应的文件。
2.根据权利要求1所述的修改Lucene索引文件中词的方法,其特征在于,在所述步骤1之前,所述方法还包括步骤:
获取修改参数中所有要修改的旧词以及修改后的新词,将所有的新词按照字典顺序进行排序;
遍历索引文件夹中所有的段,获取段中所有旧词所对应的信息;
对将要修改为同一个新词的所有不同旧词对应的信息进行合并,作为一个旧词来处理。
3.根据权利要求1或2所述的修改Lucene索引文件中词的方法,其特征在于,在所述方法之前还包括步骤:
停止创建索引,结束正在进行的段合并过程;
获取索引文件夹中所有段的名称,写入特定文件夹下的info.txt文件,使存在于info.txt文件中的段不参与合并过程;
重新使能索引的创建;
而在所述方法步骤5之后,所述方法还包括步骤:
删除info.txt文件,使索引文件的修改立即被查询获取。
4.根据权利要求3所述的修改Lucene索引文件中词的方法,其特征在于,所述对应的信息包括文档号和出现的频率,所述将与新词相同的词对应的信息与旧词对应的信息进行合并,包括步骤:
将与新词相同的词,以及旧词看作同一个词,重新按照Lucene既定规则组织两者对应的信息,以重新组织得到的文档号作为他们对应的新词的文档号,以两者的出现频率的和作为他们对应的新词的出现频率。
5.根据权利要求3所述的修改Lucene索引文件中词的方法,其特征在于,所述步骤4具体包括步骤:
步骤S4.1、对要生成的四个索引文件segment.tim、segment.tip、segment.doc、segment.pos创建内存文件,即开辟内存空间,并且按照固定格式写好文件头;
步骤S4.2、针对每一个字段,按照除旧词外的其他词与新词的字典顺序,依次将他们的对应的信息,以及位置信息,写入segment.doc、segment.pos文件,根据FST原理,生成termBlock,并写入segment.tim、segment.tip文件;
步骤S4.3、在所有字段的每一个词都处理完毕后,根据固定格式为四个文件写好文件尾。
6.一种修改Lucene索引文件中词的装置,其特征在于,所述装置包括:
参数获取模块,用于获取修改参数,包括要修改字段、要修改的旧词以及修改后的新词;
修改判断模块,用于对索引文件夹中每一个段,查找该段中要修改字段是否存在旧词,如果存在则转入信息合并模块进行处理,否则放弃对该段的修改;
信息合并模块,用于获取当前处理的段中旧词所对应的信息,判断当前处理的段中要修改字段是否已经存在与新词相同的词,如果存在与新词相同的词,则将与新词相同的词对应的信息与旧词对应的信息进行合并,生成新词对应的信息,否则直接根据旧词对应的信息生成新词对应的信息;
倒排文件生成模块,用于根据当前处理的段中原先就存在的除旧词和新词外其他词对应的信息、以及新词对应的信息,新生成四个倒排文件segment.tim、segment.tip、segment.doc以及segment.pos;
文件替换模块,用于等到所有的段都处理完毕,用新生成的四个倒排文件集中替换原索引文件夹中对应的文件。
7.根据权利要求6所述的修改Lucene索引文件中词的装置,其特征在于,所述装置还包括批量词合并模块,所述批量词合并模块用于执行以下操作:
获取修改参数中所有要修改的旧词以及修改后的新词,将所有的新词按照字典顺序进行排序;
遍历索引文件夹中所有的段,获取段中所有旧词所对应的信息;
对将要修改为同一个新词的所有不同旧词对应的信息进行合并,作为一个旧词来处理。
8.根据权利要求6或7所述的修改Lucene索引文件中词的装置,其特征在于,所述装置还包括动态管理模块,所述动态管理模块用于在进行修改索引文件中词之前执行以下操作:
停止创建索引,结束正在进行的段合并过程;
获取索引文件夹中所有段的名称,写入特定文件夹下的info.txt文件,使保证存在于info.txt文件中的段不参与合并过程;
重新使能索引的创建;
并在修改完成后,执行如下操作:删除info.txt文件,使索引文件的修改立即被查询获取。
9.根据权利要求8所述的修改Lucene索引文件中词的装置,其特征在于,所述信息合并模块在将与新词相同的词对应的信息与旧词对应的信息进行合并时,执行如下操作:将与新词相同的词,以及旧词看作同一个词,重新按照Lucene既定规则组织两者对应的信息,以重新组织得到的文档号作为他们对应的新词的文档号,以两者的出现频率的和作为他们对应的新词的出现频率。
10.根据权利要求8所述的修改Lucene索引文件中词的装置,其特征在于,所述倒排文件生成模块在生成四个倒排文件时,执行如下操作:
对要生成的四个索引文件segment.tim、segment.tip、segment.doc、segment.pos创建内存文件,即开辟内存空间,并且按照固定格式写好文件头;
针对每一个字段,按照除旧词外的其他词与新词的字典顺序,依次将他们的对应的信息,以及位置信息,写入segment.doc、segment.pos文件,根据FST原理,生成termBlock,并写入segment.tim、segment.tip文件;
在所有字段的每一个词都处理完毕后,根据固定格式为四个文件写好文件尾。
一种修改Lucene索引文件中词的方法及装置\n技术领域\n[0001] 本发明属于数据库索引技术领域,尤其涉及一种修改Lucene索引文件中词的方法及装置。\n背景技术\n[0002] 在交通管理系统中,车辆信息管理是其中一项重要功能。其功能主要是将通过某个路口的车辆信息如:时间、地点、速度、车型、图片、告警信息等保存到数据库中。随着数据库的日益庞大,以及对搜索速度的高要求,一般需要使用其它搜索引擎(如Lucene)对数据库中的数据重新创建索引。这样,即使数据库达到了十亿级别的数量,系统的查询功能仍然可以达到理想的响应速度。\n[0003] 使用Lucene虽然能大幅度提高搜索性能,但也出现了新的难题。由于客观或主观原因,保存在数据库中的某些信息有可能会出现错误。比如,在现实生活中,操作人员的不小心,把原本属于某个行政区划的社区误设为其它行政区的社区。这样它从一开始创建索引的时候就出现了信息上的错误问题,反映在Lucene的索引文件中,就是某一个字段发生了错误。\n[0004] 而如果要纠正错误,Lucene本身提供了三种操作方式:增、删、改。增,很好理解,就是在现有的索引文件中再增加一条记录,这些记录在Lucene中被称为Document;删,可以根据特定条件查询,然后删除掉符合条件的Document;改,需要注意的是,Lucene中的改并不意味着可以直接修改索引文件的内容,它本质上是删与增的结合,即先把错误的Document全部删掉,再把修改正确之后的记录一条一条加进来。这种处理方式相当于重新去数据库中抓取数据,创建先前有错误的那部分索引。现有技术虽然在理论上可以解决交通系统所遇到的问题,但它存在着如下的缺点:\n[0005] 交通系统在使用中,如果一开始就弄错了某些设定信息,那么之后保存的相关所有索引记录都会存在问题。使用现有技术来解决这个问题意味着,系统需要重建海量的索引,这样一来就会对数据库造成很大的压力。\n[0006] 另外索引的创建是一个非常耗时的过程,假设索引的重建是可以接受的,那么也需要花费大量的时间来进行这项工作。比如在集群下创建10亿量级的索引,需要花费数天的时间才能完成,这在商业应用中很难让人忍受。\n发明内容\n[0007] 本发明的目的是提供一种修改Lucene索引文件中词的方法及装置,实现在不影响搜索功能的前提下,将索引文件中的错误字段更改正确,能够快速地实现索引文件的修改,避免了重新挖掘数据库所带来的繁琐与运行压力,具有较高的商业价值。\n[0008] 为了实现上述目的,本发明技术方案如下:\n[0009] 一种修改Lucene索引文件中词的方法,所述方法包括步骤:\n[0010] 步骤1、获取修改参数,包括要修改字段、要修改的旧词以及修改后的新词;\n[0011] 步骤2、对于索引文件夹中每一个段,查找该段中要修改字段是否存在旧词,如果存在则进入下一步,否则放弃对该段的修改;\n[0012] 步骤3、获取当前处理的段中旧词所对应的信息,判断当前处理的段中要修改字段是否已经存在与新词相同的词,如果存在与新词相同的词,则将与新词相同的词对应的信息与旧词对应的信息进行合并,生成新词对应的信息,否则直接根据旧词对应的信息生成新词对应的信息;\n[0013] 步骤4、根据当前处理的段中原先就存在的除旧词和新词外其他词对应的信息、以及新词对应的信息,新生成四个倒排文件segment.tim、segment.tip、segment.doc以及segment.pos;\n[0014] 步骤5、等到所有的段都处理完毕,用新生成的四个倒排文件集中替换原索引文件夹中对应的文件。\n[0015] 进一步地,本发明对于批量词修改,在所述步骤1之前,所述方法还包括步骤:\n[0016] 获取修改参数中所有要修改的旧词以及修改后的新词,将所有的新词按照字典顺序进行排序;\n[0017] 遍历索引文件夹中所有的段,获取段中所有旧词所对应的信息;\n[0018] 对将要修改为同一个新词的所有不同旧词对应的信息进行合并,作为一个旧词来处理。\n[0019] 进一步地,本发明对于动态修改索引文件,在所述方法之前还包括步骤:\n[0020] 停止创建索引,结束正在进行的段合并过程;\n[0021] 获取索引文件夹中所有段的名称,写入特定文件夹下的info.txt文件,使存在于info.txt文件中的段不参与合并过程;\n[0022] 重新使能索引的创建;\n[0023] 而在所述方法步骤5之后,所述方法还包括步骤:\n[0024] 删除info.txt文件,使索引文件的修改立即被查询获取。\n[0025] 其中,所述对应的信息包括文档号和出现的频率,所述将与新词相同的词对应的信息与旧词对应的信息进行合并,包括步骤:\n[0026] 将与新词相同的词,以及旧词看作同一个词,重新按照Lucene既定规则组织两者对应的信息,以重新组织得到的文档号作为他们对应的新词的文档号,以两者的出现频率的和作为他们对应的新词的出现频率。\n[0027] 进一步地,所述步骤4具体包括步骤:\n[0028] 步骤S4.1、对要生成的四个索引文件segment.tim、segment.tip、segment.doc、segment.pos创建内存文件,即开辟内存空间,并且按照固定格式写好文件头;\n[0029] 步骤S4.2、针对每一个字段,按照除旧词外的其他词与新词的字典顺序,依次将他们的对应的信息,以及位置信息,写入segment.doc、segment.pos文件,根据FST原理,生成termBlock,并写入segment.tim、segment.tip文件;\n[0030] 步骤S4.3、在所有字段的每一个词都处理完毕后,根据固定格式为四个文件写好文件尾。\n[0031] 本发明还提出了一种修改Lucene索引文件中词的装置,所述装置包括:\n[0032] 参数获取模块,用于获取修改参数,包括要修改字段、要修改的旧词以及修改后的新词;\n[0033] 修改判断模块,用于对索引文件夹中每一个段,查找该段中要修改字段是否存在旧词,如果存在则转入信息合并模块进行处理,否则放弃对该段的修改;\n[0034] 信息合并模块,用于获取当前处理的段中旧词所对应的信息,判断当前处理的段中要修改字段是否已经存在与新词相同的词,如果存在与新词相同的词,则将与新词相同的词对应的信息与旧词对应的信息进行合并,生成新词对应的信息,否则直接根据旧词对应的信息生成新词对应的信息;\n[0035] 倒排文件生成模块,用于根据当前处理的段中原先就存在的除旧词和新词外其他词对应的信息、以及新词对应的信息,新生成四个倒排文件segment.tim、segment.tip、segment.doc以及segment.pos;\n[0036] 文件替换模块,用于等到所有的段都处理完毕,用新生成的四个倒排文件集中替换原索引文件夹中对应的文件。\n[0037] 进一步地,所述装置还包括批量词合并模块,所述批量词合并模块用于执行以下操作:\n[0038] 获取修改参数中所有要修改的旧词以及修改后的新词,将所有的新词按照字典顺序进行排序;\n[0039] 遍历索引文件夹中所有的段,获取段中所有旧词所对应的信息;\n[0040] 对将要修改为同一个新词的所有不同旧词对应的信息进行合并,作为一个旧词来处理。\n[0041] 进一步地,所述装置还包括动态管理模块,所述动态管理模块用于在进行修改索引文件中词之前执行以下操作:\n[0042] 停止创建索引,结束正在进行的段合并过程;\n[0043] 获取索引文件夹中所有段的名称,写入特定文件夹下的info.txt文件,使存在于info.txt文件中的段不参与合并过程;\n[0044] 重新使能索引的创建;\n[0045] 并在修改完成后,执行如下操作:删除info.txt文件,使索引文件的修改立即被查询获取。\n[0046] 本发明提出了一种修改Lucene索引文件中词的方法及装置,通过参考段合并的方法实现对索引文件中字段内容的修改,快速实现了索引文件的错误纠正,避免了繁琐的索引重建。并实现了动态情况下对索引文件的修改,且不会影响索引创建以及搜索等业务的正常运行。当然本发明的适用范围并不局限于交通行业,任何基于Lucene开发的搜索引擎都可以借鉴使用。通过直接操作索引文件的方式,避免了重新创建索引的繁琐,这可以极大地提高修改的性能。\n附图说明\n[0047] 图1为Lucene索引文件的组织分布图;\n[0048] 图2为本发明修改Lucene索引文件中词的方法流程图;\n[0049] 图3为本发明四个倒排文件生成方法流程图;\n[0050] 图4为本发明批量词修改方法流程图;\n[0051] 图5为本发明动态修改索引文件中词的方法流程图。\n具体实施方式\n[0052] 下面结合附图和实施例对本发明技术方案做进一步详细说明,以下实施例不构成对本发明的限定。\n[0053] 图1示出了Lucene索引文件的组织分布图。Lucene的索引文件格式(Lucene4.x为例)非常复杂,从上至下的结构可以分为以下几个层次:\n[0054] (1)索引(Index):所有的索引文件会放在同一个文件夹中,它是Lucene实现索引创建,合并以及搜索功能的实际操作对象,也是最根本的基石。\n[0055] (2)段(Segment):索引文件的存在形式就是段,段与段之间保持相互独立。段有多个文件组成,每个段的文件都具有相同的段名,以及不同的后缀,图1中右边就是每个段所包括的文件。\n[0056] (3)文档(Document):一条索引记录就是一个文档,而所有的文档组成了段。文档记录了索引的具体信息,它是索引创建的基本单元。\n[0057] (4)字段(Field):文档信息的组成是可以分类的,比如对一篇文章,它的内容可分为标题、作者、摘要、正文以及发表时间等等。以字段的形式来组织文档信息,能够帮助Lucene更加科学合理地处理索引。\n[0058] (5)词(Term):每个字段可以包含很多词,它是索引信息的基本单元。本发明要修改的部分就是某一字段下面的特定词。\n[0059] 以交通管理系统保存的信息为例,一条索引信息包括车牌号、过车时间、车身颜色、车标、组织关系等信息。其中,这条索引信息便是上述的文档(Document);车牌号、过车时间以及车身颜色等就是字段(Field);而字段的具体内容,如车身颜色:红、蓝、黑等就是词(Term)。而很多条类似的索引信息便可以组成一个段,所有段(Segment)的集合便是索引(Index)。\n[0060] 图1中显示了索引文件的组织分布图,从图中可以看到每个段是有多个文件组成的,它们整体上可以分为正向信息与反向信息。\n[0061] 所谓正向信息,即它保存信息的方式是按照索引的结构从上往下来进行,即①索引→②段→③文档→④字段→⑤词。图1中包含正向信息的文件有:\n[0062] segment_N、segment.gen保存的是所有段的总数、名称以及各个段中所有文档数量,这两个文件并不属于某个特定段。\n[0063] segment.si保存的是段的元数据。\n[0064] segment.fnm保存的是段包含的所有字段,以及字段的类型以及索引方式。\n[0065] segment.fdx、segment.fdt保存的是段中stored类型字段的信息,包括每个字段包含了多少词以及所有的文档。\n[0066] segment.dvd、segment.dvm编码额外的打分因子以及其它的预置文档。\n[0067] 其它还有segment.pay、segment.nvd、segment.nvm等文件,也会保存相关的正向信息,但是很多时候它们一般不会生成。\n[0068] 反向信息,也即倒排信息,它保存的是从词(Term)→索引(Index)的完整映射:\n[0069] segment.tim、segment.tip是字典文件,保存的是每个字段下的所有词信息,按照字典的顺序从小到大排列。\n[0070] segment.doc、segment.pos倒排文件,保存的是每个词所对应的所有DocID,出现的频率DocFreq以及词在各个Document中的位置。\n[0071] 本发明一种修改Lucene索引文件中词的方法就是修改字段(Field)下面的特定词(Term),因此需要修改的文件必须包含着词的信息,根据上述对索引文件格式的分析知道要修改的文件包含以下四个文件:segment.tim、segment.tip、segment.doc以及segment.pos,其中segment.doc存放着每个词所对应的DocID以及DocFreq;而segment.pos存放的是每个词在文档中的位置信息。其中segment为段的名称。四个倒排文件会互相影响,改一个文件意味着相关文件也需要做出调整。\n[0072] 图2示出了本发明实施例一种修改Lucene索引文件中词的方法流程图,包括如下步骤:\n[0073] 步骤S1:获取修改参数,包括要修改字段、要修改的旧词以及修改后的新词。\n[0074] 将数据库中错误的词定义为旧词(oldTerm),用来替换旧词的内容定义为新词(newTerm)。例如对于一个交通管理系统中数据库的车辆信息,字段包括时间、地点、速度、车型、车牌号、车身颜色等等,假设其中一个地点由于操作人员失误输入错误,将本来位于文三路路口的词写为了莫干山路口。则在修改时,获取的参数分别为:字段-地点;旧词-莫干山路口;新词-文三路口。\n[0075] 本实施例首先从segment_N、segment.gen文件中读取所有段的信息,包括段的数量以及段的名称。然后依次对每一个段进行处理,直到所有段都遍历完毕。需要说明的是,因为每个段的处理是相互独立的,所以可以采用多线程来处理,这样可以节约处理所用的时间。\n[0076] 以下步骤S2~步骤S5具体阐述对于索引文件夹中每一段的处理步骤:\n[0077] 步骤S2、对于索引文件夹中每一个段,查找该段中要修改字段是否存在旧词,如果存在则进入下一步,否则放弃对该段的修改。\n[0078] 本步骤主要用来判断某个段中是否存在着要修改的旧词,如果没有就放弃对这个段的修改,这样处理可以大大提高修改的性能。\n[0079] 步骤S3、获取当前处理的段中旧词所对应的信息,判断当前处理的段中要修改字段是否已经存在与新词相同的词,如果存在与新词相同的词,则将与新词相同的词对应的信息与旧词对应的信息进行合并,生成新词对应的信息,否则直接根据旧词对应的信息生成新词对应的信息。\n[0080] 旧词所对应的信息包括它所有的文档号DocID以及出现的频率DocFreq。如果段中存在旧词,则获取旧词对应的信息,包括文档号和出现的频率。\n[0081] 如果当前段中原来就存在与新词一样的词,则需要合并与新词一样的词与旧词对应的信息。\n[0082] 例如:新词为C,旧词为A,当前段中存在A和C。\n[0083] 合并过程中,将当前段中的A和C看作同一个词重新按照Lucene既定规则组织形成新的文档号和出现的频率,以重新组织得到的文档号DocID作为他们对应的新词的文档号DocID,以两者的出现频率的和作为他们对应的新词的出现频率,生成新词对应的信息。这里新词对应的信息包括当前段中原先存在的与新词一样的词对应的信息,以及需要替换旧词的新词对应的信息。\n[0084] 如果当前段中原先没有新词,则将旧词对应的信息赋予给新词,生成新词对应的信息。\n[0085] 需要说明的是,文档号DocID以及出现的频率DocFreq在Lucene中存放时有着自身的规则的,比如从小到大,以及增量存放,在本实施例中仅注明在合并时按照Lucene既定规则组织形成新的文档号和出现的频率,这里不再赘述。\n[0086] 步骤S4、将原先就存在的除旧词和新词外其他词对应的信息以及新词对应的信息写入四个倒排文件segment.tim、segment.tip、segment.doc以及segment.pos中。\n[0087] 本步骤对应的实现是以索引文件格式为基础,它的实现是整个算法的核心。本实施例是生成四个倒排文件,而不是修改文件,这是由索引文件的格式以及它整体的结构决定的。实现的过程没法做到仅仅靠部分的替换就可以达到修改文件目的,因为某一个词的改变会造成原有文件中相关模块结构的变换,排放顺序的调整。所以最直接明了的做法就是利用原来索引文件的信息,按照它的格式重新生成相关的文件。图3显示了步骤S4的具体实现流程结构图,包括如下步骤:\n[0088] 步骤S401、对要生成的四个索引文件segment.tim、segment.tip、segment.doc、segment.pos创建内存文件,即开辟内存空间,并且按照固定格式写好文件头。\n[0089] 步骤S402、针对每一个字段,按照除旧词外的其他词与新词的字典顺序,依次将他们的对应的信息,以及位置信息,写入segment.doc、segment.pos文件,根据FST原理,生成termBlock,并写入segment.tim、segment.tip文件。\n[0090] 对于字段中要修改的旧词,这个旧词的信息已经被新词获取,所以它本身已不再需要被写入索引文件,跳过它不做处理。\n[0091] 根据本步骤将每个词的信息写入索引文件,写入时按照字典顺序来写入。即对于字段中每一个词,首先判断该词是否为旧词,如果是不处理;否则根据该词与新词在字典顺序中的前后位置,如果该词在前,则将该词对应的信息,以及位置信息写入segment.doc、segment.pos文件,根据FST原理,生成termBlock,并写入segment.tim、segment.tip文件,然后再处理下一个词。否则找到新词的位置,将新词对应的信息、以及位置信息写入segment.doc、segment.pos文件,根据FST原理,生成termBlock,并写入segment.tim、segment.tip文件,然后再处理该词,及后续的其他词。\n[0092] 本步骤找准每一个词在文件中应该呆的位置,然后将相关信息,如它出现在哪些文档中即文档号DocID,出现的频率DocFreq以及根据FST生成的termBlock写入对应的索引文件。\n[0093] 值得注意的是,本实施例对字段中词的修改,是按照要修改字段的顺序来依次处理,处理完一个要修改字段的所有词后再转入处理下一个要修改的字段,直到所有要修改的字段都处理完毕。\n[0094] 步骤S403、在所有字段的每一个词都处理完毕后,根据格式为四个文件写好文件尾。\n[0095] 当每个字段里的每一个词都被处理完毕,需要为每一个索引文件写好文件尾,这样才能得到符合索引格式的完整文件。\n[0096] 需要说明的是,本实施例中FST(Finite State Transducer),是Lucene的数据结构,是一种有限状态转移机,具有空间占用小,通过对词典中单词前缀和后缀的重复利用,压缩了存储空间,查询速度块。关于FST,这里不再赘述。\n[0097] 步骤S5、等到所有的段都处理完毕,用新生成的四个倒排文件集中替换原索引文件夹中对应的文件。\n[0098] 这么处理,可以保证即使中途修改失败也不会破坏原索引文件,对原数据的保护至关重要。\n[0099] 通过上述步骤单个词的修改方法已经实现,如果要将它推广到批量词的修改,那么一种直观的想法就是用一个循环来将所有的词一个接一个的修改。如果词的数量比较多,那它对时间的要求就会让人难以忍受。如在实际测试的时候,10亿量数据单个词的修改要耗时半个小时左右,而一旦修改的词成倍增加时,它的耗时也需要成倍增加。\n[0100] 为了减少处理的时间,本实施例的方法还进一步包括批量处理的方法,如图4所示,包括如下步骤:\n[0101] 步骤F1、获取修改参数中所有要修改的旧词以及修改后的新词,将所有的新词按照字典顺序进行排序;\n[0102] 按照字典顺序进行排序,符合索引文件的格式,会节约后续步骤处理时间。\n[0103] 步骤F2、遍历索引文件夹中所有的段,获取段中所有旧词所对应的信息;\n[0104] 步骤F3、对将要修改为同一个新词的所有不同旧词对应的信息进行合并;\n[0105] 步骤F4、按照步骤S1~步骤S5的步骤对每个新词及其对应的所有不同旧词进行处理。\n[0106] 需要说明的是,这里对将要修改为同一个新词的所有不同旧词对应的信息进行合并,与前面所说的将与新词相同的词对应的信息与旧词对应的信息进行合并方法相同,这里不再赘述。\n[0107] 而对于合并后的处理,则是将要修改为同一个新词的所有不同旧词看作一个旧词进行处理。\n[0108] 上述无论是对单个词的修改,还是批量修改,都只能运行在静态情况之下,即在修改的同时,不能创建索引。而在实际应用中,这种效果会带来较差的客户体验,因此需要修改的同时能够动态的创建索引以及满足查询功能。而动态的难点是,索引文件夹中的段一直在参与合并过程,这会导致段的名字一直变化。因为合并的本质就是将多个小段合并成一个大段,然后删掉原来的小段,这样就给修改带来了麻烦。很有可能当修改完成某个段之后,发现这个段的信息早已经被合入了新段,而且它在文件夹中早已不存在了。解决这个问题的关键是修改合并的策略,即保证在修改索引期间,要修改的那部分段不参与合并过程,等到修改完成之后再将这部分段释放,继续参与合并过程。\n[0109] 动态修改索引文件的具体算法实现流程如图5所示:\n[0110] 步骤G1、停止创建索引,结束正在进行的段合并过程。\n[0111] 步骤G2、获取索引文件夹中的段名,写入某特定文件夹下的info.txt文件。同时需要修改合并策略,保证存在于info.txt文件中的段不参与合并过程。\n[0112] 步骤G3、重新使能索引的创建,执行步骤1~5,完成索引文件的修改。\n[0113] 步骤G4、删除info.txt文件,使索引文件的修改立即被查询获取。\n[0114] 删除info.txt的目的是允许该文件中的所包含的段可以重新进入合并的队列中。\n调用IndexWriter中的commit()方法,可以认为是对当前的索引进行了一次提交,使得索引文件的修改可以立即被查询获取。\n[0115] 本实施例还提出了实现上述方法的装置,包括\n[0116] 参数获取模块,用于获取修改参数,包括要修改字段、要修改的旧词以及修改后的新词;\n[0117] 修改判断模块,用于对索引文件夹中每一个段,查找该段中要修改字段是否存在旧词,如果存在则转入信息合并模块进行处理,否则放弃对该段的修改;\n[0118] 信息合并模块,用于获取当前处理的段中旧词所对应的信息,判断当前处理的段中要修改字段是否已经存在与新词相同的词,如果存在与新词相同的词,则将与新词相同的词对应的信息与旧词对应的信息进行合并,生成新词对应的信息,否则直接根据旧词对应的信息生成新词对应的信息;\n[0119] 倒排文件生成模块,用于根据当前处理的段中原先就存在的除旧词和新词外其他词对应的信息、以及新词对应的信息,新生成四个倒排文件segment.tim、segment.tip、segment.doc以及segment.pos;\n[0120] 文件替换模块,用于等到所有的段都处理完毕,用新生成的四个倒排文件集中替换原索引文件夹中对应的文件。\n[0121] 为了进行批量词的处理,本实施例的装置还包括批量词合并模块,该批量词合并模块获取修改参数中所有要修改的旧词以及修改后的新词,将所有的新词按照字典顺序进行排序,遍历索引文件夹中所有的段,获取段中所有旧词所对应的信息,对将要修改为同一个新词的所有不同旧词对应的信息进行合并,作为一个旧词来处理。\n[0122] 为了实现动态处理,本实施例的装置还包括动态管理模块,动态管理模块在进行修改索引文件中词之前,先停止创建索引,结束正在进行的段合并过程,获取索引文件夹中所有段的名称,写入特定文件夹下的info.txt文件,使存在于info.txt文件中的段不参与合并过程,并重新使能索引的创建;并在修改完成后,删除info.txt文件,使索引文件的修改立即被查询获取。\n[0123] 以上实施例仅用以说明本发明的技术方案而非对其进行限制,在不背离本发明精神及其实质的情况下,熟悉本领域的技术人员当可根据本发明作出各种相应的改变和变形,但这些相应的改变和变形都应属于本发明所附的权利要求的保护范围。
法律信息
- 2017-12-08
- 2015-06-17
实质审查的生效
IPC(主分类): G06F 17/30
专利申请号: 201410830430.6
申请日: 2014.12.26
- 2015-03-25
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 |
1
| |
2014-06-25
|
2012-12-21
| | |
2
| |
2011-04-27
|
2010-12-22
| | |
3
| |
2007-07-25
|
2007-01-24
| | |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有被任何外部专利所引用! |