西西軟件園多重安全檢測下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁西西教程數(shù)據(jù)庫教程 → SQLSERVER 2008數(shù)據(jù)庫中的全文檢索、全文索引和查詢概念

SQLSERVER 2008數(shù)據(jù)庫中的全文檢索、全文索引和查詢概念

相關(guān)軟件相關(guān)文章發(fā)表評論 來源:西西整理時(shí)間:2011/5/18 18:31:33字體大。A-A+

作者:西西點(diǎn)擊:1160次評論:0次標(biāo)簽: SQLSERVER

  • 類型:數(shù)據(jù)庫類大。594KB語言:中文 評分:7.7
  • 標(biāo)簽:
立即下載

最近在做全文搜索的內(nèi)容,google了一下全文檢索,發(fā)現(xiàn)了一些問題,現(xiàn)在總結(jié)如下:
 
全文索引和查詢概念(摘自SQL 聯(lián)機(jī)幫助)
SQL Server 2008 為應(yīng)用程序和用戶提供了對 SQL Server 表中基于字符的數(shù)據(jù)發(fā)出全文查詢的功能。在可以對給定表運(yùn)行全文查詢之前,數(shù)據(jù)庫管理員必須對表創(chuàng)建全文索引。全文索引包括表中一個(gè)或多個(gè)基于字符的列。這些列可以具有下列任何一種數(shù)據(jù)類型:char、varcharnchar、nvarchar、text、ntext、image、xml、varbinaryvarbinary(max)。每個(gè)全文索引都對基表中的一個(gè)或多個(gè)列創(chuàng)建索引,并且每個(gè)列都可以具有一種特定語言。從 SQL Server 2008 開始,全文搜索支持 50 多種不同語言,比如英語、西班牙語、中文、日語、阿拉伯語、孟加拉語和印地語。有關(guān)支持的全文語言的完整列表,請參閱 sys.fulltext_languages (Transact-SQL)。

對于每種支持的語言,SQL Server 都提供了特定于語言的語言組件,包括斷字符和詞干分析器以及一個(gè)空同義詞庫文件。對于每種全文語言,SQL Server 也提供了一個(gè)文件(“同義詞庫文件”),您可以在該文件中有選擇地定義特定于語言的同義詞以擴(kuò)展搜索查詢的范圍。另外,從 SQL Server 2008 開始提供系統(tǒng)非索引字表。若要支持特定語言或商業(yè)應(yīng)用場景,您可以通過添加和刪除非索引字(也稱為干擾詞)更改系統(tǒng)非索引字表,并且您可以根據(jù)需要?jiǎng)?chuàng)建附加的非索引字表。

SQL Server 為編寫全文查詢提供了一組全文謂詞(CONTAINS 和 FREETEXT)和行集值函數(shù)(CONTAINSTABLE 和 FREETEXTTABLE)。使用這些全文謂詞和行集值函數(shù),應(yīng)用程序和用戶可以執(zhí)行各種類型的全文搜索,例如搜索單個(gè)單詞或短語(并可以選擇對結(jié)果集排名),搜索與其他單詞或短語接近的單詞或短語,或者搜索特定單詞的同義詞形式。

全文索引、查詢和同步化最主要的設(shè)計(jì)要求是,在注冊進(jìn)行全文檢索的所有表上都有一個(gè)唯一的全文鍵列(或者單列主鍵)。全文索引對使用的重要字及其所在位置進(jìn)行跟蹤。

全文查詢根據(jù)特定語言(例如,英語或日語)的規(guī)則對詞和短語進(jìn)行操作,從而對全文索引中的文本數(shù)據(jù)執(zhí)行語言搜索。全文查詢可以包括簡單的詞和短語,或者詞或短語的多種形式。

全文搜索適用于多種商業(yè)應(yīng)用場景:例如,電子商務(wù)(在網(wǎng)站上搜索項(xiàng)目)、律師事務(wù)所(在法律數(shù)據(jù)庫中搜索案例記錄)或人力資源部門(從所存儲(chǔ)的個(gè)人簡歷中找到符合職位描述的簡歷)。不管是什么樣的商業(yè)應(yīng)用場景,全文搜索的基本管理任務(wù)和開發(fā)任務(wù)是相同的。然而,在給定的商業(yè)應(yīng)用場景中,可以對全文索引和查詢進(jìn)行優(yōu)化以使其滿足業(yè)務(wù)目標(biāo)。例如,對于電子商務(wù)來說,最大限度地提高性能可能比對結(jié)果進(jìn)行排序、檢索的準(zhǔn)確性(實(shí)際上有多少個(gè)現(xiàn)有匹配項(xiàng)是由全文查詢返回的)或支持多種語言更重要。對于律師事務(wù)所來說,首先需要考慮的可能是返回所有可能存在的匹配項(xiàng)(“返回全部”信息)。 

