全文索引技術是目前搜索引擎的關鍵技術。
試想在1M大小的文件中搜索一個詞,可能需要幾秒,在100M的文件中可能需要幾十秒,如果在更大的文件中搜索那么就需要更大的系統開銷,這樣的開銷是不現實的。
所以在這樣的矛盾下出現了全文索引技術,有時候有人叫倒排文檔技術。
原理是先定義一個詞庫,然后在文章中查找每個詞條(term)出現的頻率和位置,把這樣的頻率和位置信息按照詞庫的順序歸納,這樣就相當于對文件建立了一個以詞庫為目錄的索引,這樣查找某個詞的時候就能很快的定位到該詞出現的位置。
問題在處理英文文檔的時候顯然這樣的方式是非常好的,因為英文自然的被空格分成若干詞,只要我們有足夠大的詞匯庫就能很好的處理。但是亞洲文字因為沒有空格作為斷詞標志,所以就很難判斷一個詞,而且人們使用的詞匯在不斷的變化,而維護一個可擴展的詞匯庫的成本是很高的,所以問題出現了。
解決出現這樣的問題使“分詞”成為全文索引的關鍵技術。目前有兩中基本的方法:
二元法 它把所有有可能的每兩兩漢字的組合看為一個詞組,這樣就沒有維護詞庫的開銷。
詞庫法 它使使用詞庫中的詞作為切分的標準,這樣也出現了詞庫跟不上詞匯發展的問題,除非你維護詞庫。
實際上現在很多著名的搜索引擎都使用了多種分詞的辦法,比如“正向最大匹配”+“逆向最大匹配”,基于統計學的新詞識別,自動維護詞庫等技術,但是顯然這樣的技術還沒有作到完美。
目前全文索引技術正走向人工智能化,也是發展的方向。
===============================
首先,介紹利用系統存儲過程創建全文索引的具體步驟:?
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服務,啟動SQL server全文搜索服務?
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角色成員?
作 用:指出一個全文索引表中的那些列假如或退出全文索引