如果要通過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共支援50種檔案屬性,而可以用來作為查詢條件或返回結果的熱門檔案屬性:
屬性名稱 資料類型 注釋 可否用於ORDER BY子句 可否用於SELECT語句中
Access datetime 檔案的最後訪問時間。 可 可
Characterization nvarchar或ntext 文檔的描述或摘要,由Index Server使用。 否 可
Create datetime 檔案的建立時間。 可 可
Directory Nvarchar 檔案的實體路徑,不包含檔案名稱。 可 可
DocAppName nvarchar 建立檔案的應用程式的名稱。如Microsoft Word 9.0。 可 可
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(19,0) 檔案的唯一標識。 可 可
FileName nvarchar 檔案名稱。 可 可
HitCount integer 檔案中的叫用次數(單詞匹配查詢)。即檔案中有多少個查詢條件中的單詞。 可 可
Path nvarchar 檔案的實體路徑,包含檔案名稱。 可 可
Rank integer 行的等級,範圍從 0 到 1000,數字越大表示越匹配。 可 可
ShortFileName nvarchar 短檔案名稱(8.3格式)。 可 可
Size Decimal(19,0) 檔案大小,單位是位元組。 可 可
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 BY、COMPUTE和COMPUTE BY等子句;不能包含INTO關鍵字;不能涉及暫存資料表。
而column則用於為視圖中的各個欄位命名。一般只有在這些欄位是運算式或函數及常數時才需要為其命名。
在SQL Server中,也同樣可以使用CREATE VIEW語句來建立視圖。
下面我們通過一個例子來瞭解對Index Server查詢的全部過程。
我們將在虛擬目錄Corpus和C: emp目錄中尋找那些作者在writer表中存在記錄且文檔字數超過5000字的檔案。並返回作者的名字、文檔題目以及作者的身份。其查詢語句和具體操作過程如所示。
Index Server查詢過程
其中各個步驟的解釋如下:
1:查詢被提交到SQL Server,將分散式查詢部分(包含在OPENQUERY函數之內的部分)傳遞給SQL Server分散式查詢處理器。
2:分散式查詢處理器將查詢進一步傳遞給OLE DB Provider for Indexing Service(MSIDXS),由MSIDX串連到檔案系統。
3:MSIDXS分析查詢語句並向檔案索引服務發出相應的命令。
4:檔案索引服務從一個結合了Web虛擬目錄/Corpus和C:Temp目錄的虛擬表中尋找那些合格檔案並將其作為一個行集返回給MSIDX。
5:MSIDXS將行集返回給分散式查詢處理器。
6:分散式查詢處理器將返回的行集作為一個表同writers表進行結合查詢,並將最終結果返回給查詢提交者。
在對Index Server的查詢中,還不能使用QUANTIFIED、COMPARISON、BETWEEN、EXISTS、IN以及NULL等謂詞。因為這些都不被Index Server所支援。但是它支援兩個SQL Server所不直接支援的兩個謂詞:MATCHES和ARRAY。我們可以在對Index Server的查詢語句中使用它們。其含義和文法結構分別如下:
MATCHES:用於模式比對,其作用同Like相近但是功能更為強大。它的文法結構如下:MATCHES (Column_Reference, ' { Grouped_Search_Pattern Counted_Search_Pattern } ') > 0
其中Column_Reference為指定的檔案屬性,其資料類型必須同後面的Grouped_Search_Pattern相匹配。
Grouped_Search_Pattern為指定的匹配模式。而Counted_Search_Pattern則用於對匹配的數量進行限定,可以有三種限定方式:
嚴格匹配:在查詢的檔案屬性中包含指定數目的滿足匹配條件的字串。
至少匹配:在查詢的檔案屬性中包含大於或等於指定數目的滿足匹配條件的字串。
範圍匹配:在查詢的檔案屬性中包含滿足匹配條件的字串數目界於n~m之間。
MATCHES可以使用的模式比對符及其含義見下表:
符號 描述
* 包含指定的匹配字串同時還包含其他0個或更多的字元。這同dir命令中使用的*十分類似。如以b開頭,以d結尾的字串的匹配條件為b*d。
? 包含指定的匹配字串同時還包含其他0個或一個字元。如滿足b?d匹配條件的字串包括bd、bad和bed等。
+ 包含指定的匹配字串同時還包含其他1個或更多的字元。如滿足b+d匹配條件的字串包括bad、bed和bond等。
( ) 用於界定模式比對,表明在其中的是模式比對字元條件。當條件多於一個時使用。
{ } 用於界定匹配數量,表明在其中的是模式比對數量條件。
[ ] 用來在模式條件中指明一個字串的範圍。
一個轉義符,要求在上面的每個符號前使用它。從而將其同一般字元區別開來。
下面通過幾個簡單的例子來說明MATCHES謂詞的使用方法。
尋找檔案內容中出現"SQL"三次的檔案:
WHERE MATCHES (DocText, '(SQL){3}' ) > 0
尋找檔案內容中出現"SQL"三次以上的檔案:
WHERE MATCHES (DocText, '(SQL){3,}' ) > 0
尋找檔案內容中出現"SQL"三次到十次之間的檔案:
WHERE MATCHES (DocText, '(Bora){3,10}' ) > 0
當你不能確定作者姓名中包含"Pellow"還是"Pelow"時,可以使用下面的條件陳述式:
WHERE MATCHES( DocAuthor, '* Pel{1,2}ow' ) > 0
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,運算式結果為假:
[1,2,3] > ALL ARRAY [1,2]
而對於SOME,則只要在左側排列中有一個值同右側排列中所有的值比較複合條件即可。因此下面的運算式對於SOME,其運算式結果為真:
[1,2,3] > SOME ARRAY [2,1]
因為在左側排列中的3,比右側排列中的2和1都大因此傳回值為真。
如果不指