SQL全文本檢索應(yīng)用_第1頁(yè)
SQL全文本檢索應(yīng)用_第2頁(yè)
SQL全文本檢索應(yīng)用_第3頁(yè)
SQL全文本檢索應(yīng)用_第4頁(yè)
SQL全文本檢索應(yīng)用_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、.SQL全文本檢索應(yīng)用基本知識(shí)1. SQL Server7 的 DeskTop 版中沒(méi)有全文本檢索。2. 一個(gè)表只能有一個(gè)全文本檢索。3. 被檢索的表必須有單列的唯一索引。4. 全文本的索引存儲(chǔ)在文件系統(tǒng)中,而非數(shù)據(jù)庫(kù)中。5. 更新全文本索引的過(guò)程比常規(guī)索引要耗時(shí),而且也不象常規(guī)索引那樣可以由數(shù)據(jù)庫(kù)系統(tǒng)立即更新。6. 全文本索引包含在全文本目錄( Full-Text Catalog )中,每個(gè)數(shù)據(jù)庫(kù)可以包含一個(gè)或多個(gè)目錄, 但一個(gè)目錄不能屬于多個(gè)數(shù)據(jù)庫(kù)。7. 全文本檢索只能在真正的表上創(chuàng)建,不能是視圖,系統(tǒng)表,臨時(shí)表。8. 全文本檢索會(huì)忽略某些噪音字( noise Words),比如英文的 a

2、,the,and,中文的'和','是'等等。9. 如果在查詢中包含 noise words ,就會(huì)引發(fā)錯(cuò)誤,在應(yīng)用程序中應(yīng)去除這些 noise words。啟動(dòng)全文本檢索服務(wù)。方法A:在企業(yè)管理器中打開(kāi) 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ù)庫(kù),在 Tools 的菜單中,選擇 Full-text Indexing,進(jìn)入歡迎( Welcome )的屏幕,單擊 next。step2. 選擇被檢索的表,單擊 next。step3. 選擇唯一索引,單擊 next。step4. 選擇被索引的列,單擊 Add,該列顯示在右欄中。單擊 next。step5. 選擇目錄(選擇已存在的目錄,或創(chuàng)建新的目錄),單擊 next。step6. 選擇或創(chuàng)建 population schedule(可選項(xiàng)),單擊 next。step7. 單擊 finis

4、h。使用 SQL-DMO (以 VB 為例) step1. 在工程的引用中選擇 Microsoft SQLDMO Object Library。step2. 創(chuàng)建 SQLServer 對(duì)象。Dim objSQL As New SQLDMO.SQLServerobjSQL.Connect "localhost", "sa", ""step3. 創(chuàng)建新的目錄,并加入到被索引的數(shù)據(jù)庫(kù)目錄中。Dim objCatalog As New SQLDMO.FullTextCatalog'使 pubs 為全文本檢索的數(shù)據(jù)庫(kù)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. 啟動(dòng)全文本目錄objCatalog.Start SQLDMOFullText_Full使用存儲(chǔ)過(guò)程step1. 使 pubs 為全文本檢索的數(shù)據(jù)庫(kù)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、 啟動(dòng)全文本目錄sp_fulltext_catalog 'ftcPubsTest','start_full'CONTAINS 語(yǔ)法我們通常在 WHERE 子句中使用 CONTAINS ,就象這樣: SELECT * FROM table_name WHERE CONTAINS(fullText_column,'search contents')。 我們通過(guò)例子來(lái)學(xué)習(xí),假設(shè)有表 students,其中的 address 是全文本檢索的列。 1. 查詢住址在北京的學(xué)生SELECT student_id,student_nameFROM student

10、sWHERE CONTAINS( address, 'beijing' )remark: beijing是一個(gè)單詞,要用單引號(hào)括起來(lái)。2. 查詢住址在河北省的學(xué)生SELECT student_id,student_nameFROM studentsWHERE CONTAINS( address, '"HEIBEI province"' )remark: HEBEI province是一個(gè)詞組,在單引號(hào)里還要用雙引號(hào)括起來(lái)。 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. 查詢以 '湖' 開(kāi)頭的地址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 指定了一個(gè)介于 01之間的數(shù), 類似系數(shù)(我的理解)。表示不同條件有不同的側(cè)重。7. 單詞的多態(tài)查詢SELECT student_id,student_nameFROM studentsWHERE CONTAINS( address, 'FORMSOF (INFLECTIONAL,street)' )remark: 查詢將返回包含 '

