




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、.SQL全文本檢索應(yīng)用基本知識1. SQL Server7 的 DeskTop 版中沒有全文本檢索。2. 一個表只能有一個全文本檢索。3. 被檢索的表必須有單列的唯一索引。4. 全文本的索引存儲在文件系統(tǒng)中,而非數(shù)據(jù)庫中。5. 更新全文本索引的過程比常規(guī)索引要耗時,而且也不象常規(guī)索引那樣可以由數(shù)據(jù)庫系統(tǒng)立即更新。6. 全文本索引包含在全文本目錄( Full-Text Catalog )中,每個數(shù)據(jù)庫可以包含一個或多個目錄, 但一個目錄不能屬于多個數(shù)據(jù)庫。7. 全文本檢索只能在真正的表上創(chuàng)建,不能是視圖,系統(tǒng)表,臨時表。8. 全文本檢索會忽略某些噪音字( noise Words),比如英文的 a
2、,the,and,中文的'和','是'等等。9. 如果在查詢中包含 noise words ,就會引發(fā)錯誤,在應(yīng)用程序中應(yīng)去除這些 noise words。啟動全文本檢索服務(wù)。方法A:在企業(yè)管理器中打開 Support Services 文件夾,在 Full-Text Search 的右鍵菜單中選擇 Start。方法B:在 SQL Server Service Manager 的 Services 下拉列表中選擇 Microsoft Search, 并單擊 Start/Continue 按鈕。方法C:使用 net start mssearch 的命令行方式。使用
3、全文本檢索向?qū)? Full-Text Indexing Wizard )。 step1. 選擇被檢索的數(shù)據(jù)庫,在 Tools 的菜單中,選擇 Full-text Indexing,進入歡迎( Welcome )的屏幕,單擊 next。step2. 選擇被檢索的表,單擊 next。step3. 選擇唯一索引,單擊 next。step4. 選擇被索引的列,單擊 Add,該列顯示在右欄中。單擊 next。step5. 選擇目錄(選擇已存在的目錄,或創(chuàng)建新的目錄),單擊 next。step6. 選擇或創(chuàng)建 population schedule(可選項),單擊 next。step7. 單擊 finis
4、h。使用 SQL-DMO (以 VB 為例) step1. 在工程的引用中選擇 Microsoft SQLDMO Object Library。step2. 創(chuàng)建 SQLServer 對象。Dim objSQL As New SQLDMO.SQLServerobjSQL.Connect "localhost", "sa", ""step3. 創(chuàng)建新的目錄,并加入到被索引的數(shù)據(jù)庫目錄中。Dim objCatalog As New SQLDMO.FullTextCatalog'使 pubs 為全文本檢索的數(shù)據(jù)庫objSQL.Dat
5、abases("pubs").EnableFullTextCatalogs'創(chuàng)建新的目錄objCatalog.Name = "ftcPubsTest"'將新目錄加入到目錄集合中objSQL.Databases("pubs").FullTextCatalogs.Add objCatalogstep4. 在表上創(chuàng)建全文本索引。Dim objTable As New SQLDMO.Table'指定被索引的表Set objTable = objSQL.Databases("pubs").Tables
6、("authors")'指定目錄名和唯一索引名objTable.FullTextCatalogName = "ftcPubsTest"objTable.UniqueIndexForFullText = "UPKCL_auidind"objTable.FullTextIndex = True'指定被索引的列objTable.Columns("au_lname").FullTextIndex = TrueobjTable.Columns("au_fname").FullTextInd
7、ex = True'激活該表上的全文本索引objTable.FullTextIndexActive = Truestep5. 啟動全文本目錄objCatalog.Start SQLDMOFullText_Full使用存儲過程step1. 使 pubs 為全文本檢索的數(shù)據(jù)庫USE Pubsgosp_fulltext_database 'enable'step2. 創(chuàng)建新的目錄sp_fulltext_catalog 'ftcPubsTest','create'step3. 指定被索引的表sp_fulltext_table 'autho
8、rs','create','ftcPubsTest','UPKCL_auidind'step4. 指定被索引的列sp_fulltext_column 'authors','au_lname','add'sp_fulltext_column 'authors','au_fname','add'step5. 激活該表上的全文本索引sp_fulltext_table 'authors','activate'step6.
9、 啟動全文本目錄sp_fulltext_catalog 'ftcPubsTest','start_full'CONTAINS 語法我們通常在 WHERE 子句中使用 CONTAINS ,就象這樣: SELECT * FROM table_name WHERE CONTAINS(fullText_column,'search contents')。 我們通過例子來學(xué)習(xí),假設(shè)有表 students,其中的 address 是全文本檢索的列。 1. 查詢住址在北京的學(xué)生SELECT student_id,student_nameFROM student
10、sWHERE CONTAINS( address, 'beijing' )remark: beijing是一個單詞,要用單引號括起來。2. 查詢住址在河北省的學(xué)生SELECT student_id,student_nameFROM studentsWHERE CONTAINS( address, '"HEIBEI province"' )remark: HEBEI province是一個詞組,在單引號里還要用雙引號括起來。 3. 查詢住址在河北省或北京的學(xué)生SELECT student_id,student_nameFROM students
11、WHERE CONTAINS( address, '"HEIBEI province" OR beijing' )remark: 可以指定邏輯操作符(包括 AND ,AND NOT,OR )。4. 查詢有 '南京路' 字樣的地址SELECT student_id,student_nameFROM studentsWHERE CONTAINS( address, 'nanjing NEAR road' )remark: 上面的查詢將返回包含 'nanjing road','nanjing east roa
12、d','nanjing west road' 等字樣的地址。A NEAR B,就表示條件: A 靠近 B。5. 查詢以 '湖' 開頭的地址SELECT student_id,student_nameFROM studentsWHERE CONTAINS( address, '"hu*"' )remark: 上面的查詢將返回包含 'hubei','hunan' 等字樣的地址。記住是 *,不是 %。6. 類似加權(quán)的查詢SELECT student_id,student_nameFROM st
13、udentsWHERE CONTAINS( address, 'ISABOUT (city weight (.8), county wright (.4)' )remark: ISABOUT 是這種查詢的關(guān)鍵字,weight 指定了一個介于 01之間的數(shù), 類似系數(shù)(我的理解)。表示不同條件有不同的側(cè)重。7. 單詞的多態(tài)查詢SELECT student_id,student_nameFROM studentsWHERE CONTAINS( address, 'FORMSOF (INFLECTIONAL,street)' )remark: 查詢將返回包含 '
14、;street','streets'等字樣的地址。對于動詞將返回它的不同的時態(tài),如:dry,將返回 dry,dried,drying 等等。以上例子都使用英文,不使用中文是因為有的查詢方式中文不支持,而且我的計算機是英文系統(tǒng)6. 更新全文本索引的過程比常規(guī)索引要耗時,而且也不象常規(guī)索引那樣可以由數(shù)據(jù)庫系統(tǒng)立即更新??梢粤⒓锤碌?. 如果在查詢中包含 noise words ,就會引發(fā)錯誤,在應(yīng)用程序中應(yīng)去除這些 noise words。不對,查詢時會自己過濾掉noise word,只有查詢的內(nèi)容全是noise words時才會出現(xiàn)錯誤CONTAINSTABLE 語法我
15、們通常在 FROM 子句中使用 CONTAINSTABLE ,就象這樣:SELECT * FROM table_name, CONTAINTABLE(fulltext_table,fullText_column,'search condition') WHERE .。CONTAINSTABLE 在查詢方式上與 CONTAINS 幾乎一樣,所以就不用贅述了。CONTAINSTABLE 返回的是符合查詢條件的表,在 SQL 語句中我們可以把它當作一個普通的表來使用。我們看一個例子,比較這兩種表的不同。SELECT FT_TBL.student_name,FT_TBL.student
16、_score,KEY_TBL.RANKFROM report AS FT_TBL INNER JOINCONTAINSTABLE( student,address,'ISABOUT (city weight (.8), county wright (.4)' ) AS KEY_TBLON FT_TBL.student_id = KEY_TBL.KEYORDER BY KEY_TBL.RANKCONTAINSTABLE 返回的表包含有特殊的兩列:KEY,RANK。在第一部分里我們就強調(diào)了:被全文索引的表必須有唯一索引。這個唯一的索引列在返回的表中就成為 KEY。我們通常把它作為表
17、連接的條件。在某些網(wǎng)站搜索時,結(jié)果中會出現(xiàn)表示匹配程度的數(shù)字,RANK 與此類似。它的值在01000之間,標識每一行與查詢條件的匹配程度,程度越高,RANK 的值大,通常情況下,按照 RANK 的降序排列。FREETEXT 語法FREETEXT 與 CONTAINS 類似,只是沒有 CONTAINS 的精度高。在 CONTAINS 中,對查詢條件的寫法有很多要求,而 FREETEXT 就沒有,可以是任意的單詞,詞組或句子。看下面的例子:SELECT CategoryNameFROM CategoriesWHERE FREETEXT (Description, 'sweetest can
18、dy bread and dry meat' )FREETEXTTABLE 語法和 CONTAINSTABLE 一樣,F(xiàn)REETEXTTABLE 返回帶有 KEY,RANK 的表。舉例說明:SELECT FT_TBL.CategoryName, FT_TBL.Description,KEY_TBL.RANKFROM Categories AS FT_TBL INNER JOINFREETEXTTABLE(Categories, Description, 'sweetest candy bread and dry meat') AS KEY_TBLON FT_TBL.Ca
19、tegoryID = KEY_TBL.KEY在 ASP 中使用全文本檢索Dim cnn Dim rsDim strSQLstrSQL = "SELECT book_name " &_"FROM books " &_"WHERE CONTAINS( description, '" & Request("search_condition") & "' )"Set cnn = Server.CreateObject("ADODB.Connect
20、ion")Set rs = Server.CreateObject("ADODB.RecordSet")cnn.Open "provider=sqloledb;datasource=.;initial catalog=books;user id=sa;pasword=;"rs.Open strSQL,cnn上面的例子十分簡單,僅為示意。只要掌握了 CONTAINS 和 CONTAINSTABLE 的語法,在使用上和一般的 ADO 查詢一樣。(完)全文索引和全文檢索是sql server 7.0的新增功能,它能夠?qū)?shù)據(jù)中的字符類型列(如varch
21、ar、text等類型列)進行索 引,并通過索引實現(xiàn)全文搜索查詢。sql server常規(guī)索引與全文檢索相比,二者的區(qū)別如下: 常規(guī)索引 全文索引 使用create index或約束定義創(chuàng)建 使用全文索引存儲過程創(chuàng)建和刪除 通過刪除或執(zhí)行drop index語句刪除 當插入、修改或刪除數(shù)據(jù)時,sql server 只能通過任務(wù)調(diào)度或執(zhí)行存儲過 能夠自動更新常規(guī)索引內(nèi)容 程來填充全文索引 每個表可以建立多個常規(guī)索引 每個表只能有一個全文索引 索引不能分組 同一個數(shù)據(jù)庫中的多個全文索引可 以組織為一個全文目錄 常規(guī)索引存儲在數(shù)據(jù)庫文件中 全文索引存儲在文件系統(tǒng)中 為了支持全文索引操作,sql ser
22、ver 7.0新增了一些新存儲過程和transact-sql語句,使用這些存儲過程創(chuàng)建全文索引的 具本步驟為(括號內(nèi)為每步所調(diào)用的存儲過程名稱): (1)啟動數(shù)據(jù)庫的全文處理功能(sp_fulltext_datebase); (2)建立全文目錄(sp_fulltext_catalog); (3)在全文目錄中注冊需要全文索引的表(sp_fulltext_table); (4)指出表中需要全文檢索的列名(sp_fulltext_column) (5)為表創(chuàng)建全文索引(sp_fulltext_table); (6)填充全文索引(sp_fulltext_catalog)。 例: use pubs go
23、 exec sp_fulltext_database 'enable' -為titles表建立全文索引數(shù)據(jù)元,其中create為建立,activate為激活,deactivate為關(guān)閉表全文索引的激活狀態(tài),使 它不再參加全文目錄填充,drop為刪除;create參數(shù)中,后面跟的是全文目錄名稱和索引列名。 -下面語句為pubs數(shù)據(jù)庫中的titles表創(chuàng)建全文索引數(shù)據(jù)元,存儲該數(shù)據(jù)元的全文目錄為FT_pubs,所使用的唯一索引為 UPKCL_titleidind(title表中為title_id列的PRIMARY KEY約束所建立的唯中索引) sp_fulltext_table t
24、itles,'create','FT_pubs','upkcl_titledind' -激活它 sp_fulltext_table titles,'activate' -指定參加全文索引的列 sp_fulltext_column 'titles','title','add' sp_fulltext_column 'titles','notes','add' 下面是一個完整的例子: -在執(zhí)行該腳本程序之前啟動sql server的全文搜索
25、服務(wù),即microsoft search服務(wù) use pubs -打開數(shù)據(jù)庫 go -檢查pubs是否支持全文索引,如果不支持全文索引,則使用sp_fulltext_datebase打開該功能 if (select databaseproperty ('pubs','IsFulltextEnables')=0 execute sp_fulltext_database 'enable' -建立全文目錄FT_pubs execute sp_fulltext_catalog 'FT_pubs','create' -為ti
26、tles表建立全文索引數(shù)據(jù)元 execute sp_fulltext_table 'titles','FT_pubs','UPKCL_titleidind' -設(shè)置全文索引列名 execute sp_fulltext_column 'titles','title','add' execute sp_fulltext_column 'titles','notes','add' -建立全文索引 execute sp_fulltext_table '
27、FT_pubs','activate' -填充全文索引目錄 execute sp_fulltext_catalog 'FT_pubs','start_full' GO -檢查全文目錄填充情況 WHILE FulltextCatalogProperty("FT_pubs','PopulateStatus')<>0 BEGIN -如果全文目錄正處于填充狀態(tài),則等待30秒后再檢測一次 WAITFOR DELAY 0:0:30 END -全文目錄填充完成后,使用全文目錄檢索 -查詢title列或not
28、es列中包含有database或computer字符串的圖書名稱 SELECT title FROM title where CONTAINTS(title,'database') or contains(notes,'database') or contains(title,'computer') or contains(notes,'computer')學(xué)習(xí)如何充分利用 SQL Server 2000 的全文搜索功能。本文包含有關(guān)實現(xiàn)最大吞吐率和最佳性能的幾點提示和技巧。 目錄簡介 全文搜索功能簡介 配置全文搜索功能 全文查詢
29、 排位和優(yōu)化 其他性能技巧 小結(jié) 附錄 A:實現(xiàn)全文搜索功能的最佳選擇 附錄 B:使用最佳選擇、結(jié)果分頁和有效全文查詢邏輯的示例應(yīng)用程序 附錄 C:資源 簡介使用 Microsoft? SQL? Server 2000 的全文搜索功能,可以對在非結(jié)構(gòu)化文本數(shù)據(jù)上生成的索引執(zhí)行快速、靈活的查詢。常用的全文搜索工具是網(wǎng)站的搜索引擎。為了幫助讀者理解全文搜索功能的最佳使用方法,本文介紹了大量抽象概念;并對優(yōu)化全文索引和查詢以實現(xiàn)最大吞吐率和最佳性能,提供了幾點提示和技巧。全文搜索功能簡介全文搜索功能在 SQL Server 7.0 中引入。全文搜索的核心引擎建立在 Microsoft Search
30、(MSSearch) 技術(shù)上,Microsoft Exchange 和 Microsoft SharePoint? Portal Server 等產(chǎn)品中也采用了此項技術(shù)。SQL Server 7.0 全文搜索中公開的功能可提供基本的文本搜索功能,并使用早期版本的 MSSearch;而 SQL Server 2000 的全文搜索實現(xiàn)則包含一組可靠的索引和查詢功能,并在 SQL Server 7.0 的基礎(chǔ)之上添加了幾項增強功能。這些增強功能包括:通過 Microsoft 群集服務(wù)完全支持群集操作,能夠過濾和索引 IMAGE 列中存儲的文檔,提供改進的語言支持,以及在性能、可縮放性和可靠性方面進行
31、了改進。MSSearch 生成、維護和查詢文件系統(tǒng)中(而不是 SQL Server 中)存儲的全文索引。MSSearch 進行全文索引時使用的邏輯和物理存儲單元是目錄。全文目錄在每個數(shù)據(jù)庫中包含一個或多個全文索引 - 可以為 SQL Server 中的每個表創(chuàng)建一個全文索引,且索引中可以包含該表中的一列或多列。每個表只能屬于一個目錄,且每個表只能創(chuàng)建一個索引。我們將簡單介紹有關(guān)組織全文目錄和索引的最佳方案 - 但首先,讓我們來簡單了解一下全文搜索的工作原理。配置全文搜索功能要為 SQL Server 中存儲的文本數(shù)據(jù)創(chuàng)建全文索引,應(yīng)該先完成以下幾步準備工作。第一步是以全文方式啟用包含要生成索引
32、的文本數(shù)據(jù)的數(shù)據(jù)庫(如果您尚未執(zhí)行此操作)。注意:執(zhí)行以下語句將丟棄并重新創(chuàng)建屬于要啟用全文搜索的數(shù)據(jù)庫的所有全文目錄。除非要重新創(chuàng)建全文目錄,否則請確保在要啟用的特定數(shù)據(jù)庫中未創(chuàng)建任何全文目錄。如果您是 sysadmin 角色的成員或此數(shù)據(jù)庫的 db_owner,可以繼續(xù)進行并發(fā)出以下語句:use Northwind exec sp_fulltext_database 'enable'接下來,您需要創(chuàng)建全文目錄,以存儲全文索引。正如前面所提到的,此目錄中的數(shù)據(jù)存儲在文件系統(tǒng)中(而不是 SQL Server 中),因此,在考慮全文目錄的存儲位置時應(yīng)該仔細選擇。除非指定其他位置,
33、否則全文目錄將存儲在 FTDATA 目錄(位于 Microsoft SQL ServerMSSQL 存儲位置中)的子目錄中。以下是在非默認位置創(chuàng)建全文目錄的方法:exec sp_fulltext_catalog 'Cat_Desc', 'create', 'f:ft'在本例中,全文目錄將創(chuàng)建為“f:ft”的子目錄,如果您查看文件系統(tǒng)的該部分,將看到它有了自己的目錄。MSSearch 使用的全文目錄的命名規(guī)則是:SQL+dbid+catalogID目錄 ID 從 00005 開始,并且每新建一個目錄就遞增 1。如果可能的話,最好在其所在的物理驅(qū)動器
34、上創(chuàng)建全文目錄。如果生成全文索引的進程需要進行大量的 I/O 操作(具體而言,就是從 SQL Server 中讀取數(shù)據(jù),然后向文件系統(tǒng)寫入索引),則應(yīng)避免使 I/O 子系統(tǒng)成為瓶頸。那么,全文目錄有多大呢?通常情況下,全文目錄的系統(tǒng)開銷比 SQL Server 中存儲的數(shù)據(jù)(對其進行全文索引)量高出大約 30%;但是,此規(guī)則取決于數(shù)據(jù)中唯一單詞(或主鍵)的分布,以及被您視為是干擾詞的單詞的分布。干擾詞(或終止詞)是指要排除在全文索引和查詢以外的詞語(因為它們不是您感興趣的搜索詞,而且出現(xiàn)頻率很高,所以只會使索引變得很大,而不會有實際效果)。稍后,我們將介紹有關(guān)干擾詞選擇方面的注意事項,以及如何
35、優(yōu)化干擾詞以改善查詢性能。如果您尚未執(zhí)行此操作,請在每個要生成全文索引的表上創(chuàng)建一個唯一的單列非空索引。這個唯一索引用于將表中的每一行映射到 MSSearch 內(nèi)部使用的一個唯一可壓縮主鍵。接下來,您需要讓 MSSearch 知道您要為表創(chuàng)建全文索引。對表發(fā)出以下語句可將該表添加到所選的全文目錄中(在本例中,它是我們在前面創(chuàng)建的“Cat_Desc”):exec sp_fulltext_table 'Categories', 'create', 'Cat_Desc', 'PK_Categories'下一步是向此全文索引添加列。您可以
36、為每一列選擇一種語言,如果該列的類型為 IMAGE,則必須再指定一列,以指示 IMAGE 列的每一行中存儲的文檔類型。在列語言選擇方面,有一些重要但尚未成文的注意事項。這些注意事項與文本的標記方式以及 MSSearch 對文本的索引方式有關(guān)。被索引的文本是通過一個稱作單詞分隔符(用作單詞邊界標記)的組件提供的。在英文中,單詞分隔符通常是空格或某種形式的標點符號;而在其他語言中(例如德語),單詞或字符可以組合在一起;因此,所選的列語言應(yīng)表示要存儲在該列的行中的語言。如果不確定,最好的方法通常是使用中性單詞分隔符(只使用空格和標點符號執(zhí)行標記功能)。選擇列語言的另一個好處是“尋根溯源”。全文查詢中
37、的尋根溯源是指在特定語言中搜索某一單詞的所有變化形式的過程。選擇語言的另一個考慮因素與數(shù)據(jù)的表示方法有關(guān)。對于非 IMAGE 列數(shù)據(jù)來說,不需要執(zhí)行特殊的過濾操作;而文本通常需要將單詞分隔組件按原樣傳遞。單詞分隔符主要用于處理書面文本。因此,如果文本中有任何類型的標記(例如 HTML),則在索引和搜索過程中,語言精確性將不會很高。這種情況下,您有兩種選擇 - 首選方法是只將文本數(shù)據(jù)存儲在 IMAGE 列中,并指明其文檔類型,以便對其進行過濾。如果不選擇此方法,則可以考慮使用中性單詞分隔符,并且可能的話,在干擾詞列表中添加標記數(shù)據(jù)(例如 HTML 中的“br”)。在指定了中性語言的列中不能進行任
38、何基于語言的尋根溯源,但有些環(huán)境可能會要求您選擇此方法。在知道列選項后,通過發(fā)出以下語句在全文索引中添加一列或兩列:exec sp_fulltext_column 'Categories', 'Description', 'add'您可能注意到,此處未指定任何語言 - 這種情況下,將使用默認的全文語言??梢酝ㄟ^系統(tǒng)存儲過程“sp_configure”為服務(wù)器設(shè)置默認全文語言。將所有列添加到全文索引后,即可執(zhí)行填充操作。填充方法之多實在是不勝枚舉,此處不作詳細介紹。在本例中,只需對表啟動完全填充,并等待它執(zhí)行完畢:exec sp_fulltext_
39、table 'Categories', 'start_full'您可能希望使用 FULLTEXTCATALOGPROPERTY 或 OBJECTPROPERTY 函數(shù)來監(jiān)視填充狀態(tài)。要獲取目錄填充狀態(tài),可以執(zhí)行:select FULLTEXTCATALOGPROPERTY('Cat_Desc', 'Populatestatus')通常情況下,如果完全填充正在進行,則返回的結(jié)果是“1”。有關(guān)如何使用 FULLTEXTCATALOGPROPERTY 和 OBJECTPROPERTY 的詳細信息,請參閱 SQL Server Books
40、 Online。全文查詢查詢?nèi)乃饕c執(zhí)行 SQL Server 中的標準關(guān)系型查詢略有不同。由于索引是在 SQL Server 外部進行存儲和管理的,因此全文查詢處理大部分由 MSSearch 完成(因此,那些一部分是關(guān)系型、一部分基于全文的查詢將被單獨處理),這樣做有時會損害性能。從本質(zhì)上說,執(zhí)行全文查詢時,查詢詞傳遞給 MSSearch,后者遍歷其內(nèi)部數(shù)據(jù)結(jié)構(gòu)(索引),并向 SQL Server 返回主鍵和排位值。如果執(zhí)行 CONTAINS 或 FREETEXT 查詢,則通??床坏街麈I或排位值,但如果執(zhí)行 CONTAINSTABLE 或 FREETEXTTABLE 查詢,則將獲得這些值,
41、然后這些值通常會與基表合并在一起。與基表合并主鍵的進程需要很高的系統(tǒng)開銷 - 稍后,我們將向您介紹一些巧妙的方法以盡量減少或完全避免這種合并。如果您通過不斷思考,對全文查詢?nèi)绾畏祷財?shù)據(jù)有了一個初步了解,就可以推測出 CONTAINS/FREETEXT 查詢僅執(zhí)行 CONTAINSTABLE/FREETEXTTABLE 查詢并與基表進行合并。有了這樣的了解,您應(yīng)該避免使用這些類型的查詢,除非不這樣做的開銷更高。在 Web 搜索應(yīng)用程序中,使用 CONTAINSTABLE 與 FREETEXTTABLE 比使用不帶 TABLE 的同類函數(shù)好得多。到現(xiàn)在為止,您已經(jīng)知道全文查詢是用來從 SQL Se
42、rver 之外存儲的 MSSearch 索引中訪問數(shù)據(jù)的特殊方法,還知道如果盲目地與基表進行合并,就會遇到麻煩。應(yīng)該了解的另外一個重要內(nèi)容是 CONTAINS 樣式查詢與 FREETEXT 樣式查詢之間的本質(zhì)差別。CONTAINS 查詢用于對所查詢的所有詞語執(zhí)行完全匹配查詢。無論您只查找單個單詞,還是查找以“orange”開頭的所有單詞,系統(tǒng)只返回包含所有搜索詞的結(jié)果。因此,CONTAINS 查詢速度很快,因為它們通常返回很少的結(jié)果,并且不需要執(zhí)行過多的附加處理。CONTAINS 查詢的缺點包括令人生厭的干擾詞過濾問題。經(jīng)驗豐富的開發(fā)人員以及過去使用過全文搜索的數(shù)據(jù)庫管理員,在試圖匹配只包含單
43、個干擾詞的單詞或詞組時,曾遇到過“您的查詢只包含干擾詞”這樣令人吃驚的錯誤。要避免收到此錯誤,方法之一是在執(zhí)行全文查詢之前過濾出干擾詞。向包含干擾詞的 CONTAINS 查詢返回結(jié)果是不可能的,因為此類查詢只返回與整個查詢字符串完全匹配的結(jié)果。由于干擾詞不是全文索引項,因此包含干擾詞的 CONTAINS 查詢不會返回任何行。FREETEXT 查詢消除了 CONTAINS 查詢中偶爾出現(xiàn)的所有警告說明。當發(fā)出 FREETEXT 查詢時,實際上發(fā)出的是詞根查詢。因此,當您搜索“root beer”時,“root”和“beer”包含其所有形式(尋根溯源與語言相關(guān);所用的語言由生成索引時指定的全文列語
44、言確定,并且在所有查詢的列中必須相同),并且系統(tǒng)將返回至少與這些詞語之一匹配的所有行。FREETEXT 查詢的負面影響是它們通常比 CONTAINS 查詢耗用更多的 CPU - 因為要尋根溯源以及返回更多的結(jié)果,就需要包含更復(fù)雜的排位計算。不過,基于 FREETEXT 的查詢非常靈活,而且速度非???,是基于 Web 的搜索應(yīng)用程序中通常使用的最佳選擇。排位和優(yōu)化我經(jīng)常遇到使用全文搜索的用戶,他們問我排位編號是什么意思,以及如何將排位編號轉(zhuǎn)換成某種用戶可以理解的值。對這個問題,回答可長可短,在這里我將進行簡要回答。簡單而言,這些排位編號不如結(jié)果返回的順序那樣重要。也就是說,當您按照排位對結(jié)果進行
45、排序時,總是首先返回關(guān)聯(lián)程度最高的結(jié)果。排位值本身常常變化 - 全文搜索使用概率排位算法,即返回的每個文檔的關(guān)聯(lián)性受全文索引中的任何或所有其他文檔的直接影響。有些人認為,一種有助于增加某些行排位的技巧是在這些行的全文索引列中重復(fù)常用的搜索關(guān)鍵字。盡管在某種程度上,這種方法可能會提高這些行因某些關(guān)鍵字而首先返回的幾率,但在其他情況下,可能會適得其反 - 而且還存在使詞語查詢性能降低的風(fēng)險。較好的解決方案是為搜索應(yīng)用程序?qū)崿F(xiàn)“最佳選擇”系統(tǒng)(請參閱以下示例),這樣就可以確保首先返回某些文檔。多次重復(fù)使用關(guān)鍵字會使這些特定關(guān)鍵字的全文索引擴大,并使得 MSSearch 在查找正確行和計算排位時浪費時
46、間。如果全文索引數(shù)據(jù)量很大,并嘗試使用了此方法,您可能會發(fā)現(xiàn)某些全文查詢很耗時。如果能夠?qū)崿F(xiàn)更細致(也可能更精確)的“最佳選擇”系統(tǒng),您會發(fā)現(xiàn)它明顯改善了查詢性能。多次重復(fù)數(shù)據(jù)的另一個問題與用于組合關(guān)系型查詢和全文查詢的常用技巧有關(guān)。許多使用全文搜索的用戶都深受此問題的困擾,每當他們試圖將某種過濾器應(yīng)用于全文查詢返回的結(jié)果時,便會遇到這樣的問題。正如前面所說的,全文查詢?yōu)槊總€匹配行返回一個主鍵和一個排位 - 要收集有關(guān)這些行的任何詳細信息,必須與它的基表進行合并。由于從無限制的全文查詢中可能會返回任意數(shù)量的結(jié)果,因此合并可能需要大量系統(tǒng)開銷。人們發(fā)現(xiàn)避免合并的一個有效方法是只在全文索引中添加要
47、過濾的數(shù)據(jù)(如果可能)。換句話說,如果用戶要從報紙上所有文章的正文中搜索關(guān)鍵字“Ichiro”,并且只希望返回該報上體育專欄中的文章,則查詢語句通常如下所示:- 方法 1:- 開銷最高:先全部選擇,然后再合并和過濾SELECT ARTICLES_TBL.Author, ARTICLES_TBL.Body, ARTICLES_TBL.Dateline, FT_TBL.rank FROM FREETEXTTABLE(Articles, Body, 'Ichiro') AS FT_TBLINNER JOIN Articles AS ARTICLES_TBLON FT_TBL.key
48、= ARTICLES_TBL.ArticleIDWHERE ARTICLES_TBL.Category = 'Sports'- 方法 2:- 可以使用,但會導(dǎo)致意外結(jié)果并變慢,或者會返回不準確的結(jié)果: - 執(zhí)行全文過濾,并且只提取主鍵和排位- (處理在 Web 服務(wù)器上完成)SELECT key, rank FROM CONTAINSTABLE(Articles, *, 'FORMSOF(INFLECTIONAL('Ichiro') AND "sports"')這兩個查詢要么不必要地占用大量系統(tǒng)開銷,要么存在返回錯誤結(jié)果的可能
49、性(在第二個查詢中,“sports”很可能出現(xiàn)在所有類型的文章中)。這兩項技術(shù)還存在其他變體,但這是兩種非常簡單的模型。如果可行,我通常建議您對數(shù)據(jù)進行水平劃分。即,“類別”列的每個可能值都自成一列(或表),并且與該文章相關(guān)的可搜索關(guān)鍵字僅存儲在此列中。采用此方法,而不是使用一個“正文”列和一個“類別”列,可以去掉“類別”列,而使用存儲可搜索關(guān)鍵字的“Body_<category>”列。如以下示例所示:- 如果您可以調(diào)整架構(gòu),這非常有效 每個類別- 都成為自己的列(或表格),并且需要命中的- 全文索引也較少。這明顯需要作一些解釋SELECT key, rank FROM FREET
50、EXTTABLE(Articles, Body_Sports, 'Ichiro')對于包含大量數(shù)據(jù),且這些數(shù)據(jù)可適應(yīng)此架構(gòu)(或許是主架構(gòu))更改的系統(tǒng),其性能會得到顯著的提高。但在何時應(yīng)用多個過濾器或不應(yīng)用過濾器方面卻有著明顯的限制。當然,還有其他的方法可以解決這些問題。通過以上示例,您會了解一種將某些搜索條件抽象到架構(gòu)的方法 - 實際上是“欺騙”優(yōu)化程序(更確切的說是“成為”優(yōu)化程序),因為在 SQL Server 本身的全文查詢中當前不存在本地優(yōu)化。其他性能技巧人們在聊天時常常問我的另一個問題是如何才能分頁顯示全文查詢結(jié)果。換句話說,如果我要發(fā)出“root beer”查詢,一
51、次在某一 Web 頁上顯示 40 個結(jié)果,并且只希望返回該頁面上的 40 個結(jié)果(例如,如果我在第三頁,我希望僅返回第 81 至第 120 條結(jié)果)。對于分頁顯示結(jié)果,我曾見過多種方法,但沒有一種方法能夠做到百分之百有效。我所推薦的方法可以最大程度地減少全文查詢執(zhí)行的次數(shù)(實際上,對于要分頁顯示的每個結(jié)果集只需執(zhí)行一次),并將 Web 服務(wù)器用作一個簡單的緩存。從更高的層面來講,您只需在全文查詢中檢索一個完整的主鍵和排位值行集合(如果需要,可以在架構(gòu)中使用最佳選擇并提取常用過濾器),并將其存儲在 Web 服務(wù)器的內(nèi)存中(這取決于您的應(yīng)用程序和負載,想象將 <32 字節(jié)的典型主鍵大小與 &
52、lt;4 字節(jié)的排位大小相加 等于 <36 字節(jié),然后乘以通常返回的結(jié)果集 <1000 行,最后等于 <35K。假定一個在任何給定時間返回 <1000 個活動查詢結(jié)果集中的一個活動緩存集,您將發(fā)現(xiàn)此活動緩存集在 Web 服務(wù)器上占用的內(nèi)存少于 35MB - 這還可以接受)。為了分頁顯示結(jié)果,該進程只遍歷 Web 服務(wù)器的內(nèi)存中存儲的數(shù)組,并對 SQL Server 發(fā)出 SELECT 以便只顯示需要顯示的行和列。這又回到了全文查詢僅返回主鍵和排位的概念中 - SELECT(甚至許多這樣的查詢語句)比全文查詢的速度快許多倍。使用 SELECT 而不是與基表合并多個行,并結(jié)
53、合多個其他策略,您可以保留 SQL Server 計算機上更多的 CPU 周期,并且更有效、更劃算地利用 Web 領(lǐng)域。另一種可以替代 Web 服務(wù)器端緩存的方法是在 SQL Server 自身中緩存結(jié)果集,并定義多種用于瀏覽這些結(jié)果的方法。雖然本文著重說明 Web 服務(wù)器 (ASP) 級別的應(yīng)用程序設(shè)計,但 SQL Server 的可編程功能還為生成高性能的 Web 搜索應(yīng)用程序提供了強大的框架。小結(jié)Microsoft SQL Server 2000 的全文搜索功能為索引和查詢數(shù)據(jù)庫中存儲的非結(jié)構(gòu)化文本數(shù)據(jù)提供了可靠、快速而靈活的方法。如果要廣泛地將這種快速、準確的搜索功能應(yīng)用于各種應(yīng)用程序
54、,那么很有必要充分利用其速度和精確性,來實現(xiàn)全文搜索解決方案。通過分布計算負載并通過某些巧妙的方式對數(shù)據(jù)進行組織,可以省下錢來購買其他硬件和軟件,以擺脫因不必要的緩慢查詢帶來的困擾。在開發(fā)優(yōu)秀的搜索應(yīng)用程序時,通常要考慮到許多因素和注意事項,希望本文提供的信息和示例對您學(xué)習(xí)使用 SQL Server 2000 生成出色的 Web 搜索應(yīng)用程序會有所幫助。附錄 A:實現(xiàn)全文搜索功能的最佳選擇改進全文查詢性能和有效性的一種可行方法是實現(xiàn)“最佳選擇”系統(tǒng)。此系統(tǒng)是一種很簡單的方法,可確保某些與特定查詢表達式匹配的行先于其他行返回。最佳選擇沒有復(fù)雜的預(yù)編程邏輯(例如,SharePoint Portal
55、 Server 就包含這樣的邏輯),因此,通常是首選辦法。在本示例中挑選出最佳選擇,并將唯一的主鍵和一些關(guān)鍵字存儲在單獨的表中。FREETEXTTABLE 查詢對(非常小的)最佳選擇表執(zhí)行,并且從該查詢中返回的任何結(jié)果都與對基表的 FREETEXTTABLE 查詢結(jié)果一同返回。在給定這些搜索條件下,最先返回的將是所有“最佳選擇”行,隨后是被 MSSearch 視為關(guān)聯(lián)程度最高的行(以遞減順序返回)。下面是一個非常簡單的用于創(chuàng)建最佳選擇系統(tǒng)的示例腳本。use myDbcreate table documentTable(ftkey int not null, document ntext)cre
56、ate unique index DTftkey_idx on documentTable(ftKey)/* 在此插入文檔 (要生成全文索引的所有文檔)*/- 為所有文檔表創(chuàng)建全文目錄和索引exec sp_fulltext_catalog 'documents_cat', 'create', 'f:ftCats'exec sp_fulltext_table 'documentTable', 'create', 'documents_cat', 'DTftkey_idx'exec sp
57、_fulltext_column 'documentTable', 'document', 'add'exec sp_fulltext_table 'documentTable', 'start_change_tracking'exec sp_fulltext_table 'documentTable', 'start_background_updateindex'/* 現(xiàn)在創(chuàng)建最佳選擇表和索引 (添加應(yīng)該始終最先返回的文檔)*/create table bestBets(ftKey int not null, keywords ntext)create unique index BBftkey_idx
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 出租車客運服務(wù)承包與大數(shù)據(jù)分析協(xié)議
- 生態(tài)農(nóng)業(yè)園區(qū)場地租賃及農(nóng)產(chǎn)品銷售合作協(xié)議
- 車輛運輸安全培訓(xùn)與咨詢承包協(xié)議
- 車輛過戶手續(xù)全權(quán)委托合同樣本
- 特色餐飲廚師定制合同書
- 車輛托管與汽車保險代理合作協(xié)議
- 車輛維修費用賠償與保險理賠協(xié)議
- 會說話的動物課件
- 生命教育主題班會
- 護士外出培訓(xùn)
- 聲樂課說課課件
- 學(xué)生托管班管理制度
- 2024年山東夏季高中學(xué)業(yè)水平合格考生物試卷真題(含答案)
- 2025年經(jīng)濟學(xué)基礎(chǔ)知識測試試題及答案
- 統(tǒng)編版小學(xué)語文小升初專題訓(xùn)練:根據(jù)課文內(nèi)容填空(含答案)
- 2025年7月浙江省普通高中學(xué)業(yè)水平考試押題模擬暨選考意向?qū)б須v史學(xué)科試題(原卷版)
- 杭州市公安局濱江區(qū)分局招聘警務(wù)輔助人員筆試真題2024
- (2025)入黨積極分子培訓(xùn)考試試題及答案
- 2025年天津市河西區(qū)中考二模語文試題
- 2025屆高考化學(xué)復(fù)習(xí):必背化學(xué)方程式-有機化學(xué)
- DB31/ 638-2012鑄鋼件單位產(chǎn)品能源消耗限額
評論
0/150
提交評論