全文檢索索引是對大資料文本進行索引,在建立的索引中對要尋找的單詞進行進行搜尋,定位哪些文本資料包括要搜尋的單詞。因此,全文檢索索引的全部工作就是建立索引和在索引中搜尋定位,所有的工作都是圍繞這兩個來進行的。下面就逐個介紹。
建立全文索引中有兩項非常重要,一個是如何對文本進行分詞,一是建立索引的資料結構。分詞的方法基本上是二元分詞法、最大匹配法和統計方法。索引的資料結構基本上採用倒排索引的結構。
分詞的好壞關係到查詢的準確程度和產生的索引的大小。在中文分詞發展中,早期經常使用分詞方式是二元分詞法,該方法的基本原理是將包含中文的句子進行二元分割,不考慮單詞含義,只對二元單詞進行索引。因此該方法所分出的單詞數量較多,從而產生的索引數量巨大,查詢中會將無用的資料檢索出來,好處是演算法簡單不會漏掉檢索的資料。之後又發展出最大匹配分詞方法,該方法又分為正向最大分詞和逆向最大分詞。其原理和查字典類似,對常用單詞產生一個詞典,分析句子的過程中最大的匹配字典中的單詞,從而將句子拆分為有意義的單詞鏈。最大匹配法中正向分詞方法對偏正式詞語的分辨容易產生錯誤,比如“首飾和服裝”會將“和服”作為單詞分出。達夢資料庫採用的是改進的逆向最大分詞方法,該分詞方法較正向正確率有所提高。最為複雜的是通過統計方式進行分詞的方法。該方法採用隱式馬爾科夫鏈,也就是後一個單詞出現的機率依靠於前一個單詞出現的機率,最後統計所有單詞出現的機率的最大為分詞的依據。這個方法對新名詞和地名的識別要遠遠高於最大匹配法,準確度隨著取樣文本的數量的增大而提高。
二元分詞方法和統計方法是不依賴於詞典的,而最大匹配法分詞方法是依賴於詞典的,詞典的內容決定分詞結構的好壞。
全文檢索索引的索引被稱為倒排索引,之所以成為倒排索引,是因為將每一個單詞作為索引項目,根據該索引項目尋找包含該單詞的文本。因此,索引都是單詞和唯一記錄文本的標示是一對多的關係。將索引單詞排序,根據排序後的單詞定位包含該單詞的文本。
逆向分詞的過程說明
步驟1)讀取一整條句子到變數str中,轉到步驟2
步驟2)從句子的尾端讀取1個字到變數word中,轉到步驟3
步驟3)在字典尋找word中儲存的單詞。如果存在則儲存word,轉到步驟4,否則轉到步驟5)
步驟4)如果是字典中最大單詞或者超過最大單詞數(認定為新詞),從句尾去掉該單詞,返回步驟2
步驟5)讀取前一個字到word中,構成新單詞,轉到步驟3)
詞庫的記憶體資料結構和詞庫中單詞的匹配演算法
記憶體中單詞採用階層儲存
假設字典中有如下的單詞:中國 中華民國 國家 人民 民主
在記憶體中按照如下方式按層排列,其中每一個方塊代表一個字,箭頭所指向為該單詞的前一個字。
單詞按照如下方式匹配
比如尋找單詞“中華民國”
首先在第一層中使用二分法找到“國”字
獲得“國”下層的數組“中民”
在該層使用二分法尋找“民”,獲得“民”下層的數組“華”
在該層使用二分法尋找“華”,獲得“華”下層的數組“中”
最後在該層找到中,至此,但此匹配完畢。
索引的格式
索引的格式是倒排索引的格式,也就是一個單詞對應若干個文本表示。
在達夢資料庫中,建立全文索引的對象是rec中的欄位,產生倒排索引使用資料庫中的b樹進行儲存。
在資料庫是對某個字元欄位進行全文索引,因此,rec的rowid作為該rec上該field的標示是必須要被記錄的。
因此倒排索引儲存的格式如下。
欄位1 |
欄位2 |
單詞1 |
Rowid1,rowid2… |
單詞1 |
Rowid1,rowid2… |
… |
… |
由於b樹的欄位長度是有限的,因此b樹儲存的格式為
欄位1 |
欄位2 |
欄位3 |
單詞1 |
單詞1Rowid的格數 |
Rowid1,rowid2… |
單詞1 |
單詞2Rowid的格數 |
Rowid1,rowid2… |
… |
… |
… |
全文索引的查詢
全文的索引查詢首先將對要查詢的單詞進行分詞,然後在儲存倒排索引的b樹中將包含這些單詞的rowid全部尋找出來,並根據這些rowid在儲存實際資料的b樹中,將包含這些資料的行過濾出來。
一個完整的SQL SERVER資料庫全文索引的樣本。(以pubs資料庫為例)首先,介紹利用系
1) 啟動資料庫的全文處理功能 (sp_fulltext_database)
2) 建立全文檢索目錄 (sp_fulltext_catalog)
3) 在全文檢索目錄中註冊需要全文索引的表 (sp_fulltext_table)
4) 指出表中需要全文索引的列名 (sp_fulltext_column)
5) 為表建立全文索引 (sp_fulltext_table)
6) 填充全文檢索目錄 (sp_fulltext_catalog)
---------********樣本********-------------
以對pubs資料庫的title和notes列建立全文索引,之後使用索引查詢title列或notes列中
包含有datebase 或computer字串的圖書名稱:在這之前,需要安裝Microsoft Search服務
user pubs --開啟資料庫
go
--檢查資料庫pubs是否支援全文索引,如果不支援
--則使用sp_fulltext_database 開啟該功能
if(select databaseproperty('pubs','isfulltextenabled'))=0
execute sp_fulltext_database 'enable'--建立全文檢索目錄FT_PUBS
execute sp_fulltext_catalog 'FT_pubs','create'--為title表建立全文索引資料元
execute sp_fulltext_table 'title','create','FT_pubs','UPKCL_titleidind'--設定
execute sp_fulltext_column 'title','title','add'
execute sp_fulltext_column 'title','notes','add'--建立全文索引
--activate,是啟用表的全文檢索索引能力,也就是在全文檢索目錄中註冊該表
execute sp_fulltext_table 'title','activate'--填充全文索引目錄
execute sp_fulltext_catalog 'FT_pubs','start_full'
go--檢查全文檢索目錄填充情況 While fulltextcatalogproperty('FT_pubs','populateStatus')<>0
begin--如果全文檢索目錄正處於填充狀態,則等待30秒後再檢測一次
waitfor delay '0:0:30'
end--全文檢索目錄填充完成後,即可使用全文檢索目錄檢索select title
form
where CONTAINS(title,'database')
or CONTAINS(title,'computer')
or CONTAINS(notes,'database')
or CONTAINS(notes,'database')
'--------------以下介紹一下全文操作類的系統預存程序
過程名稱:sp_fulltext_service
執行許可權:serveradmin或系統管理員
作 用:設定全文檢索搜尋屬性
過程名稱:sp_fulltext_catalog
執行許可權:db_owner及更高角色成員
作 用:建立和刪除一個全文檢索目錄,啟動或停止一個全文檢索目錄的索引操作
過程名稱:sp_fulltext_database
執行許可權:db_owner角色成員
作 用:初始化全文索引或刪除資料庫中所有全文檢索目錄
過程名稱:sp_fulltext_table
執行許可權:db_ddladnmin或db_owner角色成員
作 用:將一個表標識為全文索引表或非全文索引表
過程名稱:sp_fulltext_column
執行許可權:db_ddladnmin角色成員
作 用:指出一個全文索引表中的那些列假如或退出全文索引