14、;street','streets'等字樣的地址。對(duì)于動(dòng)詞將返回它的不同的時(shí)態(tài),如:dry,將返回 dry,dried,drying 等等。以上例子都使用英文,不使用中文是因?yàn)橛械牟樵兎绞街形牟恢С?,而且我的?jì)算機(jī)是英文系統(tǒng)6. 更新全文本索引的過(guò)程比常規(guī)索引要耗時(shí),而且也不象常規(guī)索引那樣可以由數(shù)據(jù)庫(kù)系統(tǒng)立即更新??梢粤⒓锤碌?. 如果在查詢中包含 noise words ,就會(huì)引發(fā)錯(cuò)誤,在應(yīng)用程序中應(yīng)去除這些 noise words。不對(duì),查詢時(shí)會(huì)自己過(guò)濾掉noise word,只有查詢的內(nèi)容全是noise words時(shí)才會(huì)出現(xiàn)錯(cuò)誤CONTAINSTABLE 語(yǔ)法我

15、們通常在 FROM 子句中使用 CONTAINSTABLE ,就象這樣:SELECT * FROM table_name, CONTAINTABLE(fulltext_table,fullText_column,'search condition') WHERE .。CONTAINSTABLE 在查詢方式上與 CONTAINS 幾乎一樣,所以就不用贅述了。CONTAINSTABLE 返回的是符合查詢條件的表,在 SQL 語(yǔ)句中我們可以把它當(dāng)作一個(gè)普通的表來(lái)使用。我們看一個(gè)例子,比較這兩種表的不同。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。在第一部分里我們就強(qiáng)調(diào)了:被全文索引的表必須有唯一索引。這個(gè)唯一的索引列在返回的表中就成為 KEY。我們通常把它作為表

17、連接的條件。在某些網(wǎng)站搜索時(shí),結(jié)果中會(huì)出現(xiàn)表示匹配程度的數(shù)字,RANK 與此類似。它的值在01000之間,標(biāo)識(shí)每一行與查詢條件的匹配程度,程度越高,RANK 的值大,通常情況下,按照 RANK 的降序排列。FREETEXT 語(yǔ)法FREETEXT 與 CONTAINS 類似,只是沒(méi)有 CONTAINS 的精度高。在 CONTAINS 中,對(duì)查詢條件的寫法有很多要求,而 FREETEXT 就沒(méi)有,可以是任意的單詞,詞組或句子??聪旅娴睦樱篠ELECT CategoryNameFROM CategoriesWHERE FREETEXT (Description, 'sweetest can

18、dy bread and dry meat' )FREETEXTTABLE 語(yǔ)法和 CONTAINSTABLE 一樣,F(xiàn)REETEXTTABLE 返回帶有 KEY,RANK 的表。舉例說(shuō)明: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上面的例子十分簡(jiǎn)單,僅為示意。只要掌握了 CONTAINS 和 CONTAINSTABLE 的語(yǔ)法,在使用上和一般的 ADO 查詢一樣。(完)全文索引和全文檢索是sql server 7.0的新增功能,它能夠?qū)?shù)據(jù)中的字符類型列(如varch

21、ar、text等類型列)進(jìn)行索 引,并通過(guò)索引實(shí)現(xiàn)全文搜索查詢。sql server常規(guī)索引與全文檢索相比,二者的區(qū)別如下: 常規(guī)索引 全文索引 使用create index或約束定義創(chuàng)建 使用全文索引存儲(chǔ)過(guò)程創(chuàng)建和刪除 通過(guò)刪除或執(zhí)行drop index語(yǔ)句刪除 當(dāng)插入、修改或刪除數(shù)據(jù)時(shí),sql server 只能通過(guò)任務(wù)調(diào)度或執(zhí)行存儲(chǔ)過(guò) 能夠自動(dòng)更新常規(guī)索引內(nèi)容 程來(lái)填充全文索引 每個(gè)表可以建立多個(gè)常規(guī)索引 每個(gè)表只能有一個(gè)全文索引 索引不能分組 同一個(gè)數(shù)據(jù)庫(kù)中的多個(gè)全文索引可 以組織為一個(gè)全文目錄 常規(guī)索引存儲(chǔ)在數(shù)據(jù)庫(kù)文件中 全文索引存儲(chǔ)在文件系統(tǒng)中 為了支持全文索引操作,sql ser

