Share via


在SPS2003中实现定制的搜索

在SPS2001中,可以使用WebDAV来做搜索,但很不幸,在SPS2003中,不再支持这个功能。所以如果要再实现定制的搜索功能,需要使用SPS2003中的对象模型QueryProvider。

微软的网站上,可以看到对应的SDK:

https://msdn.microsoft.com/library/default.asp?url=/library/en-us/spptsdk/html/cQueryProvider.asp

但缺乏例子。我们下面就来看看一个简单的例子:

PortalContext pcx = PortalApplication.GetContext();

string sSearchAppName = pcx.SearchApplicationName;

QueryProvider qp = new QueryProvider(sSearchAppName);

string SQL = "select \"DAV:displayname\", " +

      "\"DAV:href\" " +

      "from (TABLE Portal_Content..Scope() UNION ALL TABLE Non_Portal_Content..Scope())" +

      "where freetext('Microsoft')";

                

System.Data.DataSet objTmpDS;

objTmpDS = qp.Execute(SQL);

DataGrid1.DataSource = objTmpDS.Tables[0].DefaultView;

DataGrid1.DataBind();

很简单,在整个SPS网站范围内,搜索包含”Microsoft”的内容。

下面有几个地方解释一下:

1. Portal_Content和Non_Portal_Content是SPS默认的两个Content Index,我们也可以自己加,然后就可以在Content Index中加入Content Source了。

2. 返回的结果,只是简单地在一个DataGrid中显示出来。

3. SPS2003的Object Model,只能本地调用,不可以远程调用。

所以,如果要在远程调用,就需要使用Web Service了。同样,SPS2003默认也提供了一些Web Service,包括搜索的Web Service(https://server/_vti_bin/search.asmx)。

我们可以看看下面的一个例子:

string registrationString = "<RegistrationRequest revision=\"1\" xmlns=\"urn:Microsoft.Search.Registration.Request\" action=\"NEW\"/>";

QueryService.QueryService myservice = new QueryService.QueryService();

                

myservice.Url="https://server/_vti_bin/search.asmx";

NetworkCredential Credential = CredentialCache.DefaultCredentials.GetCredential(new Uri(myservice.Url), "NTLM");

myservice.Credentials = Credential;

myservice.Registration(registrationString);

string queryString = "<QueryPacket xmlns='urn:Microsoft.Search.Query' revision='1'><Query><Context><QueryText type='STRING' language='en-US'>SharePoint Portal Server</QueryText><LanguagePreference>en-US</LanguagePreference></Context></Query></QueryPacket>";

                

DataSet dsResults;

           

dsResults = myservice.QueryEx(queryString);

                

DataGrid1.DataSource = dsResults.Tables[0].DefaultView;

DataGrid1.DataBind();