例如,假定有一個(gè)對 DevTools 表的全文索引。全文索引可能指出在 Abstract 列的第 423 個(gè)和第 982 個(gè)單詞處找到了單詞 Microsoft,所在的行與 ProductID 6 關(guān)聯(lián)。該索引結(jié)構(gòu)支持對所有包含被索引單詞的項(xiàng)進(jìn)行有效檢索,以及高級檢索操作,如短語檢索和鄰近檢索。

為防止全文索引因包含很多對檢索沒有幫助的詞而變得臃腫,a、and、is 或 the 這類額外的詞都忽略不計(jì)。例如,指定"the products ordered during these summer months"與指定"products ordered during summer months"是一樣的。有這兩個(gè)字符串的行都會(huì)被返回。

目錄 \Mssql\Ftdata\Sqlserver\Config 下提供了多種語言的干擾詞列表。在安裝帶有全文檢索支持的 Microsoft® SQL Server™ 時(shí)會(huì)創(chuàng)建這個(gè)目錄,并同時(shí)安裝干擾詞文件。干擾詞文件可以編輯。例如,高技術(shù)公司的系統(tǒng)管理員可以把單詞 computer 添加到他們的干擾詞表中去。(如果編輯干擾詞文件,則必須在更改生效之前重新填充全文目錄。)下表顯示了干擾詞文件及其相應(yīng)的語言。

干擾詞文件      語言 
-------------- ---------
Noise.chs      簡體中文 
Noise.cht      繁體中文 
Noise.dat      語言中性 
Noise.deu      德語 
Noise.eng      英語(英國) 
Noise.enu      英語(美國) 
Noise.esn      西班牙語 
Noise.fra      法語 
Noise.ita      意大利語 
Noise.jpn      日語 
Noise.kor      韓文 
Noise.nld      荷蘭語 
Noise.sve      瑞典語 


在處理全文查詢時(shí),檢索引擎將滿足檢條件的行的鍵值返回給 Microsoft SQL Server。比如有一個(gè) SciFi 表,其中 Book_No 列是主鍵列。

Book_No   Writer     Title 
-------- ----------- --------------------------
A025     Asimov      Foundation's Edge 
A027     Asimov      Foundation and Empire 
C011     Clarke      Childhood's End 
V109     Verne       Mysterious Island 


假定想使用一個(gè)全文檢索查詢來查找包含單詞 Foundation 的書名。在本例中,將從全文索引獲得值 A025 和 A027。然后 SQL Server 用這些鍵值和其它欄的信息響應(yīng)該查詢。

下表顯示了存儲(chǔ)全文索引數(shù)據(jù)所使用的語言。這些語言基于 SQL Server 安裝期間選擇的 Unicode 排序規(guī)則區(qū)域設(shè)置標(biāo)識符。

Unicode 排序規(guī)則區(qū)域設(shè)置標(biāo)識符    全文數(shù)據(jù)存儲(chǔ)所用的語言 
------------------------------- -----------------------
中文注音符號(臺灣)              繁體中文  
漢語拼音                         簡體中文  
中文筆畫                         簡體中文  
中文筆畫(臺灣)                 繁體中文  
荷蘭語                           荷蘭語  
英語(英國)                     英語(英國)  
法語                            法語  
通用 Unicode                    英語(美國)  
德語                            德語  
德文電話簿                       德語  
意大利語                         意大利語  
日語                            日語  
日語 Unicode                    日語  
韓文                            韓文  
韓文 Unicode                    韓文  
西班牙語(現(xiàn)代)                 西班牙語  
瑞典/芬蘭語                      瑞典語  

此列表中沒有的其它所有 Unicode 排序規(guī)則區(qū)域設(shè)置標(biāo)識符值都映射到使用空格分隔單詞的中性語言單詞的斷字符和詞干分隔符。

說明  Unicode 排序規(guī)則區(qū)域設(shè)置標(biāo)識符設(shè)置用于所有可進(jìn)行全文索引的數(shù)據(jù)類型(如 char、nchar 等)。如果為 char、varchar 或 text 類型列的排序次序設(shè)置的語言類型,不是 Unicode 排序規(guī)則區(qū)域設(shè)置標(biāo)識符語言,那么在對 char、varchar 和 text 類型的列進(jìn)行全文索引和查詢時(shí),仍然使用 Unicode 排序規(guī)則區(qū)域設(shè)置標(biāo)識符值。

 