22、ver 7.0新增了一些新存儲(chǔ)過(guò)程和transact-sql語(yǔ)句,使用這些存儲(chǔ)過(guò)程創(chuàng)建全文索引的 具本步驟為(括號(hào)內(nèi)為每步所調(diào)用的存儲(chǔ)過(guò)程名稱): (1)啟動(dòng)數(shù)據(jù)庫(kù)的全文處理功能(sp_fulltext_datebase); (2)建立全文目錄(sp_fulltext_catalog); (3)在全文目錄中注冊(cè)需要全文索引的表(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ù)中,后面跟的是全文目錄名稱和索引列名。 -下面語(yǔ)句為pubs數(shù)據(jù)庫(kù)中的titles表創(chuàng)建全文索引數(shù)據(jù)元,存儲(chǔ)該數(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' 下面是一個(gè)完整的例子: -在執(zhí)行該腳本程序之前啟動(dòng)sql server的全文搜索

25、服務(wù),即microsoft search服務(wù) use pubs -打開(kāi)數(shù)據(jù)庫(kù) go -檢查pubs是否支持全文索引,如果不支持全文索引,則使用sp_fulltext_datebase打開(kāi)該功能 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秒后再檢測(cè)一次 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)實(shí)現(xiàn)最大吞吐率和最佳性能的幾點(diǎn)提示和技巧。 目錄簡(jiǎn)介 全文搜索功能簡(jiǎn)介 配置全文搜索功能 全文查詢

29、 排位和優(yōu)化 其他性能技巧 小結(jié) 附錄 A:實(shí)現(xiàn)全文搜索功能的最佳選擇 附錄 B:使用最佳選擇、結(jié)果分頁(yè)和有效全文查詢邏輯的示例應(yīng)用程序 附錄 C:資源 簡(jiǎn)介使用 Microsoft? SQL? Server 2000 的全文搜索功能,可以對(duì)在非結(jié)構(gòu)化文本數(shù)據(jù)上生成的索引執(zhí)行快速、靈活的查詢。常用的全文搜索工具是網(wǎng)站的搜索引擎。為了幫助讀者理解全文搜索功能的最佳使用方法,本文介紹了大量抽象概念;并對(duì)優(yōu)化全文索引和查詢以實(shí)現(xiàn)最大吞吐率和最佳性能,提供了幾點(diǎn)提示和技巧。全文搜索功能簡(jiǎn)介全文搜索功能在 SQL Server 7.0 中引入。全文搜索的核心引擎建立在 Microsoft Search

30、(MSSearch) 技術(shù)上,Microsoft Exchange 和 Microsoft SharePoint? Portal Server 等產(chǎn)品中也采用了此項(xiàng)技術(shù)。SQL Server 7.0 全文搜索中公開(kāi)的功能可提供基本的文本搜索功能,并使用早期版本的 MSSearch;而 SQL Server 2000 的全文搜索實(shí)現(xiàn)則包含一組可靠的索引和查詢功能,并在 SQL Server 7.0 的基礎(chǔ)之上添加了幾項(xiàng)增強(qiáng)功能。這些增強(qiáng)功能包括:通過(guò) Microsoft 群集服務(wù)完全支持群集操作,能夠過(guò)濾和索引 IMAGE 列中存儲(chǔ)的文檔,提供改進(jìn)的語(yǔ)言支持,以及在性能、可縮放性和可靠性方面進(jìn)行

31、了改進(jìn)。MSSearch 生成、維護(hù)和查詢文件系統(tǒng)中(而不是 SQL Server 中)存儲(chǔ)的全文索引。MSSearch 進(jìn)行全文索引時(shí)使用的邏輯和物理存儲(chǔ)單元是目錄。全文目錄在每個(gè)數(shù)據(jù)庫(kù)中包含一個(gè)或多個(gè)全文索引 - 可以為 SQL Server 中的每個(gè)表創(chuàng)建一個(gè)全文索引,且索引中可以包含該表中的一列或多列。每個(gè)表只能屬于一個(gè)目錄,且每個(gè)表只能創(chuàng)建一個(gè)索引。我們將簡(jiǎn)單介紹有關(guān)組織全文目錄和索引的最佳方案 - 但首先,讓我們來(lái)簡(jiǎn)單了解一下全文搜索的工作原理。配置全文搜索功能要為 SQL Server 中存儲(chǔ)的文本數(shù)據(jù)創(chuàng)建全文索引,應(yīng)該先完成以下幾步準(zhǔn)備工作。第一步是以全文方式啟用包含要生成索引

32、的文本數(shù)據(jù)的數(shù)據(jù)庫(kù)(如果您尚未執(zhí)行此操作)。注意:執(zhí)行以下語(yǔ)句將丟棄并重新創(chuàng)建屬于要啟用全文搜索的數(shù)據(jù)庫(kù)的所有全文目錄。除非要重新創(chuàng)建全文目錄,否則請(qǐng)確保在要啟用的特定數(shù)據(jù)庫(kù)中未創(chuàng)建任何全文目錄。如果您是 sysadmin 角色的成員或此數(shù)據(jù)庫(kù)的 db_owner,可以繼續(xù)進(jìn)行并發(fā)出以下語(yǔ)句:use Northwind exec sp_fulltext_database 'enable'接下來(lái),您需要?jiǎng)?chuàng)建全文目錄,以存儲(chǔ)全文索引。正如前面所提到的,此目錄中的數(shù)據(jù)存儲(chǔ)在文件系統(tǒng)中(而不是 SQL Server 中),因此,在考慮全文目錄的存儲(chǔ)位置時(shí)應(yīng)該仔細(xì)選擇。除非指定其他位置,

