專利名稱:一種建立倒排索引的方法及倒排索引裝置的制作方法
技術領域:
本發明涉及數據信息索引技術,特別涉及一種建立倒排索引的方法及倒排索引裝置。
背景技術:
目前,數據搜索技術即搜索引擎技術已成為數據信息處理的一個熱門技術,而索 引是數據搜索技術的最重要的組成部分,通過構建結構簡單、有效、性能優良的索引,可以 幫助用戶快捷地獲取查詢所需的信息,因而,索引的性能直接影響查詢效率。目前數據搜索技術的索引一般采用倒排索引,常用的創建、查詢方式包括二分法、 字典樹(Trie樹)法和哈希法,其中,二分法是將用于創建索引的詞條按照一定的順序排 列,例如,按照字典順序或者漢字內碼順序有序排列,并存儲詞條對應的數據,然后根據用 戶輸入的搜索關鍵詞,采用二分法從順序排列中的詞條中查找該搜索關鍵詞對應的詞條, 再根據查詢得到的詞條獲取相應的數據,將數據信息向用戶顯示輸出;Trie樹法是將用于 創建索引的詞匯表中的關鍵詞以Trie樹的形式組織起來,然后采用Trie樹查找方式進行 查詢;哈希法是將用于建立索引的詞條散列成一個哈希值,將該哈希值作為詞條的訪問地 址,例如,根據詞條首字構造二維數組,數組索引值根據詞條首字的漢字編碼確定,數組元 素值指向與索引值相對應的漢字為首字的哈希表,該哈希表用于存儲首字相同的詞條除去 首字后的后綴信息,根據詞條后綴漢字編碼,由哈希函數計算的哈希值確定詞條在哈希表 中的位置,通過詞條首字的漢字編碼確定數組索引值,在數組中找到相應的數組元素,確定 該詞條首字對應的哈希表,再根據詞條后綴的漢字編碼用哈希函數計算哈希值,確定該詞 條在哈希表中的位置。上述二分法索引構建及查找、Trie樹法索引構建及查找和哈希法索 引構建及查找的具體流程可參見相關技術文獻,在此不再贅述。由上述可見,目前采用的二分法,由于需要對詞條或詞匯表按字典順序排列,對于 插入的文檔需要反復地調用排序算法和查找算法,索引合并時還需要通過堆排序等方法 合并多個有序的詞匯表,造成構建的索引結構較為復雜、查找效率一般,查找時間復雜度 高;對于trie樹法,由于索引的構建以詞匯表中的關鍵詞以Trie樹的形式進行組織,在 詞匯表較大時,所需的存儲空間大、實現也較為復雜,其查找時間與關鍵詞的長度相關,與 詞匯表中關鍵詞的個數無關,因而,在詞匯表較大時,具有較大的速度優勢,時間復雜度為 Log(詞匯表長度),構建的索引查找效率一般好于二分查找,但詞匯表較大時所需存儲空 間大、實現復雜;而對于哈希法,由于采用數組和哈希表相結合的詞庫構造方法,哈希表和 詞條都可以根據構成詞條的首個漢字編碼直接找到,索引構建簡單、查找效率較高,但現有 的構建哈希法倒排索引及查找方式的哈希函數只能適用于中文索引及搜索,搜索范圍小、 且哈希沖突的概率較高,針對首字計算哈希值進行查詢,需要多次查詢才能獲取所需信息, 查詢時間較長,從而使得構建的搜索引擎倒排索引可靠性較差,查詢效率較低。
發明內容
有鑒于此,本發明的主要目的在于提出一種建立倒排索引的方法,擴大索引及搜 索范圍、降低哈希沖突的概率、提高查詢效率。本發明的另一目的在于提出一種建立倒排索引的裝置,擴大索引及搜索范圍、降 低哈希沖突的概率、提高查詢效率。為達到上述目的,本發明提供了一種建立倒排索引的方法,該方法包括A、提取待建立倒排索引的文檔的域名信息以及該域名包含的詞條對應的數據信息;B、獲取域名對應的漢字編碼或ASC碼,根據獲取的GBK碼或ASC碼以及預先設定 的中英文哈希函數計算域名哈希值;C、查詢哈希域表中是否存儲有該域名哈希值,如果未存儲有,執行步驟D,否則,執 行步驟E;D、將獲取的該域名哈希值存儲在哈希域表中,執行步驟E ;E、判斷數據信息表中是否存儲有提取的詞條對應的數據信息,如果沒有,將提取 的詞條對應的數據信息存儲在數據信息表中。所述預先設定的哈希函數為Hash (x) = H0 ;χ = 0(1)Hash (χ) = (w ο r d G B K [ χ ] [ 0 ] * k J w ο r d G B K [ χ ] [ 1 ] * k 丄 + χ 彡 1 (2)Hash (χ-1) *k2) Λ (Hash(x_l) << k3) Λ (Hash(x_l) >> k4);Hash(x) = (wordASC [x] ^ki+Hash (χ-1) *k2) Λ (Hash(x_l) << k3) ;χ 彡 1(3)Λ (Hash(x-l) >> k4)
χHash(X)^YjHash(X)(4)
χ=Ι式中,Λ為位“異或”運算符,<<為位“左移”運算符,>>為位“右移”運算符,χ 表示進行哈希運算的字符在字符串中的位置,字符串的長度為x(0 < χ < X);如果字符串對應的第χ個位置為中文,則使用公式⑵;如果字符串對應的第χ個位置為英文,則使用公式(3);wordGBK[x]
為字符串中第χ個中文字漢字編碼中的GBK碼的高位;wordGBK[x] [1]為字符串中第χ個中文字的GBK碼的低位;wordASC [χ]為字符串中第χ個英文字母的ASC碼;H0為設置的字符串的初始哈希值;Ic1為GBK碼或ASC碼系數,k2為第x_l個字符哈希值系數,k3、k4為移位運算符系數。所述H。= 166777619 ;^ = 1777 ;k2 = 311 ;k3 = 4 ;k4 =洲。倒排索引包括非指定域結構、和/或,指定域結構,域結構包括用于按照預先設定 的哈希函數對域信息中包含的域名進行哈希計算、存儲計算得到的域名哈希值的哈希域 表,以及用于存放域名對應的數據或者對應數據的索引的數據信息表。所述域結構為非指定域結構,所述數據信息表包括用于存儲詞條哈希值的詞條哈 希表,以及用于存儲包含詞條信息的域名以及該詞條對應的數據信息的詞條屬性表。
所述步驟B之前進一步包括利用預先設置的哈希函數計算詞條的哈希值,根據計算獲取的詞條哈希值查找詞 條哈希表,如果詞條哈希表中未存在該詞條哈希值,將計算獲取的詞條哈希值存儲至詞條 哈希表中,將該詞條對應的域名以及該詞條對應的數據信息存儲至詞條屬性表中,然后執 行步驟B,否則,直接執行步驟B。所述步驟A進一步包括判斷提取的域名或詞條是否需要進行分詞處理,如果需 要,使用預先設置的中文分詞程序進行分詞。進一步包括如果詞條哈希表中存儲的詞條哈希值與輸入的詞條哈希值相同,則 判斷存儲的詞條哈希值對應的詞條是否與輸入的詞條哈希值對應的詞條相同,如果不相 同,則將輸入的詞條哈希值加一后再判斷詞條哈希表中是否存在相同的哈希值,如果不存 在,則存儲輸入的加一后的詞條哈希值并修改原存儲的詞條哈希值。所述步驟E后進一步包括F11、利用預先設置的哈希函數計算用戶輸入的搜索關鍵詞的哈希值;F12、查找詞條哈希表中是否有與該搜索關鍵詞的哈希值匹配的哈希值,如果沒 有,執行步驟F13,如果有,執行步驟F14 ;F13、將該搜索關鍵詞的哈希值加1,判斷將該搜索關鍵詞的哈希值加1的次數是 否超過預先設定的次數,如果否,返回執行步驟F12,如果是,結束流程;F14、將詞條屬性表中該搜索關鍵詞對應的數據信息返回給用戶。所述步驟Fl 1進一步包括判斷用戶輸入的搜索關鍵詞是否需要進行分詞處理,如果需要,使用預先設置的 中文分詞程序進行分詞,獲取分詞處理的搜索關鍵詞對應的GBK碼或ASC碼,根據獲取的 GBK碼或ASC碼以及預先設置的哈希函數計算哈希值。所述域結構為指定域結構,所述數據信息表包括用于存儲詞條哈希值的詞條哈希 表,以及用于存儲域名下的所有詞條對應的數據信息的哈希表的詞條屬性表。所述步驟E包括利用預先設置的哈希函數計算域名包含的詞條的哈希值,根據計算獲取的詞條哈 希值查找詞條哈希表,如果詞條哈希表中未存在該詞條哈希值,將該詞條對應的數據信息 存儲至詞條屬性表中,將該詞條哈希值存儲至詞條哈希表中,否則,結束流程。所述詞條屬性表進一步用于存儲詞條所屬文檔標識、以及詞條出現的頻率信息。所述步驟E后進一步包括F21、利用預先設置的哈希函數計算用戶輸入的搜索關鍵詞的哈希值;F22、查找哈希域表中是否存在該搜索關鍵詞的哈希值,如果不存在,執行步驟 F23,如果存在,執行步驟F24 ;F23、將該搜索關鍵詞的哈希值加1,判斷將該搜索關鍵詞的哈希值加1的次數是 否超過預先設定的次數,如果否,返回執行步驟F22,如果是,執行步驟F27 ;F24、查找詞條哈希表中是否存在該搜索關鍵詞的哈希值,如果不存在,執行步驟 F25,如果存在,執行步驟F26 ;F25、將該搜索關鍵詞的哈希值加1,判斷將該搜索關鍵詞的哈希值加1的次數是 否超過預先設定的次數,如果否,返回執行步驟F24,如果是,執行步驟F27 ;
步驟F26,將詞條屬性表中該搜索關鍵詞對應的數據信息返回給用戶;步驟F27,返回搜索該搜索關鍵詞失敗信息。所述方法進一步包括根據用戶輸入的需要刪除的域名,計算域名的哈希值,從指定域結構的哈希域表 中獲取與該域名的哈希值相同的哈希值;返回該相同哈希值對應的所有詞條;刪除所有詞條對應的數據信息;從非指定域結構的哈希詞條表中查找所述返回的所有詞條,從詞條屬性表中將所 述返回的所有詞條對應的域名刪除。所述方法進一步包括根據用戶輸入的需要刪除的詞條,獲取詞條對應的哈希值,從非指定域結構的哈 希詞條表中獲取匹配的哈希值;返回該詞條對應的所有域名;刪除該詞條對應的所有域名中的數據信息;從指定域結構的哈希域表中查找所述返回的所有域名,從詞條屬性表中將所述返 回的所有域名對應的詞條刪除。一種倒排索引裝置,該倒排索引系統包括域名及數據信息獲取單元、域名編碼單 元、哈希值計算單元、哈希域表單元以及數據信息表單元,其中,域名及數據信息獲取單元,用于提取待建立倒排索引的文檔的域名信息以及該域 名包含的詞條對應的數據信息,將域名輸出至域名編碼單元,將數據信息輸出至數據信息 表單元;域名編碼單元,用于存儲中文字符對應的漢字編碼以及英文字符對應的ASC碼, 根據接收的域名,查詢并獲取該域名對應的漢字編碼或ASC碼,輸出至哈希值計算單元;哈希值計算單元,用于存儲中英文哈希函數,根據域名編碼單元輸出的漢字編碼 或ASC碼、以及存儲的哈希函數,計算哈希值,輸出至哈希域表單元;哈希域表單元,用于接收哈希值計算單元輸出的哈希值,更新存儲的哈希值;數據信息表單元,用于接收域名及數據信息獲取單元輸出的數據信息,更新存儲 的數據信息。所述哈希值計算單元存儲的哈希函數為Hash (χ) = 166777619 ;χ = 0Hash (χ) = (wordGBK [χ]
* 1 777+wordGBK [χ] [ 1 ] * 1 777 + χ 彡 1 (5)Hash (χ-1) *311) Λ (Hash (χ-1) << 4) Λ (Hash (χ-1) >>28);Hash (χ) = (wordASC [χ] *1777+Hash (χ-1) 1) Λ (Hash (χ-1) << 4) ;χ 彡 1(6)Λ (Hash(x-l) >> 28)
χHash(X) = ^Hash(x)
χ=1式中,Λ為位“異或”運算符,<<為位“左移”運算符,>>為位“右移”運算符,χ 表示進行哈希運算的字符在字符串中的位置,字符串的長度為x(0 < χ < X);
如果字符串對應的第χ個位置為中文,則使用公式(5);如果字符串對應的第χ個位置為英文,則使用公式(6);wordGBK[x]
為字符串中第χ個中文字漢字編碼中的GBK碼的高位;wordGBK[x] [1]為字符串中第χ個中文字的GBK碼的低位;wordASC[x]為字符串中第χ個英文字母的ASC碼;Hash (χ) = 166777619為設置的字符串的初始哈希值。由上述的技術方案可見,本發明提供的一種建立倒排索引的方法及裝置,A、提取 待建立倒排索引的文檔的域名信息以及該域名包含的詞條對應的數據信息;B、獲取域名對 應的漢字編碼或ASC碼,根據獲取的GBK碼或ASC碼以及預先設定的中英文哈希函數計算 域名哈希值;C、查詢哈希域表中是否存儲有該域名哈希值,如果未存儲有,執行步驟D,否 則,執行步驟E ;D、將獲取的該域名哈希值存儲在哈希域表中,執行步驟E ;E、判斷數據信息 表中是否存儲有提取的詞條對應的數據信息,如果沒有,將提取的詞條對應的數據信息存 儲在數據信息表中。這樣,中英文哈希函數可以適用于計算中英文的哈希值,擴大了索引及 搜索范圍;以中英文哈希函數按照詞條包含的字符串對應的編碼進行哈希計算,哈希沖突 的概率小、匹配的精確度較高,從而減少了查詢所需的時間,提高了查詢時的搜索效率,從 而提高搜索引擎的整體性能。
圖1為本發明倒排索引結構示意圖。
圖2為本發明實施例的非指定域結構示意圖。
圖3為本發明指定域名結構示意圖。
圖4為本發明實施例建立倒排索引的方法流程示意圖。
圖5為本發明實施例在非指定域結構中建立倒排索引的方法流程示意圖。
圖6為本發明實施例在指定域結構中建立倒排索引的方法流程示意圖。
圖7為本發明實施例在非指定域結構中進行搜索的流程示意圖。
圖8為本發明實施例在指定域結構中進行搜索的流程示意圖。
圖9為本發明實施例刪除域名的流程示意圖。
圖10為本發明實施例刪除詞條的流程示意圖。
圖11為本發明實施例在非指定域結構中合并數據的流程示意圖。
圖12為本發明實施例在指定域結構中合并數據的流程示意圖。
圖13為本發明實施例倒排索引裝置結構示意圖。
具體實施例方式為使本發明的目的、技術方案和優點更加清楚,下面將結合附圖及具體實施例對 本發明作進一步地詳細描述。現有以哈希法構建的倒排索引,涉及的哈希函數只能適用于中文索引、且數組索 引值根據詞條首字的漢字編碼計算哈希值確定,使得哈希沖突較多,哈希值分布不均勻,從 而使得構建的搜索引擎倒排索引可靠性較差,影響查詢的準確性。本發明實施例中,考慮一個中文字的漢字編碼,例如,漢字內碼擴展規范(GBK,Chinese Internal Code Specification)碼或GB2312碼是唯一的,一個英文字母的ASC碼 也是唯一的,如果以詞條包含的所有中文字的漢字編碼和英文字母的ASC碼計算哈希值并 進行累加,則當用戶輸入搜索關鍵詞時,索引通過哈希函數計算搜索關鍵詞累加的哈希值, 而不是計算搜索關鍵詞首字的哈希值,匹配的精確度較高,從而減少查詢所需的時間,提高 查詢時的搜索效率;同時,可以針對中英文進行查詢,擴大了查詢范圍,方便了用戶獲取所 需的信息。實際應用中,由于將詞條包含的所有中文字的漢字編碼和英文字母的ASC碼計算 哈希值并進行累加可能使不同詞條計算得到的哈希值出現哈希沖突,本發明進一步考慮將 詞條中包含的每個中文字的漢字編碼以及每個英文字母的ASC碼分別乘以一個較大的質 數,這樣,就可以保障通過詞條得到的哈希值的唯一性;同時,通過將哈希函數的初始化哈 希值初始化為一個較大的質數、以及通過對哈希值進行移位運算來保證詞條對應的哈希值 的均勻性。基于上述分析,本發明提出的適合中英文的哈希函數參見式(1)至式G),該哈希 函數用于對一個字符串計算哈希值,所述的字符串包括中文文字、和/或,英文字母。Hash (x) = H0 ;χ = 0(1)Hash (χ) = (w ο r d G B K [ χ ] [ 0 ] * k J w ο r d G B K [ χ ] [ 1 ] * k 丄 + χ 彡 1 (2)Hash (χ-1) *k2) Λ (Hash(x_l) << k3) Λ (Hash(x-l) >> k4);Hash(x) = (wordASC [x] ^k^Hash (χ-1) *k2) Λ (Hash (χ-1) < < k3) ;x 彡 1 (3)Λ (Hash (X-I) >> k4)Hash(X) = YjHash(X)(4)
x=l式中,Λ為位“異或”運算符,<<為位“左移”運算符,>>為位“右移”運算符,X 表示進行哈希運算的字符在字符串中的位置,字符串的長度為X (0 < χ < X),一個中文漢字 為一個長度單位,一個英文字母也為一個長度單位。如果字符串對應的第χ個位置為中文,則使用公式(2);如果字符串對應的第χ個位置為英文,則使用公式(3)。wordGBK[x]
為字符串中第χ個中文字的GBK碼的高位;wordGBK[x] [1]為字符串中第χ個中文字的GBK碼的低位;wordASC [χ]為字符串中第χ個英文字母的ASC碼;H0為設置的字符串的初始哈希值;Ic1為GBK碼或ASC碼系數,k2為第x_l個字符哈希值系數,k3、k4為移位運算符系 數。當然,實際應用中,也可以用中文字的GB2312碼代替GBK碼,較佳地,由于GBK碼 包含的中文字字數比GB2312碼包含的中文字字數要多,因而,本發明實施例哈希函數中使 用中文字的GBK碼。較佳地,H0為大質數,例如,H0 = 166777619,或其他大質數;
Ic1為較大質數,例如,Ii1 = 1777,或其他較大質數;k2為質數,例如,k2 = 311,或其他質數;k3 = 4、k4 = 28,或其他整數。由式(4)可見,詞條對應的字符串哈希值等于字符串中各字符的哈希值之和,經 測試,該哈希函數計算得到的哈希值中,平均15萬個詞條出現一次沖突,因而,本發明設計 的哈希函數是比較高效的;而且,由于本發明設計的哈希函數主要是位、加法、乘法運算,相 對現有哈希函數中的除法等運算方式更快,因而計算速度比較快。以下基于本發明提出的哈希函數,對本發明建立倒排索引的方法及系統從內存結 構和建立流程上進行描述。倒排索引是搜索引擎中很重要的一個組成部分,搜索引擎就是通過為多個文件建 立的倒排索引來反向查詢搜索關鍵詞所在的文件和文件中的位置,并將搜索結果進行整理 后展現給用戶。實際應用中,一個或多個物理文件構成一個文檔,每個文檔包含多個屬性,每個屬 性稱為一個域(field)。例如,由多篇文章(物理文件)構成的一本書,包括書名屬性、出版 日期屬性以及作者屬性等,也就是說,一本書的域名包括書名、出版日期、作者等,并將域名 對應的數據進行存儲,則構成本發明實施例的倒排索引,當用戶輸入搜索關鍵詞時,通過搜 索關鍵詞匹配域,然后將匹配的域對應的數據信息顯示給用戶。所應說明的是,在本發明提出哈希函數算法后,倒排索引結構以及根據哈希函數 建立倒排索引,與現有技術相類似,具體可參見相關技術文獻,下面的描述中,對于相同的 部分不再贅述。圖1為本發明倒排索引結構示意圖,參見圖1,該倒排索引用來存放所有域及域對 應的數據信息,包括哈希域(HashField)表以及數據信息(data)表,其中,HashField表用于存儲按照域信息中包含的域名以及預先設定的哈希函數計算得 到的域名哈希值;data表用于存放域名對應的數據或者對應數據的索引。每個data與相應的HashField對應。本實施例中,域信息包括域名,同時,可以根據實際需要進行擴展,例如,還包括 域名對應數據的條數、是否分詞、是否存儲等內容。哈希值通過本發明提出的哈希函數根據域名計算得到。舉例來說,HashField表包括域l(field 1) 域n,域1的域名為書名,則域1存 儲有“書名”的哈希值,相應data表中的datal存儲有多個文檔的書名數據或書名數據索 引,例如,紅樓夢、水滸、三國演義;域2的域名為出版日期,則域2存儲有“出版日期”的哈 希值,相應data表中的data 2存儲有多個文檔的出版日期數據或出版日期數據索引,例
如,2000. 08. 08,2008. 09. 01,2009. 01. 01 ;......,以此類推,域η的域名為作者,則域η存
儲有“作者”的哈希值,相應data表中的data η存儲有多個文檔的作者數據或作者數據索 弓丨,例如,曹雪芹、施耐庵、羅貫中。上述示例中,如果域名對應的數據信息較多,則data表包括數據索引,例如,對于 datal存儲的紅樓夢,如果還有有關紅樓夢的介紹信息,則可以將該介紹信息存儲在其它存 儲區中,將datal存儲的紅樓夢作為指針,指向介紹信息存儲的存儲區位置。
針對用戶進行查詢的方式的不同,本發明實施例中,倒排索引結構可以分為非指 定域結構和指定域結構。非指定域結構用于查詢所有域中包含所查搜索關鍵詞的數據信 息,指定域結構用于對指定域的搜索關鍵詞進行查詢,從指定域中獲取搜索關鍵詞的數據 fn息ο圖2為本發明實施例的非指定域結構示意圖,參見圖2,該非指定域結構包括 詞條哈希表、詞條屬性表以及HashField表,詞條哈希表和詞條屬性表組成data表, HashField表與圖1的HashField表相同,其中,詞條(word)哈希表,用于存儲詞條哈希值;詞條屬性(atts)表,用于存儲包含詞條信息的域名以及該詞條對應的數據信息。一個域名包含多個詞條,例如,對于“書名”域名,紅樓夢、水滸、三國演義為域名包 含的詞條。同前所述,哈希表中的哈希值是通過本發明設計的哈希函數計算得到的。實際應用中,如果詞條哈希表中存儲的詞條哈希值與輸入的詞條哈希值相同,則 可以進一步判斷存儲的詞條哈希值對應的詞條是否與輸入的詞條哈希值對應的詞條相同, 如果不相同,則將輸入的詞條哈希值加一后再判斷是否存在相同的哈希值,如果不存在,則 存儲輸入的加一后的詞條哈希值并修改原存儲的詞條哈希值以避免哈希沖突。圖3為本發明指定域名結構示意圖,參見圖3,該指定域名結構包括=HashField 表、詞條屬性表以及詞條哈希表,其中,HasMndex表與圖1的HashField表相同,詞條屬性 表用來存放該域名下的所有詞條對應的數據信息的哈希表,詞條哈希表與圖2的詞條哈希 表相同。其中哈希值通過本發明設計的哈希函數計算得到。上面對本發明實施例倒排索引在內存中的結構進行了說明,下面對本發明實施例 倒排索引在磁盤上的結構進行描述。本實施倒排索引在磁盤上的結構包括域文件、域數據文件、倒排索引文件以及倒 排索引屬性文件,其中,域文件,用于存放文檔對象包含的域和對應的屬性信息;域數據文件,用于存放文檔域的對應數據或者數據的索引;索引文件,用于存放詞條內容及其相關屬性索引信息;索引屬性文件,用于存放詞條屬性信息。圖4為本發明實施例建立倒排索引的方法流程示意圖,參見圖4,該流程包括步驟401,提取待建立倒排索引的文檔的域名(屬性)信息以及該域名包含的詞條 對應的數據信息;本步驟中,該文檔對象文件包含多個域名,例如,書名域、出版日期域以及作者域。 域名可以是中文,也可以是英文,還可以是中英文混合。步驟402,獲取域名對應的GBK碼或ASC碼,根據獲取的GBK碼或ASC碼以及預先 設定的哈希函數計算域名哈希值;本步驟中,獲取域名對應的GBK碼或ASC碼可以通過查詢GBK碼表或ASC碼表得 到。預先設定的哈希函數為Hash (χ) = 166777619 ;χ = 0Hash(χ) = (wordGBK[x]
*1777+wordGBK[x][l]*1777+x 彡 1
Hash (x-1) *311) Λ (Hash (χ-1) << 4) Λ (Hash (χ-1) >>28);Hash (χ) = (wordASC [χ] *1777+Hash (χ-1) 1) Λ (Hash (χ-1) << 4) ;χ 彡 1Λ (Hash (χ-1) >> 28)
χHash(X) 二 ^Hashipc)
x=l步驟403,查詢哈希域表中是否存儲有該域名哈希值,如果未存儲有,執行步驟 404,否則,執行步驟405 ;步驟404,將獲取的該域名哈希值存儲在哈希域表中,執行步驟406 ;步驟405,判斷數據信息表中是否存儲有提取的詞條對應的數據信息,如果有,結 束本流程,否則,執行步驟406 ;步驟406,將提取的詞條對應的數據信息存儲在數據信息表中。本步驟中,存儲在數據信息表中的詞條對應的數據信息包括詞條對應的數據或 者詞條對應的數據索引。圖5為本發明實施例在非指定域結構中建立倒排索引的方法流程示意圖。參見圖 5,該流程包括步驟501,從待建立倒排索引的文檔中順序獲取文檔域名包含的詞條;本步驟中,從文檔中順序獲取文檔域名,例如,書名域、出版日期域、摘要域以及作 者域,并獲取每個域名包含的詞條,例如,書名域包含的詞條為紅樓夢;作者域包含的詞條 為曹雪芹;出版日期域包含的詞條為2005. 05. 06。實際應用中,根據建立倒排索引的實際需要,還可以進一步判斷該詞條是否需要 進行分詞處理,如果需要,使用預先設置的中文分詞程序進行分詞,如果不需要,則對詞條 不作處理。例如,對于出版日期域不需要進行分詞處理,而對于書名域則需要進行分詞處 理。中文分詞程序屬于現有技術,可從目前使用的分詞程序選取較優秀的中文分詞程序進 行判斷并確定是否需要對詞條分詞。有關中文分詞程序的描述,可參見相關技術文獻,在此 不再贅述。步驟502,利用預先設置的哈希函數計算詞條的哈希值,根據計算獲取的詞條哈希 值查找詞條哈希表,如果詞條哈希表中未存在該詞條哈希值,執行步驟503,否則,執行步驟 504 ;本步驟中,預先設置的哈希函數為上述式(1) 式0)。如前所述,對于進行分詞處理的詞條,將計算分詞后的詞條中各分詞詞條的哈希 值,例如,對于詞條我愛中國,經過分詞處理為為“我愛”和“中國,,兩個分詞詞條,則根據哈 希函數分別計算兩個分詞詞條哈希值。步驟503,將計算獲取的詞條哈希值存儲至詞條哈希表中,將該詞條對應的域名以 及該詞條對應的數據信息存儲至詞條屬性表中;本步驟中,因為一個詞條可能會包含于很多域名中,例如,詞條紅樓夢可能在書名 域中出現,也可能在摘要域中出現,這里使用哈希表存儲。實際應用中,考慮到對詞條屬性表的擴展,詞條屬性表可以進一步存儲該詞條所 屬文檔標識等屬性信息、以及詞條出現的頻率等信息。步驟504,利用預先設置的哈希函數計算域名的哈希值,查找哈希域表中是否存儲有該域名哈希值,如果未存儲有,則將該域名哈希值存儲至該詞條對應的哈希域表中,如果 存儲有,結束流程。至此,在非指定域結構中建立倒排索引的流程結束。實際應用中,如前所述,建立的倒排索引中,可能存在哈希沖突,針對該非指定域 結構,本發明實施例中,哈希詞條表采用再哈希的方式,也就是說,如果發生哈希沖突,將當 前計算得到的哈希值加1組成一個新的哈希值后再進行重試,直到找到無沖突的哈希值為 止,經實驗驗證,本發明實施例的解決哈希詞條表哈希沖突的再哈希的次數最多為3次。而 對于哈希屬性表,采用鏈表的方式來處理哈希沖突,關于采用鏈表的方式來處理哈希沖突 的技術,屬于現有技術,具體可參見相關技術文獻,在此不再贅述。圖6為本發明實施例在指定域結構中建立倒排索引的方法流程示意圖。參見圖6, 該流程包括步驟601,從待建立倒排索引的文檔中順序獲取文檔域名;本步驟中,從文檔中順序獲取文檔域名,判斷域名是否需要進行分詞處理,如果需 要,使用預先設置的中文分詞程序進行分詞,如果不需要,則對域名不作處理。步驟602,利用預先設置的哈希函數計算域名的哈希值,根據計算獲取的域名哈 希值查找哈希域表,如果哈希域表中未存在該域名哈希值,執行步驟603,否則,執行步驟 604 ;步驟603,將該域名哈希值存儲至哈希域表中;步驟604,利用預先設置的哈希函數計算域名包含的詞條的哈希值,根據計算獲取 的詞條哈希值查找詞條哈希表,如果詞條哈希表中未存在該詞條哈希值,執行步驟605,否 則,結束該流程;步驟605,將該詞條對應的數據信息存儲至詞條屬性表中,將該詞條哈希值存儲至 詞條哈希表中。實際應用中,考慮到對詞條屬性表的擴展,詞條屬性表可以進一步存儲該詞條所 屬文檔標識等屬性信息、以及詞條出現的頻率等信息。本發明實施例中,可以使用java中的Hashmap類,利用本發明設計的哈希函數重 寫hashcodeO方法和equals ()方法來復用Hashmap類,以實現高效的哈希查找。關于利 用哈希函數重寫hashcodeO方法和equalsO方法來復用Hashmap類的技術,屬于現有技 術,具體可參見相關技術文獻,在此不再贅述。對于可能存在的哈希沖突,本發明實施例中,對于指定域結構包括兩種哈希表,都 采用再哈希的方式來處理哈希沖突,也就是說,如果發生哈希沖突,將當前計算得到的哈希 值加1組成一個新的哈希值后再進行重試,直到找到無沖突的哈希值為止,經實驗驗證,解 決哈希沖突的再哈希的次數最多為3次。在建立本發明實施例的倒排索引后,就可以利用該建立的倒排索引進行相關搜 索,相應地,根據倒排索引在內存中的結構不同而分為兩種搜索方案,下面進行說明。圖7為本發明實施例在非指定域結構中進行搜索的流程示意圖。參見圖7,該流程 包括步驟701,利用預先設置的哈希函數計算用戶輸入的搜索關鍵詞的哈希值;本步驟中,用戶可以選擇在非指定域結構中進行搜索還是在指定域結構中進行搜索。用戶輸入搜索關鍵詞,搜索引擎判斷是否需要進行分詞處理,如果需要,使用預先 設置的中文分詞程序進行分詞,如果不需要,則對搜索關鍵詞不作處理。獲取分詞處理的搜 索關鍵詞對應的GBK碼或ASC碼,根據獲取的GBK碼或ASC碼以及預先設置的哈希函數計 算哈希值。步驟702,查找詞條哈希表中是否有與該搜索關鍵詞的哈希值匹配的哈希值,如果 沒有,執行步驟703,如果有,執行步驟704 ;步驟703,將該搜索關鍵詞的哈希值加1,判斷將該搜索關鍵詞的哈希值加1的次 數是否超過預先設定的次數,如果否,返回執行步驟702,如果是,執行步驟705 ;本步驟中,預先設定的次數為三次,當然,也可以根據實際需要進行設置,例如,設 置為兩次或四次。步驟704,將詞條屬性表中該搜索關鍵詞對應的數據信息返回給用戶;步驟705,搜索該搜索關鍵詞失敗。圖8為本發明實施例在指定域結構中進行搜索的流程示意圖。參見圖8,該流程包 括步驟801,利用預先設置的哈希函數計算用戶輸入的搜索關鍵詞的哈希值;本步驟中,用戶選擇在指定域結構中進行搜索。步驟802,查找哈希域表中是否存在該搜索關鍵詞的哈希值,如果不存在,執行步 驟803,如果存在,執行步驟804 ;步驟803,將該搜索關鍵詞的哈希值加1,判斷將該搜索關鍵詞的哈希值加1的次 數是否超過預先設定的次數,如果否,返回執行步驟802,如果是,執行步驟807 ;步驟804,查找詞條哈希表中是否存在該搜索關鍵詞的哈希值,如果不存在,執行 步驟805,如果存在,執行步驟806 ;步驟805,將該搜索關鍵詞的哈希值加1,判斷將該搜索關鍵詞的哈希值加1的次 數是否超過預先設定的次數,如果否,返回執行步驟804,如果是,執行步驟807 ;步驟806,將詞條屬性表中該搜索關鍵詞對應的數據信息返回給用戶;步驟807,搜索該搜索關鍵詞失敗。實際應用中,還可以對倒排索引進行刪除、更新及合并的操作。本實施例中,對于刪除操作,以刪除域名和詞條為例進行說明。圖9為本發明實施例刪除域名的流程示意圖。參見圖9,該流程包括步驟901,根據獲取的域名,計算域名的哈希值,從指定域結構的哈希域表中獲取 與該域名的哈希值相同的哈希值;步驟902,返回該相同哈希值對應的所有詞條;步驟903,刪除詞條對應的數據信息;步驟904,從非指定域結構的哈希詞條表中查找所述返回的所有詞條,從詞條屬性 表中將所述返回的所有詞條對應的域名刪除。圖10為本發明實施例刪除詞條的流程示意圖。參見圖10,該流程包括步驟1001,根據獲取的詞條對應的哈希值從非指定域結構的哈希詞條表中獲取匹 配的哈希值;
步驟1002,返回該詞條對應的所有域名;步驟1003,刪除該詞條對應的所有域名中的數據信息;步驟1004,從指定域結構的哈希域表中查找所述返回的所有域名,從詞條屬性表 中將所述返回的所有域名對應的詞條刪除。對倒排索引進行更新的流程包括增加對象和修改對象的屬性操作,通過查找得到 要更新的項之后,對該對象進行對應的操作即可,由于操作比較簡單,具體可參見相關技術 文獻,這里不再詳細描述。對索引進行合并,指的是內存結構中的合并,以要合并的兩個數據內容為數據內 容1和數據內容2,將數據內容2的合并到數據內容1上為例進行說明。圖11為本發明實施例在非指定域結構中合并數據的流程示意圖。參見圖11,該流 程包括步驟1101,以數據內容2中包含的詞條作為查詢條件到數據內容1上進行查詢;步驟1102,如果查詢到該數據內容2上的詞條,則更新對應信息,如果未查詢到, 則增加一個該數據內容2上的詞條項。圖12為本發明實施例在指定域結構中合并數據的流程示意圖。參見圖12,該流程 包括步驟1201,以數據內容2中包含的域名作為查詢條件到數據內容1上查詢;步驟1201,如果查詢到該數據內容2上的域名,則更新對應信息,如果未查詢到, 則增加一個該數據內容2上的域項。下面對本發明實施例倒排索弓丨系統進行說明。圖13為本發明實施例倒排索引裝置結構示意圖,參見圖13,該倒排索引裝置包 括域名及數據信息獲取單元、域名編碼單元、哈希值計算單元、哈希域表單元以及數據信 息表單元,其中,域名及數據信息獲取單元,用于提取待建立倒排索引的文檔的域名信息以及該域 名包含的詞條對應的數據信息,將域名輸出至域名編碼單元,將數據信息輸出至數據信息 表單元;域名編碼單元,用于存儲中文字符對應的漢字編碼以及英文字符對應的ASC碼, 根據接收的域名,查詢并獲取該域名對應的漢字編碼或ASC碼,輸出至哈希值計算單元;漢字編碼包括GBK碼以及GB2312碼。哈希值計算單元,用于存儲哈希函數,根據域名編碼單元輸出的漢字編碼或ASC 碼、以及存儲的哈希函數,計算哈希值,輸出至哈希域表單元;該哈希函數為Hash (χ) = 166777619 ;χ = 0Hash(χ) = (wordGBK[x]
*1777+wordGBK[x][l]*1777+x 彡 1Hash (x-1) *311) Λ (Hash (χ-l) << 4) Λ (Hash (χ-1) >>28);Hash (χ) = (wordASC [χ] *1777+Hash (x_l) *311) Λ (Hash (χ-1) << 4) ;χ 彡 1Λ (Hash (χ-1) >> 28)
χHash{X) = YjHashix)
輸出至哈希域表單元的哈希值為域名中每個字符對應的哈希值的累加值。哈希域表單元,用于接收哈希值計算單元輸出的哈希值,更新存儲的哈希值;本實施例中,將接收的哈希值與預先存儲的哈希值進行匹配,如果未能匹配上,將 接收的哈希值存儲在哈希域表單元中,如果匹配上,則不作處理。數據信息表單元,用于接收域名及數據信息獲取單元輸出的數據信息,更新存儲 的數據信息。本實施例中,將接收的數據信息與預先存儲的數據信息進行匹配,如果未能匹配 上,將接收的數據信息存儲在數據信息表單元中,如果匹配上,則不作處理。以上所述僅為本發明的較佳實施例而已,并非用于限定本發明的保護范圍。凡在 本發明的精神和原則之內,所作的任何修改、等同替換以及改進等,均應包含在本發明的保 護范圍之內。
權利要求
1.一種建立倒排索引的方法,其特征在于,該方法包括A、提取待建立倒排索引的文檔的域名信息以及該域名包含的詞條對應的數據信息;B、獲取域名對應的漢字編碼或ASC碼,根據獲取的GBK碼或ASC碼以及預先設定的中 英文哈希函數計算域名哈希值;C、查詢哈希域表中是否存儲有該域名哈希值,如果未存儲有,執行步驟D,否則,執行步 驟E;D、將獲取的該域名哈希值存儲在哈希域表中,執行步驟E;E、判斷數據信息表中是否存儲有提取的詞條對應的數據信息,如果沒有,將提取的詞 條對應的數據信息存儲在數據信息表中。
2.如權利要求1所述的方法,其特征在于,所述預先設定的哈希函數為
3.如權利要求2所述的方法,其特征在于,所述Htl= 166777619 = 1777 ;k2 = 311 ; k3 = 4 ;k4 = 28。
4.如權利要求3所述的方法,其特征在于,倒排索引包括非指定域結構、和/或,指定域 結構,域結構包括用于按照預先設定的哈希函數對域信息中包含的域名進行哈希計算、存 儲計算得到的域名哈希值的哈希域表,以及用于存放域名對應的數據或者對應數據的索引 的數據信息表。
5.如權利要求4所述的方法,其特征在于,所述域結構為非指定域結構,所述數據信息 表包括用于存儲詞條哈希值的詞條哈希表,以及用于存儲包含詞條信息的域名以及該詞條 對應的數據信息的詞條屬性表。
6.如權利要求5所述的方法,其特征在于,所述步驟B之前進一步包括利用預先設置的哈希函數計算詞條的哈希值,根據計算獲取的詞條哈希值查找詞條哈希表,如果詞條哈希表中未存在該詞條哈希值,將計算獲取的詞條哈希值存儲至詞條哈希 表中,將該詞條對應的域名以及該詞條對應的數據信息存儲至詞條屬性表中,然后執行步 驟B,否則,直接執行步驟B。
7.如權利要求6所述的方法,其特征在于,所述步驟A進一步包括判斷提取的域名或 詞條是否需要進行分詞處理,如果需要,使用預先設置的中文分詞程序進行分詞。
8.如權利要求6所述的方法,其特征在于,進一步包括如果詞條哈希表中存儲的詞條 哈希值與輸入的詞條哈希值相同,則判斷存儲的詞條哈希值對應的詞條是否與輸入的詞條 哈希值對應的詞條相同,如果不相同,則將輸入的詞條哈希值加一后再判斷詞條哈希表中 是否存在相同的哈希值,如果不存在,則存儲輸入的加一后的詞條哈希值并修改原存儲的 詞條哈希值。
9.如權利要求8所述的方法,其特征在于,所述步驟E后進一步包括F11、利用預先設置的哈希函數計算用戶輸入的搜索關鍵詞的哈希值;F12、查找詞條哈希表中是否有與該搜索關鍵詞的哈希值匹配的哈希值,如果沒有,執 行步驟F13,如果有,執行步驟F14 ;F13、將該搜索關鍵詞的哈希值加1,判斷將該搜索關鍵詞的哈希值加1的次數是否超 過預先設定的次數,如果否,返回執行步驟F12,如果是,結束流程;F14、將詞條屬性表中該搜索關鍵詞對應的數據信息返回給用戶。
10.如權利要求9所述的方法,其特征在于,所述步驟Fll進一步包括判斷用戶輸入的搜索關鍵詞是否需要進行分詞處理,如果需要,使用預先設置的中文 分詞程序進行分詞,獲取分詞處理的搜索關鍵詞對應的GBK碼或ASC碼,根據獲取的GBK碼 或ASC碼以及預先設置的哈希函數計算哈希值。
11.如權利要求4所述的方法,其特征在于,所述域結構為指定域結構,所述數據信息 表包括用于存儲詞條哈希值的詞條哈希表,以及用于存儲域名下的所有詞條對應的數據信 息的哈希表的詞條屬性表。
12.如權利要求11所述的方法,其特征在于,所述步驟E包括利用預先設置的哈希函數計算域名包含的詞條的哈希值,根據計算獲取的詞條哈希值 查找詞條哈希表,如果詞條哈希表中未存在該詞條哈希值,將該詞條對應的數據信息存儲 至詞條屬性表中,將該詞條哈希值存儲至詞條哈希表中,否則,結束流程。
13.如權利要求12所述的方法,其特征在于,所述詞條屬性表進一步用于存儲詞條所 屬文檔標識、以及詞條出現的頻率信息。
14.如權利要求12所述的方法,其特征在于,所述步驟E后進一步包括F21、利用預先設置的哈希函數計算用戶輸入的搜索關鍵詞的哈希值;F22、查找哈希域表中是否存在該搜索關鍵詞的哈希值,如果不存在,執行步驟F23,如 果存在,執行步驟F24;F23、將該搜索關鍵詞的哈希值加1,判斷將該搜索關鍵詞的哈希值加1的次數是否超 過預先設定的次數,如果否,返回執行步驟F22,如果是,執行步驟F27 ;F24、查找詞條哈希表中是否存在該搜索關鍵詞的哈希值,如果不存在,執行步驟F25, 如果存在,執行步驟F26;F25、將該搜索關鍵詞的哈希值加1,判斷將該搜索關鍵詞的哈希值加1的次數是否超過預先設定的次數,如果否,返回執行步驟F24,如果是,執行步驟F27 ; 步驟F26,將詞條屬性表中該搜索關鍵詞對應的數據信息返回給用戶; 步驟F27,返回搜索該搜索關鍵詞失敗信息。
15.如權利要求4所述的方法,其特征在于,所述方法進一步包括根據用戶輸入的需要刪除的域名,計算域名的哈希值,從指定域結構的哈希域表中獲 取與該域名的哈希值相同的哈希值; 返回該相同哈希值對應的所有詞條; 刪除所有詞條對應的數據信息;從非指定域結構的哈希詞條表中查找所述返回的所有詞條,從詞條屬性表中將所述返 回的所有詞條對應的域名刪除。
16.如權利要求4所述的方法,其特征在于,所述方法進一步包括根據用戶輸入的需要刪除的詞條,獲取詞條對應的哈希值,從非指定域結構的哈希詞 條表中獲取匹配的哈希值;返回該詞條對應的所有域名;刪除該詞條對應的所有域名中的數據信息;從指定域結構的哈希域表中查找所述返回的所有域名,從詞條屬性表中將所述返回的 所有域名對應的詞條刪除。
17.一種倒排索引裝置,其特征在于,該倒排索引系統包括域名及數據信息獲取單 元、域名編碼單元、哈希值計算單元、哈希域表單元以及數據信息表單元,其中,域名及數據信息獲取單元,用于提取待建立倒排索引的文檔的域名信息以及該域名包 含的詞條對應的數據信息,將域名輸出至域名編碼單元,將數據信息輸出至數據信息表單 元;域名編碼單元,用于存儲中文字符對應的漢字編碼以及英文字符對應的ASC碼,根據 接收的域名,查詢并獲取該域名對應的漢字編碼或ASC碼,輸出至哈希值計算單元;哈希值計算單元,用于存儲中英文哈希函數,根據域名編碼單元輸出的漢字編碼或ASC 碼、以及存儲的哈希函數,計算哈希值,輸出至哈希域表單元;哈希域表單元,用于接收哈希值計算單元輸出的哈希值,更新存儲的哈希值; 數據信息表單元,用于接收域名及數據信息獲取單元輸出的數據信息,更新存儲的數 據信息。
18.如權利要求17所述的倒排索引裝置,其特征在于,所述哈希值計算單元存儲的哈 希函數為Hash (χ) = 166777619 ;χ = 0Hash(χ) = (wordGBK[χ]
*1777+wordGBK[χ][1]*1777+χ 彡 1(5)Hash (χ-1) *311) Λ (Hash (χ-1) << 4) Λ (Hash (χ-1) >>28);Hash (χ) = (wordASC[x]*1777+Hash(x-l)*311) Λ (Hash (χ-1) < < 4) ;χ 彡 1(6)Λ (Hash(χ-1) >> 28)
全文摘要
本發明公開了一種建立倒排索引的方法。A、提取待建立倒排索引的文檔的域名信息以及該域名包含的詞條對應的數據信息;B、獲取域名對應的漢字編碼或ASC碼,根據獲取的GBK碼或ASC碼以及預先設定的中英文哈希函數計算域名哈希值;C、查詢哈希域表中是否存儲有該域名哈希值,如果未存儲有,執行步驟D,否則,執行步驟E;D、將獲取的該域名哈希值存儲在哈希域表中,執行步驟E;E、判斷數據信息表中是否存儲有提取的詞條對應的數據信息,如果沒有,將提取的詞條對應的數據信息存儲在數據信息表中。本發明還公開了一種倒排索引裝置。應用本發明,能夠擴大索引及搜索范圍、降低哈希沖突的概率、提高查詢效率。
文檔編號G06F17/30GK102063446SQ20091023767
公開日2011年5月18日 申請日期2009年11月13日 優先權日2009年11月13日
發明者方亮, 景亞光, 王全禮, 肖巍, 邱爽 申請人:中國移動通信集團四川有限公司