直播中
6.11.2. 通過(guò)SQL Server查詢(xún)Index Server
如果要通過(guò)SQL Server查詢(xún)Index Server,須使用OPENQUERY函數(shù)。其語(yǔ)法結(jié)構(gòu)如下。
OPENQUERY(linked_server, 'query')
其中l(wèi)inked_server參數(shù)為連接的名稱(chēng)。而query參數(shù)為要進(jìn)行的查詢(xún),它將以一個(gè)字符串的形式傳送給OPENQUERY函數(shù)。此函數(shù)返回的將是一個(gè)虛擬表,從而可以讓我們對(duì)其做進(jìn)一步的查詢(xún)。
下面的語(yǔ)句查找內(nèi)容包含中SQL這個(gè)單詞的所有文件:
SELECT *
FROM OpenQuery(FileSystem,
'SELECT Directory, FileName, DocAuthor, Size, Create
FROM SCOPE()
WHERE CONTAINS( Contents, ''SQL'' ) ' )
對(duì)于Index Server的查詢(xún),其FROM語(yǔ)句的語(yǔ)法格式于普通的SQL語(yǔ)句是有所區(qū)別的。其語(yǔ)法結(jié)構(gòu)如下:
FROM [ Catalog_Name.. ] { SCOPE( [ 'Scope_Arguments' ] ) }
其中的Catalog_Name參數(shù)用于指明要進(jìn)行查詢(xún)的索引目錄。由于我們?cè)诙x連接時(shí)只能選擇一個(gè)索引目錄,所以此參數(shù)在此將被省略。而SCOPE函數(shù)用于指明要進(jìn)行查詢(xún)的文件所在的目錄。SCOPE函數(shù)的語(yǔ)法結(jié)構(gòu)如下圖所示。
圖6.11.2-1SCOPE函數(shù)語(yǔ)法結(jié)構(gòu)圖
其中DEEP TRAVERSAL OF關(guān)鍵字指明將查詢(xún)目錄中所有的文件,包括其子目錄中的所有文件。而SHALLOW TRAVERSAL OF關(guān)鍵字則指明只查詢(xún)頂級(jí)目錄中的文件,而不包括子目錄中的那些文件。如果不指明查詢(xún)的目錄深度,則默認(rèn)為DEEP TRAVERSAL OF。
physical_path和virtual_directory分別為物理目錄和虛擬目錄。其中各自的含義在圖中已經(jīng)標(biāo)示的非常明白了,在此就不再進(jìn)一步說(shuō)明了。
Index Server共支持50種文件屬性,而可以用來(lái)作為查詢(xún)條件或返回結(jié)果的常用文件屬性見(jiàn)下表:
屬性名稱(chēng) 數(shù)據(jù)類(lèi)型 注釋 可否用于ORDER BY子句 可否用于SELECT語(yǔ)句中
Access datetime 文件的最后訪問(wèn)時(shí)間。 可 可
Characterization nvarchar或ntext 文檔的描述或摘要,由Index Server使用。 否 可
Create datetime 文件的創(chuàng)建時(shí)間。 可 可
Directory Nvarchar 文件的物理路徑,不包含文件名。 可 可
DocAppName nvarchar 創(chuàng)建文件的應(yīng)用程序的名稱(chēng)。如Microsoft Word 9.0。 可 可
DocAuthor nvarchar 文檔的作者。 可 可
DocComments nvarchar 關(guān)于文檔的注釋。 可 可
DocCompany nvarchar 寫(xiě)作文檔的公司的名稱(chēng)。 可 可
DocLastAuthor nvarchar 最近編輯文檔的用戶(hù)。 可 可
DocLastPrinted datetime 文檔的最近一次打印時(shí)間。 可 否
DocPageCount integer 文檔的頁(yè)數(shù)。 可 否
DocParaCount integer 文檔的圖形數(shù)量。 可 否
DocRevNumber integer 文檔的當(dāng)前版本。 可 可
DocSubject nvarchar 文檔的主題。 可 可
DocTemplate nvarchar 文檔的模板。 可 可
DocTitle nvarchar 文檔的標(biāo)題。 可 可
DocWordCount integer 文檔的字?jǐn)?shù)。 可 否
FileIndex Decimal(19,0) 文件的唯一標(biāo)識(shí)。 可 可
FileName nvarchar 文件名。 可 可
HitCount integer 文件中的命中次數(shù)(單詞匹配查詢(xún))。即文件中有多少個(gè)查詢(xún)條件中的單詞。 可 可
Path nvarchar 文件的物理路徑,包含文件名。 可 可
Rank integer 行的等級(jí),范圍從 0 到 1000,數(shù)字越大表示越匹配。 可 可
ShortFileName nvarchar 短文件名(8.3格式)。 可 可
Size Decimal(19,0) 文件大小,單位是字節(jié)。 可 可
VPath nvarchar 指向文件的完整虛擬路徑,包括文件名。如果有多個(gè)可能的路徑,將選擇最符合查詢(xún)的一個(gè)。 可 可
Write datetime 最近一次寫(xiě)文件的時(shí)間。 可 可
可以在Where子句中使用以上各種屬性作為查詢(xún)的條件。當(dāng)條件中包含全文檢索條件時(shí),需要使用CONTAINS和FREETEXT語(yǔ)句,其用法同SQL Server的全文檢索相同。要注意的是,在對(duì)Index Server的查詢(xún)中,不能使用GROUP BY和HAVING子句。因?yàn)檫@不被Index Server所支持。
此外,在查詢(xún)的SELECT子句中,不能使用*來(lái)選擇所有的屬性。*只有在對(duì)視圖進(jìn)行查詢(xún)時(shí)才可以使用。視圖實(shí)際上可以理解為從一個(gè)查詢(xún)導(dǎo)出的虛擬表。通過(guò)對(duì)視圖的查詢(xún),可以實(shí)現(xiàn)對(duì)查詢(xún)結(jié)果的再次查詢(xún)。視圖一般應(yīng)用于需要經(jīng)常被其他查詢(xún)作為FROM子句中的數(shù)據(jù)源時(shí)使用。建立視圖使用CREATE VIEW語(yǔ)句,其語(yǔ)法結(jié)構(gòu)如下:
CREATE VIEW view_name [(column ][,...n])]
AS
select_statement
其中view_name為要建立的視圖的名稱(chēng),而AS子句后面的就是建立視圖的查詢(xún)語(yǔ)句。而此語(yǔ)句有以下限制:不能包含ORDER BY、COMPUTE和COMPUTE BY等子句;不能包含INTO關(guān)鍵字;不能涉及臨時(shí)表。
而column則用于為視圖中的各個(gè)字段命名。一般只有在這些字段是表達(dá)式或函數(shù)及常數(shù)時(shí)才需要為其命名。
在SQL Server中,也同樣可以使用CREATE VIEW語(yǔ)句來(lái)建立視圖。
下面我們通過(guò)一個(gè)例子來(lái)了解對(duì)Index Server查詢(xún)的全部過(guò)程。
我們將在虛擬目錄\Corpus和C:\temp目錄中查找那些作者在writer表中存在記錄且文檔字?jǐn)?shù)超過(guò)5000字的文件。并返回作者的名字、文檔題目以及作者的身份。其查詢(xún)語(yǔ)句和具體操作過(guò)程如下圖所示。
圖6.11.2-2Index Server查詢(xún)過(guò)程
其中各個(gè)步驟的解釋如下:
1:查詢(xún)被提交到SQL Server,將分布式查詢(xún)部分(包含在OPENQUERY函數(shù)之內(nèi)的部分)傳遞給SQL Server分布式查詢(xún)處理器。
2:分布式查詢(xún)處理器將查詢(xún)進(jìn)一步傳遞給OLE DB Provider for Indexing Service(MSIDXS),由MSIDX連接到文件系統(tǒng)。
3:MSIDXS分析查詢(xún)語(yǔ)句并向文件索引服務(wù)發(fā)出相應(yīng)的命令。
4:文件索引服務(wù)從一個(gè)結(jié)合了Web虛擬目錄/Corpus和C:\Temp目錄的虛擬表中查找那些符合條件的文件并將其作為一個(gè)行集返回給MSIDX。
5:MSIDXS將行集返回給分布式查詢(xún)處理器。
6:分布式查詢(xún)處理器將返回的行集作為一個(gè)表同writers表進(jìn)行結(jié)合查詢(xún),并將最終結(jié)果返回給查詢(xún)提交者。
在對(duì)Index Server的查詢(xún)中,還不能使用QUANTIFIED、COMPARISON、BETWEEN、EXISTS、IN以及NULL等謂詞。因?yàn)檫@些都不被Index Server所支持。但是它支持兩個(gè)SQL Server所不直接支持的兩個(gè)謂詞:MATCHES和ARRAY。我們可以在對(duì)Index Server的查詢(xún)語(yǔ)句中使用它們。其含義和語(yǔ)法結(jié)構(gòu)分別如下:
MATCHES:用于模式匹配,其作用同Like相近但是功能更為強(qiáng)大。它的語(yǔ)法結(jié)構(gòu)如下:MATCHES (Column_Reference, ' { Grouped_Search_Pattern | Counted_Search_Pattern } ') > 0
其中Column_Reference為指定的文件屬性,其數(shù)據(jù)類(lèi)型必須同后面的Grouped_Search_Pattern相匹配。
Grouped_Search_Pattern為指定的匹配模式。而Counted_Search_Pattern則用于對(duì)匹配的數(shù)量進(jìn)行限定,可以有三種限定方式:
嚴(yán)格匹配:在查詢(xún)的文件屬性中包含指定數(shù)目的滿足匹配條件的字串。
至少匹配:在查詢(xún)的文件屬性中包含大于或等于指定數(shù)目的滿足匹配條件的字串。
范圍匹配:在查詢(xún)的文件屬性中包含滿足匹配條件的字串?dāng)?shù)目界于n~m之間。
MATCHES可以使用的模式匹配符及其含義見(jiàn)下表:
符號(hào) 描述
* 包含指定的匹配字符串同時(shí)還包含其他0個(gè)或更多的字符。這同dir命令中使用的*十分類(lèi)似。如以b開(kāi)頭,以d結(jié)尾的字符串的匹配條件為b|*d。
? 包含指定的匹配字符串同時(shí)還包含其他0個(gè)或一個(gè)字符。如滿足b|?d匹配條件的字串包括bd、bad和bed等。
+ 包含指定的匹配字符串同時(shí)還包含其他1個(gè)或更多的字符。如滿足b|+d匹配條件的字串包括bad、bed和bond等。
( ) 用于界定模式匹配,表明在其中的是模式匹配字符條件。當(dāng)條件多于一個(gè)時(shí)使用。
{ } 用于界定匹配數(shù)量,表明在其中的是模式匹配數(shù)量條件。
[ ] 用來(lái)在模式條件中指明一個(gè)字符串的范圍。
| 一個(gè)轉(zhuǎn)義符,要求在上面的每個(gè)符號(hào)前使用它。從而將其同普通字符區(qū)別開(kāi)來(lái)。
下面通過(guò)幾個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明MATCHES謂詞的使用方法。
查找文件內(nèi)容中出現(xiàn)"SQL"三次的文件:
...WHERE MATCHES (DocText, '|(SQL|)|{3|}' ) > 0
查找文件內(nèi)容中出現(xiàn)"SQL"三次以上的文件:
...WHERE MATCHES (DocText, '|(SQL|)|{3,|}' ) > 0
查找文件內(nèi)容中出現(xiàn)"SQL"三次到十次之間的文件:
...WHERE MATCHES (DocText, '|(Bora|)|{3,10|}' ) > 0
當(dāng)你不能確定作者姓名中包含"Pellow"還是"Pelow"時(shí),可以使用下面的條件語(yǔ)句:
...WHERE MATCHES( DocAuthor, '* Pel|{1,2|}ow' ) > 0
ARRAY:用于在兩個(gè)排列(也稱(chēng)為矢量)之間通過(guò)邏輯運(yùn)算符來(lái)進(jìn)行比較。其語(yǔ)法結(jié)構(gòu)如下:
Column_Reference Comparison_Operator [ ALL | SOME ] ARRAY [ Array_Elements ]
其中Column_Reference用于比較的文件屬性,可以是多個(gè)屬性。但是要求其數(shù)據(jù)類(lèi)型同后面的Array_Elements相匹配。
Comparison_Operator為比較運(yùn)算符,它可以是=、!=(不等于)、>、=>、<、<=。
Array_Elements用于指明用于進(jìn)行比較的排列,其必須用"[]"括起來(lái)??盏呐帕幸彩窃试S的,比如下面的查詢(xún)也是合法的。
SELECT foo FROM SCOPE() WHERE bar = ARRAY[]
ALL和SOME則用來(lái)指明對(duì)Array_Elements使用不同的比較方式。對(duì)于All,將會(huì)對(duì)左側(cè)排列中的每個(gè)元素同右側(cè)排列中相應(yīng)的元素進(jìn)行比較。比如下面的表達(dá)式對(duì)于ALL,表達(dá)式結(jié)果為假:
[1,2,3] > ALL ARRAY [1,2]
而對(duì)于SOME,則只要在左側(cè)排列中有一個(gè)值同右側(cè)排列中所有的值比較復(fù)合條件即可。因此下面的表達(dá)式對(duì)于SOME,其表達(dá)式結(jié)果為真:
[1,2,3] > SOME ARRAY [2,1]
因?yàn)樵谧髠?cè)排列中的3,比右側(cè)排列中的2和1都大因此返回值為真。
如果不指明ALL或SOME,將會(huì)按照從左至右的順序?qū)Ρ磉_(dá)式左側(cè)排列中的元素同右側(cè)中相應(yīng)的元素進(jìn)行比較。而一旦兩者不同,將直接返回比較結(jié)果而不再繼續(xù)進(jìn)行其他元素的比較。而如果所有比較的值都相等,則根據(jù)排列的勢(shì)來(lái)決定最后的比較結(jié)果。因此下列表達(dá)式的值都為真。
ARRAY [2,3,4] > ARRAY [1,2]
ARRAY [2,3,4] > ARRAY [1,2,3]
ARRAY [2,3,4] > ARRAY [1,2,3,4]
ARRAY [2,3,4] > ARRAY [1,2,5]
ARRAY [2,3,4] > ARRAY [2,3,3]
ARRAY [2,3,4] > ARRAY [2,3]
ARRAY [2,3,4] < ARRAY [2,3,4,5]
ARRAY [2,3,4]!= ARRAY [2,3,4,5]
下面通過(guò)幾個(gè)例子來(lái)說(shuō)明ARRAY謂詞的使用方法:
查找所有文件屬性為"存檔"的文件:
...WHERE attrib = ARRAY [ 0X820 ]
查找所有文件屬性為"存檔"或"壓縮"(針對(duì)于NTFS文件系統(tǒng))的文件:
...WHERE attrib = SOME ARRAY [0X820 ]
查找矢量值為[10,15,20]的ActiveX文檔:
...WHERE vectorprop = ARRAY [10, 15, 20]