33、否則全文目錄將存儲(chǔ)在 FTDATA 目錄(位于 Microsoft SQL ServerMSSQL 存儲(chǔ)位置中)的子目錄中。以下是在非默認(rèn)位置創(chuàng)建全文目錄的方法:exec sp_fulltext_catalog 'Cat_Desc', 'create', 'f:ft'在本例中,全文目錄將創(chuàng)建為“f:ft”的子目錄,如果您查看文件系統(tǒng)的該部分,將看到它有了自己的目錄。MSSearch 使用的全文目錄的命名規(guī)則是:SQL+dbid+catalogID目錄 ID 從 00005 開(kāi)始,并且每新建一個(gè)目錄就遞增 1。如果可能的話,最好在其所在的物理驅(qū)動(dòng)器

34、上創(chuàng)建全文目錄。如果生成全文索引的進(jìn)程需要進(jìn)行大量的 I/O 操作(具體而言,就是從 SQL Server 中讀取數(shù)據(jù),然后向文件系統(tǒng)寫入索引),則應(yīng)避免使 I/O 子系統(tǒng)成為瓶頸。那么,全文目錄有多大呢?通常情況下,全文目錄的系統(tǒng)開(kāi)銷比 SQL Server 中存儲(chǔ)的數(shù)據(jù)(對(duì)其進(jìn)行全文索引)量高出大約 30%;但是,此規(guī)則取決于數(shù)據(jù)中唯一單詞(或主鍵)的分布,以及被您視為是干擾詞的單詞的分布。干擾詞(或終止詞)是指要排除在全文索引和查詢以外的詞語(yǔ)(因?yàn)樗鼈儾皇悄信d趣的搜索詞,而且出現(xiàn)頻率很高,所以只會(huì)使索引變得很大,而不會(huì)有實(shí)際效果)。稍后,我們將介紹有關(guān)干擾詞選擇方面的注意事項(xiàng),以及如何

35、優(yōu)化干擾詞以改善查詢性能。如果您尚未執(zhí)行此操作,請(qǐng)?jiān)诿總€(gè)要生成全文索引的表上創(chuàng)建一個(gè)唯一的單列非空索引。這個(gè)唯一索引用于將表中的每一行映射到 MSSearch 內(nèi)部使用的一個(gè)唯一可壓縮主鍵。接下來(lái),您需要讓 MSSearch 知道您要為表創(chuàng)建全文索引。對(duì)表發(fā)出以下語(yǔ)句可將該表添加到所選的全文目錄中(在本例中,它是我們?cè)谇懊鎰?chuàng)建的“Cat_Desc”):exec sp_fulltext_table 'Categories', 'create', 'Cat_Desc', 'PK_Categories'下一步是向此全文索引添加列。您可以

36、為每一列選擇一種語(yǔ)言,如果該列的類型為 IMAGE,則必須再指定一列,以指示 IMAGE 列的每一行中存儲(chǔ)的文檔類型。在列語(yǔ)言選擇方面,有一些重要但尚未成文的注意事項(xiàng)。這些注意事項(xiàng)與文本的標(biāo)記方式以及 MSSearch 對(duì)文本的索引方式有關(guān)。被索引的文本是通過(guò)一個(gè)稱作單詞分隔符(用作單詞邊界標(biāo)記)的組件提供的。在英文中,單詞分隔符通常是空格或某種形式的標(biāo)點(diǎn)符號(hào);而在其他語(yǔ)言中(例如德語(yǔ)),單詞或字符可以組合在一起;因此,所選的列語(yǔ)言應(yīng)表示要存儲(chǔ)在該列的行中的語(yǔ)言。如果不確定,最好的方法通常是使用中性單詞分隔符(只使用空格和標(biāo)點(diǎn)符號(hào)執(zhí)行標(biāo)記功能)。選擇列語(yǔ)言的另一個(gè)好處是“尋根溯源”。全文查詢中