創(chuàng)建全文索引


1、啟動(dòng) Microsoft Search 服務(wù)
   開始菜單-->SQL程序組-->服務(wù)管理器-->下拉筐-->Microsoft Search 服務(wù)-->啟動(dòng)它

2、
  ..\Microsoft SQL Server\MSSQL\FTDATA\SQLServer\Config\目錄里建一個(gè)非空noise.chs文件
  非空noise.chs文件,也有人說是空的noise.chs文件,但我每次都往里寫幾個(gè)沒用的字母。

3、建立環(huán)境
   打開查詢分析器-->執(zhí)行下列腳本:

--檢查數(shù)據(jù)庫pubs是否支持全文索引,如果不支持
--則使用sp_fulltext_database 打開該功能
if(select databaseproperty('DeviceInfoPortal','isfulltextenabled'))=0 
  execute sp_fulltext_database 'enable'

--建立全文目錄FT_PUBS
execute sp_fulltext_catalog 'FT_DeviceInfoPortal','create'

--創(chuàng)建唯一索引
create unique clustered index Idx_files_id on dbo.files(fileid)

--為title表建立全文索引數(shù)據(jù)元
execute sp_fulltext_table 'files','create','FT_DeviceInfoPortal','Idx_files_id'

--設(shè)置全文索引列名
--execute sp_fulltext_column 'files','content','add'
execute sp_fulltext_column @tabname = 'files',@colname = 'content',@action = 'add',@type_colname = 'type';

--execute sp_fulltext_column 'files','content','drop'

--建立全文索引
--activate,是激活表的全文檢索能力,也就是在全文目錄中注冊該表
execute sp_fulltext_table 'files','activate'

--填充全文索引目錄
execute sp_fulltext_catalog 'FT_DeviceInfoPortal','start_full'
go

--在您可以使用操作系統(tǒng)篩選器、斷字符和詞干分析器之前,您必須將它們加載到服務(wù)器實(shí)例中
execute sp_fulltext_service @action='load_os_resources', @value=1;

--檢查全文目錄填充情況
While fulltextcatalogproperty('FT_DeviceInfoPortal','populateStatus')<>0
begin

--如果全文目錄正處于填充狀態(tài),則等待30秒后再檢測一次
waitfor delay '0:0:30'
end

--全文目錄填充完成后,即可使用全文目錄檢索

select *
from files
where CONTAINS(*,'運(yùn)行記錄')
or CONTAINS(*,'Understanding')
or CONTAINS(*,'全文搜索')

or CONTAINS(*,'出廠日期')

結(jié)果如下: 

 


全文索引中的幾個(gè)問題:

1.搜索時(shí)出現(xiàn)錯(cuò)誤:
  服務(wù)器: 消息 7619,級別 16,狀態(tài) 1,行 2
  查詢子句只包含被忽略的詞

  這種情況修改 \Mssql\Ftdata\Sqlserver\Config 下對應(yīng)語言的干擾詞列表文件

2.修改了干擾詞文件,查詢中文時(shí)仍然出現(xiàn)上述問題
  a.首先檢查你的SQL有沒有安裝最新的補(bǔ)丁,檢查的方法是在查詢分析器中運(yùn)行:
    select @@version
    如果出來的版本號是8.00.760以下,則表明你未安裝sp3的補(bǔ)丁,要裝上.

    注意下載后,執(zhí)行的時(shí)候是解壓,要在解壓后的目錄中執(zhí)行setup.bat才是真正的安裝

  b.配置全文索引時(shí),單詞斷字符選擇"中文(中國)"

  c.Noise.chs文件中至少有一個(gè)單詞,例如:?

  d.如果在全文檢索時(shí),你能正常修改干擾詞文件,說明你的全文檢索沒有使用上這個(gè)文件
    如果你配置的全文檢索應(yīng)該要用到這個(gè)文件,那就在
    企業(yè)管理器--展開你的數(shù)據(jù)庫--右鍵全文目錄--重建全部全文目錄

3.表中的數(shù)據(jù)改變后,檢索不到
  方法1. 右鍵你的表--全文索引表--啟用增量填充
  方法2. 右鍵你的表--全文索引表--更改跟蹤,這樣以后的修改會(huì)自動(dòng)填充(有一定延遲)

4.sql2000以上才支持對image列的全文檢索

    相關(guān)評論

    閱讀本文后您有什么感想? 已有人給出評價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評論

    最新評論

    發(fā)表評論 查看所有評論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)