数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

SQL Server同Index Server的结合应用3/3


发布日期:2024年03月09日
 
SQL Server同Index Server的结合应用3/3

通过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 []

因为在左侧排列中的比右侧排列中的都大因此返回值为真

如果不指               

上一篇:关于修改SQL Server表的结构的问答

下一篇:通过HTTP访问SQL Server 2000