37、的尋根溯源是指在特定語(yǔ)言中搜索某一單詞的所有變化形式的過(guò)程。選擇語(yǔ)言的另一個(gè)考慮因素與數(shù)據(jù)的表示方法有關(guān)。對(duì)于非 IMAGE 列數(shù)據(jù)來(lái)說(shuō),不需要執(zhí)行特殊的過(guò)濾操作;而文本通常需要將單詞分隔組件按原樣傳遞。單詞分隔符主要用于處理書面文本。因此,如果文本中有任何類型的標(biāo)記(例如 HTML),則在索引和搜索過(guò)程中,語(yǔ)言精確性將不會(huì)很高。這種情況下,您有兩種選擇 - 首選方法是只將文本數(shù)據(jù)存儲(chǔ)在 IMAGE 列中,并指明其文檔類型,以便對(duì)其進(jìn)行過(guò)濾。如果不選擇此方法,則可以考慮使用中性單詞分隔符,并且可能的話,在干擾詞列表中添加標(biāo)記數(shù)據(jù)(例如 HTML 中的“br”)。在指定了中性語(yǔ)言的列中不能進(jìn)行任

38、何基于語(yǔ)言的尋根溯源,但有些環(huán)境可能會(huì)要求您選擇此方法。在知道列選項(xiàng)后,通過(guò)發(fā)出以下語(yǔ)句在全文索引中添加一列或兩列:exec sp_fulltext_column 'Categories', 'Description', 'add'您可能注意到,此處未指定任何語(yǔ)言 - 這種情況下,將使用默認(rèn)的全文語(yǔ)言??梢酝ㄟ^(guò)系統(tǒng)存儲(chǔ)過(guò)程“sp_configure”為服務(wù)器設(shè)置默認(rèn)全文語(yǔ)言。將所有列添加到全文索引后,即可執(zhí)行填充操作。填充方法之多實(shí)在是不勝枚舉,此處不作詳細(xì)介紹。在本例中,只需對(duì)表啟動(dòng)完全填充,并等待它執(zhí)行完畢:exec sp_fulltext_

39、table 'Categories', 'start_full'您可能希望使用 FULLTEXTCATALOGPROPERTY 或 OBJECTPROPERTY 函數(shù)來(lái)監(jiān)視填充狀態(tài)。要獲取目錄填充狀態(tài),可以執(zhí)行:select FULLTEXTCATALOGPROPERTY('Cat_Desc', 'Populatestatus')通常情況下,如果完全填充正在進(jìn)行,則返回的結(jié)果是“1”。有關(guān)如何使用 FULLTEXTCATALOGPROPERTY 和 OBJECTPROPERTY 的詳細(xì)信息,請(qǐng)參閱 SQL Server Books

40、 Online。全文查詢查詢?nèi)乃饕c執(zhí)行 SQL Server 中的標(biāo)準(zhǔn)關(guān)系型查詢略有不同。由于索引是在 SQL Server 外部進(jìn)行存儲(chǔ)和管理的,因此全文查詢處理大部分由 MSSearch 完成(因此,那些一部分是關(guān)系型、一部分基于全文的查詢將被單獨(dú)處理),這樣做有時(shí)會(huì)損害性能。從本質(zhì)上說(shuō),執(zhí)行全文查詢時(shí),查詢?cè)~傳遞給 MSSearch,后者遍歷其內(nèi)部數(shù)據(jù)結(jié)構(gòu)(索引),并向 SQL Server 返回主鍵和排位值。如果執(zhí)行 CONTAINS 或 FREETEXT 查詢,則通??床坏街麈I或排位值,但如果執(zhí)行 CONTAINSTABLE 或 FREETEXTTABLE 查詢,則將獲得這些值,

41、然后這些值通常會(huì)與基表合并在一起。與基表合并主鍵的進(jìn)程需要很高的系統(tǒng)開(kāi)銷 - 稍后,我們將向您介紹一些巧妙的方法以盡量減少或完全避免這種合并。如果您通過(guò)不斷思考,對(duì)全文查詢?nèi)绾畏祷財(cái)?shù)據(jù)有了一個(gè)初步了解,就可以推測(cè)出 CONTAINS/FREETEXT 查詢僅執(zhí)行 CONTAINSTABLE/FREETEXTTABLE 查詢并與基表進(jìn)行合并。有了這樣的了解,您應(yīng)該避免使用這些類型的查詢,除非不這樣做的開(kāi)銷更高。在 Web 搜索應(yīng)用程序中,使用 CONTAINSTABLE 與 FREETEXTTABLE 比使用不帶 TABLE 的同類函數(shù)好得多。到現(xiàn)在為止,您已經(jīng)知道全文查詢是用來(lái)從 SQL Se

