一種修改Lucene索引文件中詞的方法及裝置制造方法
【專利摘要】本發(fā)明公開了一種修改Lucene索引文件中詞的方法及裝置,該方法首先獲取修改參數(shù),然后對于索引文件夾中每一個(gè)段,查找該段中要修改字段是否存在舊詞,如果存在則進(jìn)入下一步,否則放棄對該段的修改;對要修改的段,生成新詞對應(yīng)的信息;并根據(jù)該段中原先就存在的除舊詞和新詞外其他詞對應(yīng)的信息、以及新詞對應(yīng)的信息,新生成四個(gè)倒排文件;最后在所有段都處理完成后,用新生成的四個(gè)倒排文件集中替換原索引文件夾中對應(yīng)的文件。本發(fā)明還同時(shí)公開了實(shí)現(xiàn)上述方法的裝置,本發(fā)明的方法及裝置通過直接操作索引文件的方式,避免了重新創(chuàng)建索引的繁瑣,極大地提高了修改的性能。
【專利說明】一種修改Lucene索引文件中詞的方法及裝置
【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬于數(shù)據(jù)庫索引【技術(shù)領(lǐng)域】,尤其涉及一種修改Lucene索引文件中詞的方法及裝置。
【背景技術(shù)】
[0002]在交通管理系統(tǒng)中,車輛信息管理是其中一項(xiàng)重要功能。其功能主要是將通過某個(gè)路口的車輛信息如:時(shí)間、地點(diǎn)、速度、車型、圖片、告警信息等保存到數(shù)據(jù)庫中。隨著數(shù)據(jù)庫的日益龐大,以及對搜索速度的高要求,一般需要使用其它搜索引擎(如Lucene)對數(shù)據(jù)庫中的數(shù)據(jù)重新創(chuàng)建索引。這樣,即使數(shù)據(jù)庫達(dá)到了十億級別的數(shù)量,系統(tǒng)的查詢功能仍然可以達(dá)到理想的響應(yīng)速度。
[0003]使用Lucene雖然能大幅度提高搜索性能,但也出現(xiàn)了新的難題。由于客觀或主觀原因,保存在數(shù)據(jù)庫中的某些信息有可能會(huì)出現(xiàn)錯(cuò)誤。比如,在現(xiàn)實(shí)生活中,操作人員的不小心,把原本屬于某個(gè)行政區(qū)劃的社區(qū)誤設(shè)為其它行政區(qū)的社區(qū)。這樣它從一開始創(chuàng)建索引的時(shí)候就出現(xiàn)了信息上的錯(cuò)誤問題,反映在Lucene的索引文件中,就是某一個(gè)字段發(fā)生了錯(cuò)誤。
[0004]而如果要糾正錯(cuò)誤,Lucene本身提供了三種操作方式:增、刪、改。增,很好理解,就是在現(xiàn)有的索引文件中再增加一條記錄,這些記錄在Lucene中被稱為Document ;刪,可以根據(jù)特定條件查詢,然后刪除掉符合條件的Document ;改,需要注意的是,Lucene中的改并不意味著可以直接修改索引文件的內(nèi)容,它本質(zhì)上是刪與增的結(jié)合,即先把錯(cuò)誤的Document全部刪掉,再把修改正確之后的記錄一條一條加進(jìn)來。這種處理方式相當(dāng)于重新去數(shù)據(jù)庫中抓取數(shù)據(jù),創(chuàng)建先前有錯(cuò)誤的那部分索引?,F(xiàn)有技術(shù)雖然在理論上可以解決交通系統(tǒng)所遇到的問題,但它存在著如下的缺點(diǎn):
[0005]交通系統(tǒng)在使用中,如果一開始就弄錯(cuò)了某些設(shè)定信息,那么之后保存的相關(guān)所有索引記錄都會(huì)存在問題。使用現(xiàn)有技術(shù)來解決這個(gè)問題意味著,系統(tǒng)需要重建海量的索引,這樣一來就會(huì)對數(shù)據(jù)庫造成很大的壓力。
[0006]另外索引的創(chuàng)建是一個(gè)非常耗時(shí)的過程,假設(shè)索引的重建是可以接受的,那么也需要花費(fèi)大量的時(shí)間來進(jìn)行這項(xiàng)工作。比如在集群下創(chuàng)建10億量級的索引,需要花費(fèi)數(shù)天的時(shí)間才能完成,這在商業(yè)應(yīng)用中很難讓人忍受。
【發(fā)明內(nèi)容】
[0007]本發(fā)明的目的是提供一種修改Lucene索引文件中詞的方法及裝置,實(shí)現(xiàn)在不影響搜索功能的前提下,將索引文件中的錯(cuò)誤字段更改正確,能夠快速地實(shí)現(xiàn)索引文件的修改,避免了重新挖掘數(shù)據(jù)庫所帶來的繁瑣與運(yùn)行壓力,具有較高的商業(yè)價(jià)值。
[0008]為了實(shí)現(xiàn)上述目的,本發(fā)明技術(shù)方案如下:
[0009]一種修改Lucene索引文件中詞的方法,所述方法包括步驟:
[0010]步驟1、獲取修改參數(shù),包括要修改字段、要修改的舊詞以及修改后的新詞;
[0011]步驟2、對于索引文件夾中每一個(gè)段,查找該段中要修改字段是否存在舊詞,如果存在則進(jìn)入下一步,否則放棄對該段的修改;
[0012]步驟3、獲取當(dāng)前處理的段中舊詞所對應(yīng)的信息,判斷當(dāng)前處理的段中要修改字段是否已經(jīng)存在與新詞相同的詞,如果存在與新詞相同的詞,則將與新詞相同的詞對應(yīng)的信息與舊詞對應(yīng)的信息進(jìn)行合并,生成新詞對應(yīng)的信息,否則直接根據(jù)舊詞對應(yīng)的信息生成新詞對應(yīng)的信息;
[0013]步驟4、根據(jù)當(dāng)前處理的段中原先就存在的除舊詞和新詞外其他詞對應(yīng)的信息、以及新詞對應(yīng)的信息,新生成四個(gè)倒排文件segment, tim、segment, tip、segment, doc以及segment, pos;
[0014]步驟5、等到所有的段都處理完畢,用新生成的四個(gè)倒排文件集中替換原索引文件夾中對應(yīng)的文件。
[0015]進(jìn)一步地,本發(fā)明對于批量詞修改,在所述步驟I之前,所述方法還包括步驟:
[0016]獲取修改參數(shù)中所有要修改的舊詞以及修改后的新詞,將所有的新詞按照字典順序進(jìn)彳T排序;
[0017]遍歷索引文件夾中所有的段,獲取段中所有舊詞所對應(yīng)的信息;
[0018]對將要修改為同一個(gè)新詞的所有不同舊詞對應(yīng)的信息進(jìn)行合并,作為一個(gè)舊詞來處理。
[0019]進(jìn)一步地,本發(fā)明對于動(dòng)態(tài)修改索引文件,在所述方法之前還包括步驟:
[0020]停止創(chuàng)建索引,結(jié)束正在進(jìn)行的段合并過程;
[0021]獲取索引文件夾中所有段的名稱,寫入特定文件夾下的info, txt文件,使存在于info, txt文件中的段不參與合并過程;
[0022]重新使能索引的創(chuàng)建;
[0023]而在所述方法步驟5之后,所述方法還包括步驟:
[0024]刪除info, txt文件,使索引文件的修改立即被查詢獲取。
[0025]其中,所述對應(yīng)的信息包括文檔號和出現(xiàn)的頻率,所述將與新詞相同的詞對應(yīng)的信息與舊詞對應(yīng)的信息進(jìn)行合并,包括步驟:
[0026]將與新詞相同的詞,以及舊詞看作同一個(gè)詞,重新按照Lucene既定規(guī)則組織兩者對應(yīng)的信息,以重新組織得到的文檔號作為他們對應(yīng)的新詞的文檔號,以兩者的出現(xiàn)頻率的和作為他們對應(yīng)的新詞的出現(xiàn)頻率。
[0027]進(jìn)一步地,所述步驟4具體包括步驟:
[0028]步驟S4.1、對要生成的四個(gè)索引文件 segment, tim、segment, tip、segment, doc、segment, pos創(chuàng)建內(nèi)存文件,即開辟內(nèi)存空間,并且按照固定格式寫好文件頭;
[0029]步驟S4.2、針對每一個(gè)字段,按照除舊詞外的其他詞與新詞的字典順序,依次將他們的對應(yīng)的信息,以及位置信息,寫入segment, doc>segment, pos文件,根據(jù)FST原理,生成termBlock,并寫入 segment, tim、segment, tip 文件;
[0030]步驟S4.3、在所有字段的每一個(gè)詞都處理完畢后,根據(jù)固定格式為四個(gè)文件寫好文件尾。
[0031]本發(fā)明還提出了一種修改Lucene索引文件中詞的裝置,所述裝置包括:
[0032]參數(shù)獲取模塊,用于獲取修改參數(shù),包括要修改字段、要修改的舊詞以及修改后的新詞;
[0033]修改判斷模塊,用于對索引文件夾中每一個(gè)段,查找該段中要修改字段是否存在舊詞,如果存在則轉(zhuǎn)入信息合并模塊進(jìn)行處理,否則放棄對該段的修改;
[0034]信息合并模塊,用于獲取當(dāng)前處理的段中舊詞所對應(yīng)的信息,判斷當(dāng)前處理的段中要修改字段是否已經(jīng)存在與新詞相同的詞,如果存在與新詞相同的詞,則將與新詞相同的詞對應(yīng)的信息與舊詞對應(yīng)的信息進(jìn)行合并,生成新詞對應(yīng)的信息,否則直接根據(jù)舊詞對應(yīng)的信息生成新詞對應(yīng)的信息;
[0035]倒排文件生成模塊,用于根據(jù)當(dāng)前處理的段中原先就存在的除舊詞和新詞外其他詞對應(yīng)的信息、以及新詞對應(yīng)的信息,新生成四個(gè)倒排文件segment, tim、segment, tip、segment, doc 以及 segment, pos ;
[0036]文件替換模塊,用于等到所有的段都處理完畢,用新生成的四個(gè)倒排文件集中替換原索引文件夾中對應(yīng)的文件。
[0037]進(jìn)一步地,所述裝置還包括批量詞合并模塊,所述批量詞合并模塊用于執(zhí)行以下操作:
[0038]獲取修改參數(shù)中所有要修改的舊詞以及修改后的新詞,將所有的新詞按照字典順序進(jìn)彳T排序;
[0039]遍歷索引文件夾中所有的段,獲取段中所有舊詞所對應(yīng)的信息;
[0040]對將要修改為同一個(gè)新詞的所有不同舊詞對應(yīng)的信息進(jìn)行合并,作為一個(gè)舊詞來處理。
[0041]進(jìn)一步地,所述裝置還包括動(dòng)態(tài)管理模塊,所述動(dòng)態(tài)管理模塊用于在進(jìn)行修改索引文件中詞之前執(zhí)行以下操作:
[0042]停止創(chuàng)建索引,結(jié)束正在進(jìn)行的段合并過程;
[0043]獲取索引文件夾中所有段的名稱,寫入特定文件夾下的info, txt文件,使存在于info, txt文件中的段不參與合并過程;
[0044]重新使能索引的創(chuàng)建;
[0045]并在修改完成后,執(zhí)行如下操作:刪除info, txt文件,使索引文件的修改立即被查詢獲取。
[0046]本發(fā)明提出了一種修改Lucene索引文件中詞的方法及裝置,通過參考段合并的方法實(shí)現(xiàn)對索引文件中字段內(nèi)容的修改,快速實(shí)現(xiàn)了索引文件的錯(cuò)誤糾正,避免了繁瑣的索引重建。并實(shí)現(xiàn)了動(dòng)態(tài)情況下對索引文件的修改,且不會(huì)影響索引創(chuàng)建以及搜索等業(yè)務(wù)的正常運(yùn)行。當(dāng)然本發(fā)明的適用范圍并不局限于交通行業(yè),任何基于Lucene開發(fā)的搜索引擎都可以借鑒使用。通過直接操作索引文件的方式,避免了重新創(chuàng)建索引的繁瑣,這可以極大地提高修改的性能。
【專利附圖】
【附圖說明】
[0047]圖1為Lucene索引文件的組織分布圖;
[0048]圖2為本發(fā)明修改Lucene索引文件中詞的方法流程圖;
[0049]圖3為本發(fā)明四個(gè)倒排文件生成方法流程圖;
[0050]圖4為本發(fā)明批量詞修改方法流程圖;
[0051]圖5為本發(fā)明動(dòng)態(tài)修改索引文件中詞的方法流程圖。
【具體實(shí)施方式】
[0052]下面結(jié)合附圖和實(shí)施例對本發(fā)明技術(shù)方案做進(jìn)一步詳細(xì)說明,以下實(shí)施例不構(gòu)成對本發(fā)明的限定。
[0053]圖1示出了 Lucene索引文件的組織分布圖。Lucene的索引文件格式(Lucene4.x為例)非常復(fù)雜,從上至下的結(jié)構(gòu)可以分為以下幾個(gè)層次:
[0054](I)索引(Index):所有的索引文件會(huì)放在同一個(gè)文件夾中,它是Lucene實(shí)現(xiàn)索引創(chuàng)建,合并以及搜索功能的實(shí)際操作對象,也是最根本的基石。
[0055](2)段(Segment):索引文件的存在形式就是段,段與段之間保持相互獨(dú)立。段有多個(gè)文件組成,每個(gè)段的文件都具有相同的段名,以及不同的后綴,圖1中右邊就是每個(gè)段所包括的文件。
[0056](3)文檔(Document):—條索引記錄就是一個(gè)文檔,而所有的文檔組成了段。文檔記錄了索引的具體信息,它是索引創(chuàng)建的基本單元。
[0057](4)字段(Field):文檔信息的組成是可以分類的,比如對一篇文章,它的內(nèi)容可分為標(biāo)題、作者、摘要、正文以及發(fā)表時(shí)間等等。以字段的形式來組織文檔信息,能夠幫助Lucene更加科學(xué)合理地處理索引。
[0058](5)詞(Term):每個(gè)字段可以包含很多詞,它是索引信息的基本單元。本發(fā)明要修改的部分就是某一字段下面的特定詞。
[0059]以交通管理系統(tǒng)保存的信息為例,一條索引信息包括車牌號、過車時(shí)間、車身顏色、車標(biāo)、組織關(guān)系等信息。其中,這條索引信息便是上述的文檔(Document);車牌號、過車時(shí)間以及車身顏色等就是字段(Field);而字段的具體內(nèi)容,如車身顏色:紅、藍(lán)、黑等就是詞(Term)。而很多條類似的索引信息便可以組成一個(gè)段,所有段(Segment)的集合便是索弓I (Index)。
[0060]圖1中顯示了索引文件的組織分布圖,從圖中可以看到每個(gè)段是有多個(gè)文件組成的,它們整體上可以分為正向信息與反向信息。
[0061]所謂正向信息,即它保存信息的方式是按照索引的結(jié)構(gòu)從上往下來進(jìn)行,即①索引一②段一③文檔一④字段一⑤詞。圖1中包含正向信息的文件有:
[0062]segment_N、segment, gen保存的是所有段的總數(shù)、名稱以及各個(gè)段中所有文檔數(shù)量,這兩個(gè)文件并不屬于某個(gè)特定段。
[0063]segment, si保存的是段的元數(shù)據(jù)。
[0064]segment, fnm保存的是段包含的所有字段,以及字段的類型以及索引方式。
[0065]segment.fdx>segment, fdt保存的是段中stored類型字段的信息,包括每個(gè)字段包含了多少詞以及所有的文檔。
[0066]segment, dvd、segment, dvm編碼額外的打分因子以及其它的預(yù)置文檔。
[0067]其它還有segment, pay、segment, nvd、segment, nvm等文件,也會(huì)保存相關(guān)的正向信息,但是很多時(shí)候它們一般不會(huì)生成。
[0068]反向信息,也即倒排信息,它保存的是從詞(Term)—索引(Index)的完整映射:
[0069]segment.tim>segment, tip是字典文件,保存的是每個(gè)字段下的所有詞信息,按照字典的順序從小到大排列。
[0070]segment, doc、segment, pos倒排文件,保存的是每個(gè)詞所對應(yīng)的所有DocID,出現(xiàn)的頻率DocFreq以及詞在各個(gè)Document中的位置。
[0071]本發(fā)明一種修改Lucene索引文件中詞的方法就是修改字段(Field)下面的特定詞(Term),因此需要修改的文件必須包含著詞的信息,根據(jù)上述對索引文件格式的分析知道要修改的文件包含以下四個(gè)文件:segment.tim、segment, tip、segment, doc以及segment, pos,其中segment, doc存放著每個(gè)詞所對應(yīng)的DocID以及DocFreq ;而segment.pos存放的是每個(gè)詞在文檔中的位置信息。其中segment為段的名稱。四個(gè)倒排文件會(huì)互相影響,改一個(gè)文件意味著相關(guān)文件也需要做出調(diào)整。
[0072]圖2示出了本發(fā)明實(shí)施例一種修改Lucene索引文件中詞的方法流程圖,包括如下步驟:
[0073]步驟S1:獲取修改參數(shù),包括要修改字段、要修改的舊詞以及修改后的新詞。
[0074]將數(shù)據(jù)庫中錯(cuò)誤的詞定義為舊詞(OldTerm),用來替換舊詞的內(nèi)容定義為新詞(newTerm)。例如對于一個(gè)交通管理系統(tǒng)中數(shù)據(jù)庫的車輛信息,字段包括時(shí)間、地點(diǎn)、速度、車型、車牌號、車身顏色等等,假設(shè)其中一個(gè)地點(diǎn)由于操作人員失誤輸入錯(cuò)誤,將本來位于文三路路口的詞寫為了莫干山路口。則在修改時(shí),獲取的參數(shù)分別為:字段-地點(diǎn);舊詞-莫干山路口 ;新詞-文三路口。
[0075]本實(shí)施例首先從segment_N、segment, gen文件中讀取所有段的信息,包括段的數(shù)量以及段的名稱。然后依次對每一個(gè)段進(jìn)行處理,直到所有段都遍歷完畢。需要說明的是,因?yàn)槊總€(gè)段的處理是相互獨(dú)立的,所以可以采用多線程來處理,這樣可以節(jié)約處理所用的時(shí)間。
[0076]以下步驟S2?步驟S5具體闡述對于索引文件夾中每一段的處理步驟:
[0077]步驟S2、對于索引文件夾中每一個(gè)段,查找該段中要修改字段是否存在舊詞,如果存在則進(jìn)入下一步,否則放棄對該段的修改。
[0078]本步驟主要用來判斷某個(gè)段中是否存在著要修改的舊詞,如果沒有就放棄對這個(gè)段的修改,這樣處理可以大大提高修改的性能。
[0079]步驟S3、獲取當(dāng)前處理的段中舊詞所對應(yīng)的信息,判斷當(dāng)前處理的段中要修改字段是否已經(jīng)存在與新詞相同的詞,如果存在與新詞相同的詞,則將與新詞相同的詞對應(yīng)的信息與舊詞對應(yīng)的信息進(jìn)行合并,生成新詞對應(yīng)的信息,否則直接根據(jù)舊詞對應(yīng)的信息生成新詞對應(yīng)的信息。
[0080]舊詞所對應(yīng)的信息包括它所有的文檔號DocID以及出現(xiàn)的頻率DocFreq。如果段中存在舊詞,則獲取舊詞對應(yīng)的信息,包括文檔號和出現(xiàn)的頻率。
[0081]如果當(dāng)前段中原來就存在與新詞一樣的詞,則需要合并與新詞一樣的詞與舊詞對應(yīng)的信息。
[0082]例如:新詞為C,舊詞為A,當(dāng)前段中存在A和C。
[0083]合并過程中,將當(dāng)前段中的A和C看作同一個(gè)詞重新按照Lucene既定規(guī)則組織形成新的文檔號和出現(xiàn)的頻率,以重新組織得到的文檔號DocID作為他們對應(yīng)的新詞的文檔號DocID,以兩者的出現(xiàn)頻率的和作為他們對應(yīng)的新詞的出現(xiàn)頻率,生成新詞對應(yīng)的信息。這里新詞對應(yīng)的信息包括當(dāng)前段中原先存在的與新詞一樣的詞對應(yīng)的信息,以及需要替換舊詞的新詞對應(yīng)的信息。
[0084]如果當(dāng)前段中原先沒有新詞,則將舊詞對應(yīng)的信息賦予給新詞,生成新詞對應(yīng)的信息。
[0085]需要說明的是,文檔號DocID以及出現(xiàn)的頻率DocFreq在Lucene中存放時(shí)有著自身的規(guī)則的,比如從小到大,以及增量存放,在本實(shí)施例中僅注明在合并時(shí)按照Lucene既定規(guī)則組織形成新的文檔號和出現(xiàn)的頻率,這里不再贅述。
[0086]步驟S4、將原先就存在的除舊詞和新詞外其他詞對應(yīng)的信息以及新詞對應(yīng)的信息寫入四個(gè)倒排文件 segment, tim、segment, tip、segment, doc 以及 segment, pos 中。
[0087]本步驟對應(yīng)的實(shí)現(xiàn)是以索引文件格式為基礎(chǔ),它的實(shí)現(xiàn)是整個(gè)算法的核心。本實(shí)施例是生成四個(gè)倒排文件,而不是修改文件,這是由索引文件的格式以及它整體的結(jié)構(gòu)決定的。實(shí)現(xiàn)的過程沒法做到僅僅靠部分的替換就可以達(dá)到修改文件目的,因?yàn)槟骋粋€(gè)詞的改變會(huì)造成原有文件中相關(guān)模塊結(jié)構(gòu)的變換,排放順序的調(diào)整。所以最直接明了的做法就是利用原來索引文件的信息,按照它的格式重新生成相關(guān)的文件。圖3顯示了步驟S4的具體實(shí)現(xiàn)流程結(jié)構(gòu)圖,包括如下步驟:
[0088]步驟S401、對要生成的四個(gè)索引文件 segment, tim、segment, tip、segment, doc、segment, pos創(chuàng)建內(nèi)存文件,即開辟內(nèi)存空間,并且按照固定格式寫好文件頭。
[0089]步驟S402、針對每一個(gè)字段,按照除舊詞外的其他詞與新詞的字典順序,依次將他們的對應(yīng)的信息,以及位置信息,寫入segment, doc>segment, pos文件,根據(jù)FST原理,生成termBlock,并寫入 segment, tim、segment, tip 文件。
[0090]對于字段中要修改的舊詞,這個(gè)舊詞的信息已經(jīng)被新詞獲取,所以它本身已不再需要被寫入索引文件,跳過它不做處理。
[0091]根據(jù)本步驟將每個(gè)詞的信息寫入索引文件,寫入時(shí)按照字典順序來寫入。即對于字段中每一個(gè)詞,首先判斷該詞是否為舊詞,如果是不處理;否則根據(jù)該詞與新詞在字典順序中的前后位置,如果該詞在前,則將該詞對應(yīng)的信息,以及位置信息寫入segment, doc,segment, pos 文件,根據(jù) FST 原理,生成 termBlock,并寫入 segment, tim、segment, tip 文件,然后再處理下一個(gè)詞。否則找到新詞的位置,將新詞對應(yīng)的信息、以及位置信息寫入segment, doc、segment, pos 文件,根據(jù) FST 原理,生成 termBlock,并寫入 segment, tim、segment, tip文件,然后再處理該詞,及后續(xù)的其他詞。
[0092]本步驟找準(zhǔn)每一個(gè)詞在文件中應(yīng)該呆的位置,然后將相關(guān)信息,如它出現(xiàn)在哪些文檔中即文檔號DocID,出現(xiàn)的頻率DocFreq以及根據(jù)FST生成的termBlock寫入對應(yīng)的索引文件。
[0093]值得注意的是,本實(shí)施例對字段中詞的修改,是按照要修改字段的順序來依次處理,處理完一個(gè)要修改字段的所有詞后再轉(zhuǎn)入處理下一個(gè)要修改的字段,直到所有要修改的字段都處理完畢。
[0094]步驟S403、在所有字段的每一個(gè)詞都處理完畢后,根據(jù)格式為四個(gè)文件寫好文件尾。
[0095]當(dāng)每個(gè)字段里的每一個(gè)詞都被處理完畢,需要為每一個(gè)索引文件寫好文件尾,這樣才能得到符合索引格式的完整文件。
[0096]需要說明的是,本實(shí)施例中FST (Finite State Transducer),是Lucene的數(shù)據(jù)結(jié)構(gòu),是一種有限狀態(tài)轉(zhuǎn)移機(jī),具有空間占用小,通過對詞典中單詞前綴和后綴的重復(fù)利用,壓縮了存儲(chǔ)空間,查詢速度塊。關(guān)于FST,這里不再贅述。
[0097]步驟S5、等到所有的段都處理完畢,用新生成的四個(gè)倒排文件集中替換原索引文件夾中對應(yīng)的文件。
[0098]這么處理,可以保證即使中途修改失敗也不會(huì)破壞原索引文件,對原數(shù)據(jù)的保護(hù)至關(guān)重要。
[0099]通過上述步驟單個(gè)詞的修改方法已經(jīng)實(shí)現(xiàn),如果要將它推廣到批量詞的修改,那么一種直觀的想法就是用一個(gè)循環(huán)來將所有的詞一個(gè)接一個(gè)的修改。如果詞的數(shù)量比較多,那它對時(shí)間的要求就會(huì)讓人難以忍受。如在實(shí)際測試的時(shí)候,10億量數(shù)據(jù)單個(gè)詞的修改要耗時(shí)半個(gè)小時(shí)左右,而一旦修改的詞成倍增加時(shí),它的耗時(shí)也需要成倍增加。
[0100]為了減少處理的時(shí)間,本實(shí)施例的方法還進(jìn)一步包括批量處理的方法,如圖4所示,包括如下步驟:
[0101]步驟F1、獲取修改參數(shù)中所有要修改的舊詞以及修改后的新詞,將所有的新詞按照字典順序進(jìn)彳T排序;
[0102]按照字典順序進(jìn)行排序,符合索引文件的格式,會(huì)節(jié)約后續(xù)步驟處理時(shí)間。
[0103]步驟F2、遍歷索引文件夾中所有的段,獲取段中所有舊詞所對應(yīng)的信息;
[0104]步驟F3、對將要修改為同一個(gè)新詞的所有不同舊詞對應(yīng)的信息進(jìn)行合并;
[0105]步驟F4、按照步驟SI?步驟S5的步驟對每個(gè)新詞及其對應(yīng)的所有不同舊詞進(jìn)行處理。
[0106]需要說明的是,這里對將要修改為同一個(gè)新詞的所有不同舊詞對應(yīng)的信息進(jìn)行合并,與前面所說的將與新詞相同的詞對應(yīng)的信息與舊詞對應(yīng)的信息進(jìn)行合并方法相同,這里不再贅述。
[0107]而對于合并后的處理,則是將要修改為同一個(gè)新詞的所有不同舊詞看作一個(gè)舊詞進(jìn)行處理。
[0108]上述無論是對單個(gè)詞的修改,還是批量修改,都只能運(yùn)行在靜態(tài)情況之下,即在修改的同時(shí),不能創(chuàng)建索引。而在實(shí)際應(yīng)用中,這種效果會(huì)帶來較差的客戶體驗(yàn),因此需要修改的同時(shí)能夠動(dòng)態(tài)的創(chuàng)建索引以及滿足查詢功能。而動(dòng)態(tài)的難點(diǎn)是,索引文件夾中的段一直在參與合并過程,這會(huì)導(dǎo)致段的名字一直變化。因?yàn)楹喜⒌谋举|(zhì)就是將多個(gè)小段合并成一個(gè)大段,然后刪掉原來的小段,這樣就給修改帶來了麻煩。很有可能當(dāng)修改完成某個(gè)段之后,發(fā)現(xiàn)這個(gè)段的信息早已經(jīng)被合入了新段,而且它在文件夾中早已不存在了。解決這個(gè)問題的關(guān)鍵是修改合并的策略,即保證在修改索引期間,要修改的那部分段不參與合并過程,等到修改完成之后再將這部分段釋放,繼續(xù)參與合并過程。
[0109]動(dòng)態(tài)修改索引文件的具體算法實(shí)現(xiàn)流程如圖5所示:
[0110]步驟Gl、停止創(chuàng)建索引,結(jié)束正在進(jìn)行的段合并過程。
[0111]步驟G2、獲取索引文件夾中的段名,寫入某特定文件夾下的info, txt文件。同時(shí)需要修改合并策略,保證存在于info, txt文件中的段不參與合并過程。
[0112]步驟G3、重新使能索引的創(chuàng)建,執(zhí)行步驟I?5,完成索引文件的修改。
[0113]步驟G4、刪除info, txt文件,使索引文件的修改立即被查詢獲取。
[0114]刪除info, txt的目的是允許該文件中的所包含的段可以重新進(jìn)入合并的隊(duì)列中。調(diào)用IndexWriter中的commitO方法,可以認(rèn)為是對當(dāng)前的索引進(jìn)行了一次提交,使得索引文件的修改可以立即被查詢獲取。
[0115]本實(shí)施例還提出了實(shí)現(xiàn)上述方法的裝置,包括
[0116]參數(shù)獲取模塊,用于獲取修改參數(shù),包括要修改字段、要修改的舊詞以及修改后的新詞;
[0117]修改判斷模塊,用于對索引文件夾中每一個(gè)段,查找該段中要修改字段是否存在舊詞,如果存在則轉(zhuǎn)入信息合并模塊進(jìn)行處理,否則放棄對該段的修改;
[0118]信息合并模塊,用于獲取當(dāng)前處理的段中舊詞所對應(yīng)的信息,判斷當(dāng)前處理的段中要修改字段是否已經(jīng)存在與新詞相同的詞,如果存在與新詞相同的詞,則將與新詞相同的詞對應(yīng)的信息與舊詞對應(yīng)的信息進(jìn)行合并,生成新詞對應(yīng)的信息,否則直接根據(jù)舊詞對應(yīng)的信息生成新詞對應(yīng)的信息;
[0119]倒排文件生成模塊,用于根據(jù)當(dāng)前處理的段中原先就存在的除舊詞和新詞外其他詞對應(yīng)的信息、以及新詞對應(yīng)的信息,新生成四個(gè)倒排文件segment, tim、segment, tip、segment, doc 以及 segment, pos ;
[0120]文件替換模塊,用于等到所有的段都處理完畢,用新生成的四個(gè)倒排文件集中替換原索引文件夾中對應(yīng)的文件。
[0121]為了進(jìn)行批量詞的處理,本實(shí)施例的裝置還包括批量詞合并模塊,該批量詞合并模塊獲取修改參數(shù)中所有要修改的舊詞以及修改后的新詞,將所有的新詞按照字典順序進(jìn)行排序,遍歷索引文件夾中所有的段,獲取段中所有舊詞所對應(yīng)的信息,對將要修改為同一個(gè)新詞的所有不同舊詞對應(yīng)的信息進(jìn)行合并,作為一個(gè)舊詞來處理。
[0122]為了實(shí)現(xiàn)動(dòng)態(tài)處理,本實(shí)施例的裝置還包括動(dòng)態(tài)管理模塊,動(dòng)態(tài)管理模塊在進(jìn)行修改索引文件中詞之前,先停止創(chuàng)建索引,結(jié)束正在進(jìn)行的段合并過程,獲取索引文件夾中所有段的名稱,寫入特定文件夾下的info, txt文件,使存在于info, txt文件中的段不參與合并過程,并重新使能索引的創(chuàng)建;并在修改完成后,刪除info, txt文件,使索引文件的修改立即被查詢獲取。
[0123]以上實(shí)施例僅用以說明本發(fā)明的技術(shù)方案而非對其進(jìn)行限制,在不背離本發(fā)明精神及其實(shí)質(zhì)的情況下,熟悉本領(lǐng)域的技術(shù)人員當(dāng)可根據(jù)本發(fā)明作出各種相應(yīng)的改變和變形,但這些相應(yīng)的改變和變形都應(yīng)屬于本發(fā)明所附的權(quán)利要求的保護(hù)范圍。
【權(quán)利要求】
1.一種修改Lucene索引文件中詞的方法,其特征在于,所述方法包括步驟: 步驟1、獲取修改參數(shù),包括要修改字段、要修改的舊詞以及修改后的新詞; 步驟2、對于索引文件夾中每一個(gè)段,查找該段中要修改字段是否存在舊詞,如果存在則進(jìn)入下一步,否則放棄對該段的修改; 步驟3、獲取當(dāng)前處理的段中舊詞所對應(yīng)的信息,判斷當(dāng)前處理的段中要修改字段是否已經(jīng)存在與新詞相同的詞,如果存在與新詞相同的詞,則將與新詞相同的詞對應(yīng)的信息與舊詞對應(yīng)的信息進(jìn)行合并,生成新詞對應(yīng)的信息,否則直接根據(jù)舊詞對應(yīng)的信息生成新詞對應(yīng)的信息; 步驟4、根據(jù)當(dāng)前處理的段中原先就存在的除舊詞和新詞外其他詞對應(yīng)的信息、以及新詞對應(yīng)的信息,新生成四個(gè)倒排文件segment, tim、segment, tip、segment, doc以及segment, pos ; 步驟5、等到所有的段都處理完畢,用新生成的四個(gè)倒排文件集中替換原索引文件夾中對應(yīng)的文件。
2.根據(jù)權(quán)利要求1所述的修改Lucene索引文件中詞的方法,其特征在于,在所述步驟I之前,所述方法還包括步驟: 獲取修改參數(shù)中所有要修改的舊詞以及修改后的新詞,將所有的新詞按照字典順序進(jìn)tx排序; 遍歷索引文件夾中所有的段,獲取段中所有舊詞所對應(yīng)的信息; 對將要修改為同一個(gè)新詞的所有不同舊詞對應(yīng)的信息進(jìn)行合并,作為一個(gè)舊詞來處理。
3.根據(jù)權(quán)利要求1或2所述的修改Lucene索引文件中詞的方法,其特征在于,在所述方法之前還包括步驟: 停止創(chuàng)建索引,結(jié)束正在進(jìn)行的段合并過程; 獲取索引文件夾中所有段的名稱,寫入特定文件夾下的info, txt文件,使存在于info, txt文件中的段不參與合并過程; 重新使能索引的創(chuàng)建; 而在所述方法步驟5之后,所述方法還包括步驟: 刪除info, txt文件,使索引文件的修改立即被查詢獲取。
4.根據(jù)權(quán)利要求3所述的修改Lucene索引文件中詞的方法,其特征在于,所述對應(yīng)的信息包括文檔號和出現(xiàn)的頻率,所述將與新詞相同的詞對應(yīng)的信息與舊詞對應(yīng)的信息進(jìn)行合并,包括步驟: 將與新詞相同的詞,以及舊詞看作同一個(gè)詞,重新按照Lucene既定規(guī)則組織兩者對應(yīng)的信息,以重新組織得到的文檔號作為他們對應(yīng)的新詞的文檔號,以兩者的出現(xiàn)頻率的和作為他們對應(yīng)的新詞的出現(xiàn)頻率。
5.根據(jù)權(quán)利要求3所述的修改Lucene索引文件中詞的方法,其特征在于,所述步驟4具體包括步驟: 步驟 S4.1、對要生成的四個(gè)索弓I 文件 segment, tim、segment, tip、segment, doc、segment, pos創(chuàng)建內(nèi)存文件,即開辟內(nèi)存空間,并且按照固定格式寫好文件頭; 步驟S4.2、針對每一個(gè)字段,按照除舊詞外的其他詞與新詞的字典順序,依次將他們的對應(yīng)的信息,以及位置信息,寫入segment, doc、segment, pos文件,根據(jù)FST原理,生成termBlock,并寫入 segment, tim、segment, tip 文件; 步驟S4.3、在所有字段的每一個(gè)詞都處理完畢后,根據(jù)固定格式為四個(gè)文件寫好文件尾。
6.一種修改Lucene索引文件中詞的裝置,其特征在于,所述裝置包括: 參數(shù)獲取模塊,用于獲取修改參數(shù),包括要修改字段、要修改的舊詞以及修改后的新詞; 修改判斷模塊,用于對索引文件夾中每一個(gè)段,查找該段中要修改字段是否存在舊詞,如果存在則轉(zhuǎn)入信息合并模塊進(jìn)行處理,否則放棄對該段的修改; 信息合并模塊,用于獲取當(dāng)前處理的段中舊詞所對應(yīng)的信息,判斷當(dāng)前處理的段中要修改字段是否已經(jīng)存在與新詞相同的詞,如果存在與新詞相同的詞,則將與新詞相同的詞對應(yīng)的信息與舊詞對應(yīng)的信息進(jìn)行合并,生成新詞對應(yīng)的信息,否則直接根據(jù)舊詞對應(yīng)的信息生成新詞對應(yīng)的信息; 倒排文件生成模塊,用于根據(jù)當(dāng)前處理的段中原先就存在的除舊詞和新詞外其他詞對應(yīng)的信息、以及新詞對應(yīng)的信息,新生成四個(gè)倒排文件segment, tim、segment, tip、segment, doc 以及 segment, pos ; 文件替換模塊,用于等到所有的段都處理完畢,用新生成的四個(gè)倒排文件集中替換原索引文件夾中對應(yīng)的文件。
7.根據(jù)權(quán)利要求6所述的修改Lucene索引文件中詞的裝置,其特征在于,所述裝置還包括批量詞合并模塊,所述批量詞合并模塊用于執(zhí)行以下操作: 獲取修改參數(shù)中所有要修改的舊詞以及修改后的新詞,將所有的新詞按照字典順序進(jìn)行排序; 遍歷索引文件夾中所有的段,獲取段中所有舊詞所對應(yīng)的信息; 對將要修改為同一個(gè)新詞的所有不同舊詞對應(yīng)的信息進(jìn)行合并,作為一個(gè)舊詞來處理。
8.根據(jù)權(quán)利要求6或7所述的修改Lucene索引文件中詞的裝置,其特征在于,所述裝置還包括動(dòng)態(tài)管理模塊,所述動(dòng)態(tài)管理模塊用于在進(jìn)行修改索引文件中詞之前執(zhí)行以下操作: 停止創(chuàng)建索引,結(jié)束正在進(jìn)行的段合并過程; 獲取索引文件夾中所有段的名稱,寫入特定文件夾下的info, txt文件,使保證存在于info, txt文件中的段不參與合并過程; 重新使能索引的創(chuàng)建; 并在修改完成后,執(zhí)行如下操作:刪除info, txt文件,使索引文件的修改立即被查詢獲取。
9.根據(jù)權(quán)利要求8所述的修改Lucene索引文件中詞的裝置,其特征在于,所述信息合并模塊在將與新詞相同的詞對應(yīng)的信息與舊詞對應(yīng)的信息進(jìn)行合并時(shí),執(zhí)行如下操作:將與新詞相同的詞,以及舊詞看作同一個(gè)詞,重新按照Lucene既定規(guī)則組織兩者對應(yīng)的信息,以重新組織得到的文檔號作為他們對應(yīng)的新詞的文檔號,以兩者的出現(xiàn)頻率的和作為他們對應(yīng)的新詞的出現(xiàn)頻率。
10.根據(jù)權(quán)利要求8所述的修改Lucene索引文件中詞的裝置,其特征在于,所述倒排文件生成模塊在生成四個(gè)倒排文件時(shí),執(zhí)行如下操作: 對要生成的四個(gè)索弓I文件 segment, tim、segment, tip、segment, doc、segment, pos 創(chuàng)建內(nèi)存文件,即開辟內(nèi)存空間,并且按照固定格式寫好文件頭; 針對每一個(gè)字段,按照除舊詞外的其他詞與新詞的字典順序,依次將他們的對應(yīng)的信息,以及位置信息,寫入segment, doc、segment, pos文件,根據(jù)FST原理,生成termBlock,并寫入 segment, tim、segment, tip 文件; 在所有字段的每一個(gè)詞都處理完畢后,根據(jù)固定格式為四個(gè)文件寫好文件尾。
【文檔編號】G06F17/30GK104462558SQ201410830430
【公開日】2015年3月25日 申請日期:2014年12月26日 優(yōu)先權(quán)日:2014年12月26日
【發(fā)明者】王新成 申請人:浙江宇視科技有限公司