本發(fā)明涉及數(shù)據(jù)索引領(lǐng)域,具體涉及一種基于字符串后綴的數(shù)據(jù)索引方法。
背景技術(shù):
就目前而言,數(shù)據(jù)模糊查詢的方法主要有以下三種:
通過數(shù)據(jù)庫自身提供的“l(fā)ike”模糊匹配查詢功能。
這種方式雖然簡單易用,但是無法用到索引。數(shù)據(jù)量不大時(shí),還可以承受;但數(shù)據(jù)量稍大,查詢的速度就非常慢了,難以滿足融合媒體時(shí)代的需求。
通過數(shù)據(jù)庫的擴(kuò)展功能,如利用db全文索引(如mysql中提供的fulltextmatch函數(shù))。
這種方式的缺點(diǎn)主要源于國內(nèi)外語言文化的差異,在中文分詞上存在很大缺陷,不能很好地支持中文字符的檢索。雖然有些國內(nèi)人士通過開發(fā)相應(yīng)的插件滿足了中文檢索的需求,但是在以下兩種情況下卻表現(xiàn)出了索引滯后性:一方面,為避免檢索過程中出現(xiàn)漏數(shù)據(jù)、數(shù)據(jù)不準(zhǔn)確的情況,需要人為干預(yù)維護(hù)索引庫;另外,由于詞庫是基于分詞的,在執(zhí)行不具有明顯詞義的查詢時(shí),無法檢索到想要的數(shù)據(jù)。
通過第三方平臺(tái)提供全文檢索的功能,如:lucene、solr。
這種方式不僅存在第二種方式的問題,索引更新延遲較長、無法做到事務(wù)一致性等問題,而且搭建非常復(fù)雜。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的在于克服現(xiàn)有技術(shù)的不足,提供一種基于字符串后綴的數(shù)據(jù)索引方法,該方法從非拉丁語系的語言體系出發(fā),以字符為單位利用字符串后綴排序算法以及b+樹算法構(gòu)建索引,解決模糊查詢的效率和準(zhǔn)確度問題。
本發(fā)明的目的是通過以下技術(shù)方案來實(shí)現(xiàn)的:
一種基于字符串后綴的數(shù)據(jù)索引方法,包括創(chuàng)建索引步驟和數(shù)據(jù)索引步驟,所述創(chuàng)建索引步驟包括以下子步驟:
s1:寫入數(shù)據(jù),并提取元數(shù)據(jù)、行id、添加字符串后綴;
s2:建立索引,基于字符串后綴對(duì)所有字符進(jìn)行排列組合分詞并對(duì)分詞進(jìn)行排序,利用b+樹算法構(gòu)建索引;
s3:事務(wù)判斷,對(duì)寫入數(shù)據(jù)事務(wù)進(jìn)行判定,若寫入成功則解開事務(wù)鎖;若寫入失敗,則進(jìn)行邏輯刪除并回收數(shù)據(jù);
所述數(shù)據(jù)索引步驟包括以下子步驟
s01:索引匹配,計(jì)算索引對(duì)應(yīng)的編碼數(shù)值并將該編碼數(shù)值在b+樹中匹配;
s02:獲取索引指針列表,在b+樹中快速定位到索引的編碼數(shù)值,該數(shù)值的葉子節(jié)點(diǎn)即為包含該索引關(guān)鍵字的索引指針列表;
s03:讀取數(shù)據(jù),根據(jù)索引指針數(shù)組找到索引結(jié)果,對(duì)索引結(jié)果進(jìn)行判斷,若索引緩存區(qū)的時(shí)間戳與原始數(shù)據(jù)的時(shí)間戳一致,則直接返回結(jié)果;若不一致,則讀取原始數(shù)據(jù)的值,并將原始數(shù)據(jù)同步給索引緩存區(qū),更新索引。
進(jìn)一步的,所述的步驟s1寫入數(shù)據(jù)包括以下子步驟:
s11:修改或插入新數(shù)據(jù)形成新表,開啟事務(wù)鎖,鎖定新表,避免臟數(shù)據(jù);
s12:將新表數(shù)據(jù)同步到舊表,新表和舊表之間通過時(shí)間戳保證數(shù)據(jù)一致性;
s13:將更新的數(shù)據(jù)拷貝到索引緩存區(qū),并提取元數(shù)據(jù)、行id、添加字符串后綴。
進(jìn)一步的,所述的索引緩存區(qū)的數(shù)據(jù)結(jié)構(gòu)如下:
索引緩存區(qū)的每一條數(shù)據(jù)都由元數(shù)據(jù)、行id和數(shù)據(jù)內(nèi)容構(gòu)成;
元數(shù)據(jù):包括時(shí)間戳、索引+長度等。時(shí)間戳用于判斷索引緩存區(qū)的數(shù)據(jù)與原始數(shù)據(jù)是否相同,若不相同則同步數(shù)據(jù);索引+長度可以確定索引的詞組;
行id:記錄該條數(shù)據(jù)的行id,相同的詞組可能出現(xiàn)在不同的數(shù)據(jù)中,行id作為數(shù)據(jù)條目的區(qū)分;
數(shù)據(jù)內(nèi)容:包括數(shù)據(jù)內(nèi)容及字符串后綴,以字符為單位加5個(gè)字符或6個(gè)字符的字符串后綴,字符串后綴用于排列組合進(jìn)行分詞建立索引。
進(jìn)一步的,所述的步驟s2建立索引包括以下子步驟:
s21:基于字符串后綴采用后綴排序算法對(duì)這條數(shù)據(jù)的所有字符進(jìn)行排列組合分詞;
s22:按拼音+編碼的方式計(jì)算分詞的數(shù)值并進(jìn)行排序;
s23:將排好的序列利用b+樹算法構(gòu)建索引,其中b+樹的分支節(jié)點(diǎn)保存下級(jí)節(jié)點(diǎn)范圍數(shù)組,b+樹的葉子節(jié)點(diǎn)保存索引緩存區(qū)指針列表數(shù)組。
進(jìn)一步的,所述的步驟s01索引匹配具體包括根據(jù)索引和長度計(jì)算該索引對(duì)應(yīng)的編碼數(shù)值,將計(jì)算出的編碼數(shù)值在b+樹中匹配。
進(jìn)一步的,所述的步驟s02獲取索引指針列表具體包括,b+樹的分支節(jié)點(diǎn)表示其下級(jí)節(jié)點(diǎn)的編碼數(shù)值范圍,依次對(duì)范圍進(jìn)行判定,快速定位到索引的編碼數(shù)值,該數(shù)值的葉子節(jié)點(diǎn)即為包含該索引關(guān)鍵字的索引指針列表。
進(jìn)一步的,所述的步驟s03讀取數(shù)據(jù)包括:根據(jù)索引指針數(shù)組指向的行id,找到索引緩存區(qū)的索引結(jié)果;對(duì)索引緩存區(qū)的索引結(jié)果進(jìn)行判斷,若索引緩存區(qū)的時(shí)間戳與原始數(shù)據(jù)的時(shí)間戳一致,則直接返回結(jié)果;若不一致,則讀取原始數(shù)據(jù)的值,并將原始數(shù)據(jù)同步給索引緩存區(qū),更新索引。
本發(fā)明的有益效果是:本發(fā)明能夠有效支持“l(fā)ike”類模糊匹配,并且支持索引,避免了大量數(shù)據(jù)情況下“l(fā)ike”類模糊匹配全表檢索的瓶頸,能夠顯著提高查詢效率;本發(fā)明從非拉丁語系的語言系統(tǒng)出發(fā),能很好地支持中文的全文檢索:每一條數(shù)據(jù)都基于字符做排列組合,能夠支持不具有明顯詞義的檢索,另外也無需人為去維護(hù)索引,不存在索引的滯后性。
附圖說明
圖1是本發(fā)明的流程圖。
具體實(shí)施方式
下面結(jié)合附圖進(jìn)一步詳細(xì)描述本發(fā)明的技術(shù)方案,但本發(fā)明的保護(hù)范圍不局限于以下所述。
如圖1所示,
一種基于字符串后綴的數(shù)據(jù)索引方法,具體包括以下兩部分;
【創(chuàng)建索引的過程】
s1:寫入數(shù)據(jù)
修改或插入新數(shù)據(jù)形成新表,開啟事務(wù)鎖,鎖定新表,避免臟數(shù)據(jù)。
將新表數(shù)據(jù)同步到舊表,新表和舊表之間通過時(shí)間戳保證數(shù)據(jù)一致性。
將更新的數(shù)據(jù)拷貝到索引緩存區(qū),并提取元數(shù)據(jù)、行id、添加字符串后綴。
索引緩存區(qū)的作用主要有兩點(diǎn):一、保護(hù)原始數(shù)據(jù),二、提取和存儲(chǔ)元數(shù)據(jù),建立索引。
索引緩存區(qū)的每一條數(shù)據(jù)都由元數(shù)據(jù)、行id和數(shù)據(jù)內(nèi)容構(gòu)成。
元數(shù)據(jù):包括時(shí)間戳、索引+長度等。時(shí)間戳用于判斷索引緩存區(qū)的數(shù)據(jù)與原始數(shù)據(jù)是否相同,若不相同則同步數(shù)據(jù);索引+長度可以確定索引的詞組。
行id:記錄該條數(shù)據(jù)的行id,相同的詞組可能出現(xiàn)在不同的數(shù)據(jù)中,行id作為數(shù)據(jù)條目的區(qū)分。
數(shù)據(jù)內(nèi)容:包括數(shù)據(jù)內(nèi)容及字符串后綴,以字符為單位加5個(gè)字符或6個(gè)字符的字符串后綴,字符串后綴用于排列組合進(jìn)行分詞建立索引。
s2:建立索引
基于字符串后綴采用后綴排序算法對(duì)這條數(shù)據(jù)的所有字符進(jìn)行排列組合分詞。
按拼音+編碼的方式計(jì)算分詞的數(shù)值并進(jìn)行排序
將排好的序列利用b+樹算法構(gòu)建索引,具體如下:
lb+樹的分支節(jié)點(diǎn)保存下級(jí)節(jié)點(diǎn)范圍數(shù)組
lb+樹的葉子節(jié)點(diǎn)保存索引緩存區(qū)指針列表數(shù)組
s3:事務(wù)判定
對(duì)寫入數(shù)據(jù)事務(wù)進(jìn)行判定,若寫入成功則解開事務(wù)鎖;若寫入失敗,則進(jìn)行邏輯刪除并回收數(shù)據(jù)。
【數(shù)據(jù)索引的過程】
s11:索引匹配
根據(jù)索引和長度計(jì)算該索引對(duì)應(yīng)的編碼數(shù)值
將計(jì)算出的編碼數(shù)值在b+樹中匹配
s12:獲取索引指針列表
b+樹的分支節(jié)點(diǎn)表示其下級(jí)節(jié)點(diǎn)的編碼數(shù)值范圍,依次對(duì)范圍進(jìn)行判定,快速定位到索引的編碼數(shù)值,該數(shù)值的葉子節(jié)點(diǎn)即為包含該索引關(guān)鍵字的索引指針列表
s13:讀取數(shù)據(jù)
根據(jù)索引指針數(shù)組指向的行id,找到索引緩存區(qū)的索引結(jié)果。
對(duì)索引緩存區(qū)的索引結(jié)果進(jìn)行判斷,若索引緩存區(qū)的時(shí)間戳與原始數(shù)據(jù)的時(shí)間戳一致,則直接返回結(jié)果;若不一致,則讀取原始數(shù)據(jù)的值,并將原始數(shù)據(jù)同步給索引緩存區(qū),更新索引。
如圖1所示,其具體的工作原理如下:
開始;
修改或插入新數(shù)據(jù)形成新表;
開啟事務(wù)鎖;
寫入數(shù)據(jù),將新表數(shù)據(jù)同步到舊表;
將原始數(shù)據(jù)拷貝到索引緩存區(qū)或索引元數(shù)據(jù)區(qū);
對(duì)數(shù)據(jù)進(jìn)行排列組合分詞;
對(duì)分詞按拼音+編碼進(jìn)行排序;
構(gòu)建b+樹數(shù)據(jù)索引;
判斷;
成功,解開事務(wù)鎖,索引停止。
失敗,邏輯刪除,回收器進(jìn)行數(shù)據(jù)回收,索引停止。
以上所述僅是本發(fā)明的優(yōu)選實(shí)施方式,應(yīng)當(dāng)理解本發(fā)明并非局限于本文所披露的形式,不應(yīng)看作是對(duì)其他實(shí)施例的排除,而可用于各種其他組合、修改和環(huán)境,并能夠在本文所述構(gòu)想范圍內(nèi),通過上述教導(dǎo)或相關(guān)領(lǐng)域的技術(shù)或知識(shí)進(jìn)行改動(dòng)。而本領(lǐng)域人員所進(jìn)行的改動(dòng)和變化不脫離本發(fā)明的精神和范圍,則都應(yīng)在本發(fā)明所附權(quán)利要求的保護(hù)范圍內(nèi)。