42、rver 之外存儲(chǔ)的 MSSearch 索引中訪問(wèn)數(shù)據(jù)的特殊方法,還知道如果盲目地與基表進(jìn)行合并,就會(huì)遇到麻煩。應(yīng)該了解的另外一個(gè)重要內(nèi)容是 CONTAINS 樣式查詢與 FREETEXT 樣式查詢之間的本質(zhì)差別。CONTAINS 查詢用于對(duì)所查詢的所有詞語(yǔ)執(zhí)行完全匹配查詢。無(wú)論您只查找單個(gè)單詞,還是查找以“orange”開(kāi)頭的所有單詞,系統(tǒng)只返回包含所有搜索詞的結(jié)果。因此,CONTAINS 查詢速度很快,因?yàn)樗鼈兺ǔ7祷睾苌俚慕Y(jié)果,并且不需要執(zhí)行過(guò)多的附加處理。CONTAINS 查詢的缺點(diǎn)包括令人生厭的干擾詞過(guò)濾問(wèn)題。經(jīng)驗(yàn)豐富的開(kāi)發(fā)人員以及過(guò)去使用過(guò)全文搜索的數(shù)據(jù)庫(kù)管理員,在試圖匹配只包含單

43、個(gè)干擾詞的單詞或詞組時(shí),曾遇到過(guò)“您的查詢只包含干擾詞”這樣令人吃驚的錯(cuò)誤。要避免收到此錯(cuò)誤,方法之一是在執(zhí)行全文查詢之前過(guò)濾出干擾詞。向包含干擾詞的 CONTAINS 查詢返回結(jié)果是不可能的,因?yàn)榇祟惒樵冎环祷嘏c整個(gè)查詢字符串完全匹配的結(jié)果。由于干擾詞不是全文索引項(xiàng),因此包含干擾詞的 CONTAINS 查詢不會(huì)返回任何行。FREETEXT 查詢消除了 CONTAINS 查詢中偶爾出現(xiàn)的所有警告說(shuō)明。當(dāng)發(fā)出 FREETEXT 查詢時(shí),實(shí)際上發(fā)出的是詞根查詢。因此,當(dāng)您搜索“root beer”時(shí),“root”和“beer”包含其所有形式(尋根溯源與語(yǔ)言相關(guān);所用的語(yǔ)言由生成索引時(shí)指定的全文列語(yǔ)

44、言確定,并且在所有查詢的列中必須相同),并且系統(tǒng)將返回至少與這些詞語(yǔ)之一匹配的所有行。FREETEXT 查詢的負(fù)面影響是它們通常比 CONTAINS 查詢耗用更多的 CPU - 因?yàn)橐獙じ菰匆约胺祷馗嗟慕Y(jié)果,就需要包含更復(fù)雜的排位計(jì)算。不過(guò),基于 FREETEXT 的查詢非常靈活,而且速度非???,是基于 Web 的搜索應(yīng)用程序中通常使用的最佳選擇。排位和優(yōu)化我經(jīng)常遇到使用全文搜索的用戶,他們問(wèn)我排位編號(hào)是什么意思,以及如何將排位編號(hào)轉(zhuǎn)換成某種用戶可以理解的值。對(duì)這個(gè)問(wèn)題,回答可長(zhǎng)可短,在這里我將進(jìn)行簡(jiǎn)要回答。簡(jiǎn)單而言,這些排位編號(hào)不如結(jié)果返回的順序那樣重要。也就是說(shuō),當(dāng)您按照排位對(duì)結(jié)果進(jìn)行

45、排序時(shí),總是首先返回關(guān)聯(lián)程度最高的結(jié)果。排位值本身常常變化 - 全文搜索使用概率排位算法,即返回的每個(gè)文檔的關(guān)聯(lián)性受全文索引中的任何或所有其他文檔的直接影響。有些人認(rèn)為,一種有助于增加某些行排位的技巧是在這些行的全文索引列中重復(fù)常用的搜索關(guān)鍵字。盡管在某種程度上,這種方法可能會(huì)提高這些行因某些關(guān)鍵字而首先返回的幾率,但在其他情況下,可能會(huì)適得其反 - 而且還存在使詞語(yǔ)查詢性能降低的風(fēng)險(xiǎn)。較好的解決方案是為搜索應(yīng)用程序?qū)崿F(xiàn)“最佳選擇”系統(tǒng)(請(qǐng)參閱以下示例),這樣就可以確保首先返回某些文檔。多次重復(fù)使用關(guān)鍵字會(huì)使這些特定關(guān)鍵字的全文索引擴(kuò)大,并使得 MSSearch 在查找正確行和計(jì)算排位時(shí)浪費(fèi)時(shí)

