使用 Microsoft SQL Server 2000 的全文檢索搜尋功能構建 Web 搜尋應用程式
來源:互聯網
上載者:User
server|web|程式|全文檢索搜尋
使用 Microsoft SQL Server 2000 的全文檢索搜尋功能構建 Web 搜尋應用程式 Andrew B. CenciniMicrosoft Corporation 2002年12月 適用於: Microsoft® SQL™ Server 2000摘要:學習如何充分利用 SQL Server 2000 的全文檢索搜尋功能。本文包含有關實現最大吞吐率和最佳效能的幾點提示和技巧。 目錄簡介 全文檢索搜尋功能簡介 配置全文檢索搜尋功能 全文檢索查詢 排位和最佳化 其他效能技巧 小結 附錄 A:實現全文檢索搜尋功能的最佳選擇 附錄 B:使用最佳選擇、結果分頁和有效全文檢索查詢邏輯的應用程式範例 附錄 C:資源 簡介使用 Microsoft® SQL™ Server 2000 的全文檢索搜尋功能,可以對在非結構化文本資料上產生的索引執行快速、靈活的查詢。常用的全文檢索搜尋工具是網站的搜尋引擎。為了協助讀者理解全文檢索搜尋功能的最佳使用方法,本文介紹了大量抽象概念;並對最佳化全文索引和查詢以實現最大吞吐率和最佳效能,提供了幾點提示和技巧。全文檢索搜尋功能簡介全文檢索搜尋功能在 SQL Server 7.0 中引入。全文檢索搜尋的核心引擎建立在 Microsoft Search (MSSearch) 技術上,Microsoft Exchange 和 Microsoft SharePoint™ Portal Server 等產品中也採用了此項技術。SQL Server 7.0 全文檢索搜尋中公開的功能可提供基本的文本搜尋功能,並使用早期版本的 MSSearch;而 SQL Server 2000 的全文檢索搜尋實現則包含一組可靠的索引和查詢功能,並在 SQL Server 7.0 的基礎之上添加了幾項增強功能。這些增強功能包括:通過 Microsoft 叢集服務完全支援群集操作,能夠過濾和索引 IMAGE 列中儲存的文檔,提供改進的語言支援,以及在效能、可縮放性和可靠性方面進行了改進。MSSearch 產生、維護和查詢檔案系統中(而不是 SQL Server 中)儲存的全文索引。MSSearch 進行全文索引時使用的邏輯和實體儲存體單元是目錄。全文檢索目錄在每個資料庫中包含一個或多個全文索引 - 可以為 SQL Server 中的每個表建立一個全文索引,且索引中可以包含該表中的一列或多列。每個表只能屬於一個目錄,且每個表只能建立一個索引。我們將簡單介紹有關組織全文檢索目錄和索引的最佳方案 - 但首先,讓我們來簡單瞭解一下全文檢索搜尋的工作原理。配置全文檢索搜尋功能要為 SQL Server 中儲存的文本資料建立全文索引,應該先完成以下幾步準備工作。第一步是以全文方式啟用包含要產生索引的文本資料的資料庫(如果您尚未執行此操作)。注意:執行以下語句將丟棄並重新建立屬於要啟用全文檢索搜尋的資料庫的所有全文檢索目錄。除非要重新建立全文檢索目錄,否則請確保在要啟用的特定資料庫中未建立任何全文檢索目錄。如果您是 sysadmin 角色的成員或此資料庫的 db_owner,可以繼續進行並發出以下語句:use Northwind exec sp_fulltext_database 'enable'
接下來,您需要建立全文檢索目錄,以儲存全文索引。正如前面所提到的,此目錄中的資料存放區在檔案系統中(而不是 SQL Server 中),因此,在考慮全文檢索目錄的儲存位置時應該仔細選擇。除非指定其他位置,否則全文檢索目錄將儲存在 FTDATA 目錄(位於 Microsoft SQL Server\MSSQL 儲存位置中)的子目錄中。以下是在非預設位置建立全文檢索目錄的方法:exec sp_fulltext_catalog 'Cat_Desc', 'create', 'f:\ft'
對於包含大量資料,且這些資料可適應此架構(或許是主架構)更改的系統,其效能會得到顯著的提高。但在何時應用多個過濾器或不應用過濾器方面卻有著明顯的限制。當然,還有其他的方法可以解決這些問題。通過以上樣本,您會瞭解一種將某些搜尋條件抽象到架構的方法 - 實際上是“欺騙”最佳化程式(更確切的說是“成為”最佳化程式),因為在 SQL Server 本身的全文檢索查詢中當前不存在本地最佳化。其他效能技巧人們在聊天時常常問我的另一個問題是如何才能分頁顯示全文檢索查詢結果。換句話說,如果我要發出“root beer”查詢,一次在某一 Web 頁上顯示 40 個結果,並且只希望返回該頁面上的 40 個結果(例如,如果我在第三頁,我希望僅返回第 81 至第 120 條結果)。對於分頁顯示結果,我曾見過多種方法,但沒有一種方法能夠做到百分之百有效。我所推薦的方法可以最大程度地減少全文檢索查詢執行的次數(實際上,對於要分頁顯示的每個結果集只需執行一次),並將 Web 服務器用作一個簡單的緩衝。從更高的層面來講,您只需在全文檢索查詢中檢索一個完整的主鍵和排位值行集合(如果需要,可以在架構中使用最佳選擇並提取常用過濾器),並將其儲存在 Web 服務器的記憶體中(這取決於您的應用程式和負載,想象將 <32 位元組的典型主鍵大小與 <4 位元組的排位大小相加 [等於 <36 位元組],然後乘以通常返回的結果集 <1000 行,最後等於 <35K。假定一個在任何給定時間返回 <1000 個活動查詢結果集中的一個主動式快取集,您將發現此主動式快取集在 Web 服務器上佔用的記憶體少於 35MB - 這還可以接受)。為了分頁顯示結果,該進程只遍曆 Web 服務器的記憶體中儲存的數組,並對 SQL Server 發出 SELECT 以便只顯示需要顯示的行和列。這又回到了全文檢索查詢僅返回主鍵和排位的概念中 - SELECT(甚至許多這樣的查詢語句)比全文檢索查詢的速度快許多倍。使用 SELECT 而不是與基表合并多個行,並結合多個其他策略,您可以保留 SQL Server 電腦上更多的 CPU 週期,並且更有效、更划算地利用 Web 領域。另一種可以替代 Web 服務器端緩衝的方法是在 SQL Server 自身中緩衝結果集,並定義多種用於瀏覽這些結果的方法。雖然本文著重說明 Web 服務器 (ASP) 層級的應用程式設計,但 SQL Server 的可程式化功能還為產生高效能的 Web 搜尋應用程式提供了強大的架構。小結Microsoft SQL Server 2000 的全文檢索搜尋功能為索引和查詢資料庫中儲存的非結構化文本資料提供了可靠、快速而靈活的方法。如果要廣泛地將這種快速、準確的搜尋功能應用於各種應用程式,那麼很有必要充分利用其速度和精確性,來實現全文檢索搜尋解決方案。通過分布計算負載並通過某些巧妙的方式對資料進行組織,可以省下錢來購買其他硬體和軟體,以擺脫因不必要的緩慢查詢帶來的困擾。在開發優秀的搜尋應用程式時,通常要考慮到許多因素和注意事項,希望本文提供的資訊和樣本對您學習使用 SQL Server 2000 產生出色的 Web 搜尋應用程式會有所協助。附錄 A:實現全文檢索搜尋功能的最佳選擇改進全文檢索查詢效能和有效性的一種可行方法是實現“最佳選擇”系統。此系統是一種很簡單的方法,可確保某些與特定查詢運算式匹配的行先於其他行返回。最佳選擇沒有複雜的預編程邏輯(例如,SharePoint Portal Server 就包含這樣的邏輯),因此,通常是首選辦法。在本樣本中挑選出最佳選擇,並將唯一的主鍵和一些關鍵字儲存在單獨的表中。FREETEXTTABLE 查詢對(非常小的)最佳選擇表執行,並且從該查詢中返回的任何結果都與對基表的 FREETEXTTABLE 查詢結果一同返回。在給定這些搜尋條件下,最先返回的將是所有“最佳選擇”行,隨後是被 MSSearch 視為關聯程度最高的行(以遞減順序返回)。下面是一個非常簡單的用於建立最佳選擇系統的樣本指令碼。use myDb
create table documentTable(ftkey int not null, document ntext)create unique index DTftkey_idx on documentTable(ftKey)
'----------------------------------------------------------------'' 顯示與最佳選擇/搜尋字詞匹配的簡單主鍵/排位 ''----------------------------------------------------------------'Private Sub SearchNPage()
Dim p ' 迴圈通過行時的計數器 Dim numRows ' 緩衝/結果集中的總行數
if (useCache <> "1") then ' 擷取最佳選擇/結果並將其緩衝
Dim queryArg ' 傳入的查詢詞 if (request.Form("searchTerm") <> "") then queryArg = request.Form("searchTerm") elseif (request.QueryString("searchTerm") <> "") then queryArg = request.QueryString("searchTerm") else response.Write("未提供搜尋字詞" & VbCrLF) exit sub end if
' 理想情況下,應該在此清理查詢詞... ' 添加自訂的清理邏輯,以防止 ' 隨意執行 SQL
' 調用 CleanString(queryArg)
' 建立與 SQL 的串連 Set cn = Server.CreateObject("ADODB.Connection") cn.Open connectionString
' 如果未返回任何結果,則結束 if (rs.EOF and IsEmpty(bbdata)) then response.Write("沒有匹配的行" & VbCrLF) call ConnClose exit sub end if
' 否則,擷取行 if not(rs.EOF) then alldata = rs.GetRows Session("results") = alldata end if
call ConnClose
else ' 從緩衝載入 (usecache=1)
alldata = Session("results")
' 在此擷取要使用的行範圍 if (request.Form("firstRow") <> "") then firstRow = request.Form("firstRow") lastRow = firstRow+pageSize elseif (request.QueryString("firstRow") <> "") then firstRow = request.QueryString("firstRow") lastRow = firstRow+pageSize end if
end if ' useCache<>TRUE
' 對於本應用程式,只是列印出所有最佳選擇 ' (可能比頁面大小大),然後分頁顯示普通結果 ' 此處假設:在使用緩衝時,如果沒有新的最佳選擇,' 則使用以前顯示的最佳選擇 if not(IsEmpty(bbdata)) then response.Write("最佳選擇:" & VbCrLf) for p = 0 to ubound(bbdata, 2)response.Write(bbData(0,p) & " " & bbData(1,p) & VbCrLf) next response.Write(VbCrLf) end if
' 返回搜尋結果(可能只有最佳選擇) if not(IsEmpty(alldata)) then if uBound(alldata, 2) < lastRow then lastRow = uBound(allData, 2) end if
response.Write("搜尋結果:" & VbCrLf)
for p = firstRow to lastRowresponse.Write(allData(0,p) & " " & allData(1,p) & VbCrLf) next end if ' not(IsEmpty(alldata))
End Sub
'----------------------------------------------------------------'' 關閉並清除連線物件 ''----------------------------------------------------------------'Private Sub ConnClose rs.Close Set rs = Nothing cn.Close Set cn = NothingEnd Sub
<form action="<搜尋 ASP 頁面>" method="post">搜尋字詞:<input name="searchTerm"><p><input type="submit" value="Search"></form>
</body></html>
正如以上兩個程式碼範例所示,建立可執行有效全文檢索查詢(用最佳選擇完成)並緩衝和分頁顯示結果的 Web 應用程式,並不需要花費太多的工夫。只需使用最低的系統開銷,即可添加用於提供其他資料、增強最佳選擇的外觀以及在搜尋結果中導航的邏輯(此外,強烈建議您實現其他用於錯誤處理、安全設定和清理傳入資料的嚴密邏輯)。通過上面的進階建議和樣本,使用 SQL Server 2000 全文檢索搜尋設計和實現快速可縮放的 Web 搜尋應用程式就是輕而易舉事情了。
附錄 C:資源Full-Text Search Deployment(英文)http://support.microsoft.com/default.aspx?scid=/support/sql/content/2000papers/fts_white%20paper.asp是那些初次接觸全文檢索搜尋的使用者的最佳參考。介紹了填充方法及硬體和軟體需求,並為使用 SQL Server 2000 全文檢索搜尋提供了提示、技巧和其他文檔。全文檢索搜尋公用新聞群組 (microsoft.public.sqlserver.fulltext)尋找有關全文檢索搜尋問題的答案以及有用提示和技巧的理想場所。全文檢索搜尋新聞群組是 SQL Server 開發小組和博學的 Microsoft MVP 成員經常光顧的場所。