熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL Server >> 正文

SQL Server同Index Server的結合應用3/3

2013-11-15 14:35:35  來源: SQL Server 

  
  通過SQL Server查詢Index Server
  如果要通過SQL Server查詢Index Server須使用OPENQUERY函數其語法結構如下
  OPENQUERY(linked_server query)
  其中linked_server參數為連接的名稱而query參數為要進行的查詢它將以一個字符串的形式傳送給OPENQUERY函數此函數返回的將是一個虛擬表從而可以讓我們對其做進一步的查詢
  
  下面的語句查找內容包含中SQL這個單詞的所有文件
  SELECT *
  FROM OpenQuery(FileSystem
  SELECT Directory FileName DocAuthor Size Create
  FROM SCOPE()
  WHERE CONTAINS( Contents SQL ) )
  對於Index Server的查詢其FROM語句的語法格式於普通的SQL語句是有所區別的其語法結構如下
  FROM [ Catalog_Name ] { SCOPE( [ Scope_Arguments ] ) }
  其中的Catalog_Name參數用於指明要進行查詢的索引目錄由於我們在定義連接時只能選擇一個索引目錄所以此參數在此將被省略而SCOPE函數用於指明要進行查詢的文件所在的目錄SCOPE函數的語法結構如下圖所示
  
  其中DEEP TRAVERSAL OF關鍵字指明將查詢目錄中所有的文件包括其子目錄中的所有文件而SHALLOW TRAVERSAL OF關鍵字則指明只查詢頂級目錄中的文件而不包括子目錄中的那些文件如果不指明查詢的目錄深度則默認為DEEP TRAVERSAL OF
  physical_path和virtual_directory分別為物理目錄和虛擬目錄其中各自的含義在圖中已經標示的非常明白了在此就不再進一步說明了
  Index Server共支持種文件屬性而可以用來作為查詢條件或返回結果的常用文件屬性:
  
  屬性名稱 數據類型 注釋 可否用於ORDER BY子句 可否用於SELECT語句中
  Access datetime 文件的最後訪問時間 可 可
  Characterization nvarchar或ntext 文檔的描述或摘要由Index Server使用 否 可
  Create datetime 文件的創建時間 可 可
  Directory Nvarchar 文件的物理路徑不包含文件名 可 可
  DocAppName nvarchar 創建文件的應用程序的名稱如Microsoft Word 可 可
  DocAuthor nvarchar 文檔的作者 可 可
  DocComments nvarchar 關於文檔的注釋 可 可
  DocCompany nvarchar 寫作文檔的公司的名稱 可 可
  DocLastAuthor nvarchar 最近編輯文檔的用戶 可 可
  DocLastPrinted datetime 文檔的最近一次打印時間 可 否
  DocPageCount integer 文檔的頁數 可 否
  DocParaCount integer 文檔的圖形數量 可 否
  DocRevNumber integer 文檔的當前版本 可 可
  DocSubject nvarchar 文檔的主題 可 可
  DocTemplate nvarchar 文檔的模板 可 可
  DocTitle nvarchar 文檔的標題 可 可
  DocWordCount integer 文檔的字數 可 否
  FileIndex Decimal() 文件的唯一標識 可 可
  FileName nvarchar 文件名 可 可
  HitCount integer 文件中的命中次數(單詞匹配查詢)即文件中有多少個查詢條件中的單詞 可 可
  Path nvarchar 文件的物理路徑包含文件名 可 可
  Rank integer 行的等級范圍從 數字越大表示越匹配 可 可
  ShortFileName nvarchar 短文件名(格式) 可 可
  Size Decimal() 文件大小單位是字節 可 可
  VPath nvarchar 指向文件的完整虛擬路徑包括文件名如果有多個可能的路徑將選擇最符合查詢的一個 可 可
  Write datetime 最近一次寫文件的時間 可 可
  
  可以在Where子句中使用以上各種屬性作為查詢的條件當條件中包含全文檢索條件時需要使用CONTAINS和FREETEXT語句其用法同SQL Server的全文檢索相同要注意的是在對Index Server的查詢中不能使用GROUP BY和HAVING子句因為這不被Index Server所支持
  此外在查詢的SELECT子句中不能使用*來選擇所有的屬性*只有在對視圖進行查詢時才可以使用視圖實際上可以理解為從一個查詢導出的虛擬表通過對視圖的查詢可以實現對查詢結果的再次查詢視圖一般應用於需要經常被其他查詢作為FROM子句中的數據源時使用建立視圖使用CREATE VIEW語句其語法結構如下
  CREATE VIEW view_name [(column ][n])]
  AS
  
  select_statement
  其中view_name為要建立的視圖的名稱而AS子句後面的就是建立視圖的查詢語句而此語句有以下限制不能包含ORDER BYCOMPUTE和COMPUTE BY等子句不能包含INTO關鍵字不能涉及臨時表
  而column則用於為視圖中的各個字段命名一般只有在這些字段是表達式或函數及常數時才需要為其命名
  在SQL Server中也同樣可以使用CREATE VIEW語句來建立視圖
  下面我們通過一個例子來了解對Index Server查詢的全部過程
  我們將在虛擬目錄\Corpus和C:\temp目錄中查找那些作者在writer表中存在記錄且文檔字數超過字的文件並返回作者的名字文檔題目以及作者的身份其查詢語句和具體操作過程如下圖所示
  
  Index Server查詢過程
  其中各個步驟的解釋如下
  查詢被提交到SQL Server將分布式查詢部分(包含在OPENQUERY函數之內的部分)傳遞給SQL Server分布式查詢處理器
  分布式查詢處理器將查詢進一步傳遞給OLE DB Provider for Indexing Service(MSIDXS)由MSIDX連接到文件系統
  MSIDXS分析查詢語句並向文件索引服務發出相應的命令
  文件索引服務從一個結合了Web虛擬目錄/Corpus和C:\Temp目錄的虛擬表中查找那些符合條件的文件並將其作為一個行集返回給MSIDX
  MSIDXS將行集返回給分布式查詢處理器
  分布式查詢處理器將返回的行集作為一個表同writers表進行結合查詢並將最終結果返回給查詢提交者
  
  在對Index Server的查詢中還不能使用QUANTIFIEDCOMPARISONBETWEENEXISTSIN以及NULL等謂詞因為這些都不被Index Server所支持但是它支持兩個SQL Server所不直接支持的兩個謂詞MATCHES和ARRAY我們可以在對Index Server的查詢語句中使用它們其含義和語法結構分別如下
  MATCHES用於模式匹配其作用同Like相近但是功能更為強大它的語法結構如下MATCHES (Column_Reference { Grouped_Search_Pattern | Counted_Search_Pattern } ) >
  其中Column_Reference為指定的文件屬性其數據類型必須同後面的Grouped_Search_Pattern相匹配
  Grouped_Search_Pattern為指定的匹配模式而Counted_Search_Pattern則用於對匹配的數量進行限定可以有三種限定方式
  嚴格匹配在查詢的文件屬性中包含指定數目的滿足匹配條件的字串
  至少匹配在查詢的文件屬性中包含大於或等於指定數目的滿足匹配條件的字串
  范圍匹配在查詢的文件屬性中包含滿足匹配條件的字串數目界於n~m之間
  MATCHES可以使用的模式匹配符及其含義見下表
  
  符號 描述
  * 包含指定的匹配字符串同時還包含其他個或更多的字符這同dir命令中使用的*十分類似如以b開頭以d結尾的字符串的匹配條件為b|*d
  ? 包含指定的匹配字符串同時還包含其他個或一個字符如滿足b|?d匹配條件的字串包括bdbad和bed等
  + 包含指定的匹配字符串同時還包含其他個或更多的字符如滿足b|+d匹配條件的字串包括badbed和bond等
  ( ) 用於界定模式匹配表明在其中的是模式匹配字符條件當條件多於一個時使用
  { } 用於界定匹配數量表明在其中的是模式匹配數量條件
  [ ] 用來在模式條件中指明一個字符串的范圍
  | 一個轉義符要求在上面的每個符號前使用它從而將其同普通字符區別開來
  下面通過幾個簡單的例子來說明MATCHES謂詞的使用方法
  查找文件內容中出現SQL三次的文件
  WHERE MATCHES (DocText |(SQL|)|{|} ) >
  查找文件內容中出現SQL三次以上的文件
  WHERE MATCHES (DocText |(SQL|)|{|} ) >
  查找文件內容中出現SQL三次到十次之間的文件
  WHERE MATCHES (DocText |(Bora|)|{|} ) >
  當你不能確定作者姓名中包含Pellow還是Pelow可以使用下面的條件語句
  WHERE MATCHES( DocAuthor * Pel|{|}ow ) >
  ARRAY用於在兩個排列(也稱為矢量)之間通過邏輯運算符來進行比較其語法結構如下
  
  Column_Reference Comparison_Operator [ ALL | SOME ] ARRAY [ Array_Elements ]
  其中Column_Reference用於比較的文件屬性可以是多個屬性但是要求其數據類型同後面的Array_Elements相匹配
  Comparison_Operator為比較運算符它可以是=!=(不等於)>=><<=
  Array_Elements用於指明用於進行比較的排列其必須用[]括起來空的排列也是允許的比如下面的查詢也是合法的
  SELECT foo FROM SCOPE() WHERE bar = ARRAY[]
  ALL和SOME則用來指明對Array_Elements使用不同的比較方式對於All將會對左側排列中的每個元素同右側排列中相應的元素進行比較比如下面的表達式對於ALL表達式結果為假
  [] > ALL ARRAY []
  而對於SOME則只要在左側排列中有一個值同右側排列中所有的值比較復合條件即可因此下面的表達式對於SOME其表達式結果為真
  [] > SOME ARRAY []
  因為在左側排列中的比右側排列中的都大因此返回值為真
  如果不指
From:http://tw.wingwit.com/Article/program/SQLServer/201311/22036.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.