46、間。如果全文索引數(shù)據(jù)量很大,并嘗試使用了此方法,您可能會(huì)發(fā)現(xiàn)某些全文查詢很耗時(shí)。如果能夠?qū)崿F(xiàn)更細(xì)致(也可能更精確)的“最佳選擇”系統(tǒng),您會(huì)發(fā)現(xiàn)它明顯改善了查詢性能。多次重復(fù)數(shù)據(jù)的另一個(gè)問(wèn)題與用于組合關(guān)系型查詢和全文查詢的常用技巧有關(guān)。許多使用全文搜索的用戶都深受此問(wèn)題的困擾,每當(dāng)他們?cè)噲D將某種過(guò)濾器應(yīng)用于全文查詢返回的結(jié)果時(shí),便會(huì)遇到這樣的問(wèn)題。正如前面所說(shuō)的,全文查詢?yōu)槊總€(gè)匹配行返回一個(gè)主鍵和一個(gè)排位 - 要收集有關(guān)這些行的任何詳細(xì)信息,必須與它的基表進(jìn)行合并。由于從無(wú)限制的全文查詢中可能會(huì)返回任意數(shù)量的結(jié)果,因此合并可能需要大量系統(tǒng)開(kāi)銷。人們發(fā)現(xiàn)避免合并的一個(gè)有效方法是只在全文索引中添加要

47、過(guò)濾的數(shù)據(jù)(如果可能)。換句話說(shuō),如果用戶要從報(bào)紙上所有文章的正文中搜索關(guān)鍵字“Ichiro”,并且只希望返回該報(bào)上體育專欄中的文章,則查詢語(yǔ)句通常如下所示:- 方法 1:- 開(kāi)銷最高:先全部選擇,然后再合并和過(guò)濾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:- 可以使用,但會(huì)導(dǎo)致意外結(jié)果并變慢,或者會(huì)返回不準(zhǔn)確的結(jié)果: - 執(zhí)行全文過(guò)濾,并且只提取主鍵和排位- (處理在 Web 服務(wù)器上完成)SELECT key, rank FROM CONTAINSTABLE(Articles, *, 'FORMSOF(INFLECTIONAL('Ichiro') AND "sports"')這兩個(gè)查詢要么不必要地占用大量系統(tǒng)開(kāi)銷,要么存在返回錯(cuò)誤結(jié)果的可能

49、性(在第二個(gè)查詢中,“sports”很可能出現(xiàn)在所有類型的文章中)。這兩項(xiàng)技術(shù)還存在其他變體,但這是兩種非常簡(jiǎn)單的模型。如果可行,我通常建議您對(duì)數(shù)據(jù)進(jìn)行水平劃分。即,“類別”列的每個(gè)可能值都自成一列(或表),并且與該文章相關(guān)的可搜索關(guān)鍵字僅存儲(chǔ)在此列中。采用此方法,而不是使用一個(gè)“正文”列和一個(gè)“類別”列,可以去掉“類別”列,而使用存儲(chǔ)可搜索關(guān)鍵字的“Body_<category>”列。如以下示例所示:- 如果您可以調(diào)整架構(gòu),這非常有效 每個(gè)類別- 都成為自己的列(或表格),并且需要命中的- 全文索引也較少。這明顯需要作一些解釋SELECT key, rank FROM FREET

50、EXTTABLE(Articles, Body_Sports, 'Ichiro')對(duì)于包含大量數(shù)據(jù),且這些數(shù)據(jù)可適應(yīng)此架構(gòu)(或許是主架構(gòu))更改的系統(tǒng),其性能會(huì)得到顯著的提高。但在何時(shí)應(yīng)用多個(gè)過(guò)濾器或不應(yīng)用過(guò)濾器方面卻有著明顯的限制。當(dāng)然,還有其他的方法可以解決這些問(wèn)題。通過(guò)以上示例,您會(huì)了解一種將某些搜索條件抽象到架構(gòu)的方法 - 實(shí)際上是“欺騙”優(yōu)化程序(更確切的說(shuō)是“成為”優(yōu)化程序),因?yàn)樵?SQL Server 本身的全文查詢中當(dāng)前不存在本地優(yōu)化。其他性能技巧人們?cè)诹奶鞎r(shí)常常問(wèn)我的另一個(gè)問(wèn)題是如何才能分頁(yè)顯示全文查詢結(jié)果。換句話說(shuō),如果我要發(fā)出“root beer”查詢,一

