SharePoint Server 2007 Search 提供一个 Query Web Service,我们可以通过调用Web Service的方式向非SharePoint站点的客户端应用程序提供搜索功能.
MOSS中搜索服务的URL是:
http://Server_Name/[sites/][Site_Name/]_vti_bin/search.asmx
此Web Service中有两个方法来提交搜索:
Query |
以XML形式返回指定查询的结果 |
QueryEx |
以ADO.NET DataSet 对象形式返回指定查询的结果 |
这两种方法不仅返回结果的类型不一样,返回的内容(包含的属性)也不一样.
Query默认返回以下内容:
QueryEx默认返回以下内容:
虽然这两种方法的返回值是不同的,但它们的参数却是相同的:QueryXML.
QueryXML的格式如下:
<QueryPacket>
<Query>
<QueryId />
<SupportedFormats>
<Format />
</SupportedFormats>
<Context>
<QueryText language="zh-CN" type="MSSQLFT|STRING">Query Text</QueryText>
<OriginatorContext />
</Context>
<Range>
<StartAt />
<Count />
</Range>
<Properties name="PROPERTY NAME">
<Property />
</Properties>
<SortByProperties>
<SortByProperty />
</SortByProperties>
<EnableStemming />
<TrimDuplicates />
<IncludeSpecialTermResults />
<IgnoreAllNoiseQuery />
<IncludeRelevantResults />
<IncludeHighConfidenceResults />
</Query>
</QueryPacket>
如果不知道这段XML中具体的属性应该怎样填写可以下载MOSS Query Tool( http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=89b3cda7-aad9-4919-8faf-34ef9b28c57b )这个工具,它可以生成XML.
对于这段XML,我们需要注意粗体的部分:
值可以有两种选择:STRING或MSSQLFT,区别与使用方法如下表所示:
QueryText type |
QueryText value |
增加搜索范围 |
范例 |
STRING |
关键字 |
在QueryXML中为Query元素增加子元素Property,每个Property对应一个属性,Property的name特性值就是加入搜索范围的属性名称. |
<Context><QueryText language="zh-CN" type="STRING"><![CDATA[KEYWORDS]]></QueryText></Context><Properties name="PROPERTY_NAME"> <Property /> |
MSSQLFT |
表示MS SQL 全文检索,Query Text需填写全文检索查询语句(具体的查询语句可以利用上边提到的MOSS Query Tool生成) |
直接在全文检索查询语句中加入属性名称. |
<QueryText language="zh-CN" type="MSSQLFT"><![CDATA[SELECT Title, Rank, Size, Description, Write, Path, PROPERTY_NAME FROM portal..scope() WHERE FREETEXT(DefaultProperties, 'KEYWORDS') ORDER BY "Rank" DESC]]></QueryText> |
最后,在调用Query或者QueryEx方法之前,我们还需要建立"凭证"让客户端通过MOSS的验证.
如果确定客户端和MOSS服务器在同一域中并有权限执行搜索,可以使用默认凭证:
qs.Credentials = System.Net.CredentialCache.DefaultCredentials;
如果客户端不在MOSS域中(比如客户端运行在LINUX等平台中),可以指定搜索用户:
qs.Credentials = new System.Net.NetworkCredential("用户名","密码","域名");
这一步必不可少,而且必须在调用Query或者QueryEx方法之前,否则会提示验证失败.