51、次在某一 Web 頁(yè)上顯示 40 個(gè)結(jié)果,并且只希望返回該頁(yè)面上的 40 個(gè)結(jié)果(例如,如果我在第三頁(yè),我希望僅返回第 81 至第 120 條結(jié)果)。對(duì)于分頁(yè)顯示結(jié)果,我曾見(jiàn)過(guò)多種方法,但沒(méi)有一種方法能夠做到百分之百有效。我所推薦的方法可以最大程度地減少全文查詢執(zhí)行的次數(shù)(實(shí)際上,對(duì)于要分頁(yè)顯示的每個(gè)結(jié)果集只需執(zhí)行一次),并將 Web 服務(wù)器用作一個(gè)簡(jiǎn)單的緩存。從更高的層面來(lái)講,您只需在全文查詢中檢索一個(gè)完整的主鍵和排位值行集合(如果需要,可以在架構(gòu)中使用最佳選擇并提取常用過(guò)濾器),并將其存儲(chǔ)在 Web 服務(wù)器的內(nèi)存中(這取決于您的應(yīng)用程序和負(fù)載,想象將 <32 字節(jié)的典型主鍵大小與 &

52、lt;4 字節(jié)的排位大小相加 等于 <36 字節(jié),然后乘以通常返回的結(jié)果集 <1000 行,最后等于 <35K。假定一個(gè)在任何給定時(shí)間返回 <1000 個(gè)活動(dòng)查詢結(jié)果集中的一個(gè)活動(dòng)緩存集,您將發(fā)現(xiàn)此活動(dòng)緩存集在 Web 服務(wù)器上占用的內(nèi)存少于 35MB - 這還可以接受)。為了分頁(yè)顯示結(jié)果,該進(jìn)程只遍歷 Web 服務(wù)器的內(nèi)存中存儲(chǔ)的數(shù)組,并對(duì) SQL Server 發(fā)出 SELECT 以便只顯示需要顯示的行和列。這又回到了全文查詢僅返回主鍵和排位的概念中 - SELECT(甚至許多這樣的查詢語(yǔ)句)比全文查詢的速度快許多倍。使用 SELECT 而不是與基表合并多個(gè)行,并結(jié)

53、合多個(gè)其他策略,您可以保留 SQL Server 計(jì)算機(jī)上更多的 CPU 周期,并且更有效、更劃算地利用 Web 領(lǐng)域。另一種可以替代 Web 服務(wù)器端緩存的方法是在 SQL Server 自身中緩存結(jié)果集,并定義多種用于瀏覽這些結(jié)果的方法。雖然本文著重說(shuō)明 Web 服務(wù)器 (ASP) 級(jí)別的應(yīng)用程序設(shè)計(jì),但 SQL Server 的可編程功能還為生成高性能的 Web 搜索應(yīng)用程序提供了強(qiáng)大的框架。小結(jié)Microsoft SQL Server 2000 的全文搜索功能為索引和查詢數(shù)據(jù)庫(kù)中存儲(chǔ)的非結(jié)構(gòu)化文本數(shù)據(jù)提供了可靠、快速而靈活的方法。如果要廣泛地將這種快速、準(zhǔn)確的搜索功能應(yīng)用于各種應(yīng)用程序

54、,那么很有必要充分利用其速度和精確性,來(lái)實(shí)現(xiàn)全文搜索解決方案。通過(guò)分布計(jì)算負(fù)載并通過(guò)某些巧妙的方式對(duì)數(shù)據(jù)進(jìn)行組織,可以省下錢來(lái)購(gòu)買其他硬件和軟件,以擺脫因不必要的緩慢查詢帶來(lái)的困擾。在開(kāi)發(fā)優(yōu)秀的搜索應(yīng)用程序時(shí),通常要考慮到許多因素和注意事項(xiàng),希望本文提供的信息和示例對(duì)您學(xué)習(xí)使用 SQL Server 2000 生成出色的 Web 搜索應(yīng)用程序會(huì)有所幫助。附錄 A:實(shí)現(xiàn)全文搜索功能的最佳選擇改進(jìn)全文查詢性能和有效性的一種可行方法是實(shí)現(xiàn)“最佳選擇”系統(tǒng)。此系統(tǒng)是一種很簡(jiǎn)單的方法,可確保某些與特定查詢表達(dá)式匹配的行先于其他行返回。最佳選擇沒(méi)有復(fù)雜的預(yù)編程邏輯(例如,SharePoint Portal

55、 Server 就包含這樣的邏輯),因此,通常是首選辦法。在本示例中挑選出最佳選擇,并將唯一的主鍵和一些關(guān)鍵字存儲(chǔ)在單獨(dú)的表中。FREETEXTTABLE 查詢對(duì)(非常小的)最佳選擇表執(zhí)行,并且從該查詢中返回的任何結(jié)果都與對(duì)基表的 FREETEXTTABLE 查詢結(jié)果一同返回。在給定這些搜索條件下,最先返回的將是所有“最佳選擇”行,隨后是被 MSSearch 視為關(guān)聯(lián)程度最高的行(以遞減順序返回)。下面是一個(gè)非常簡(jiǎ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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論