MSDN Visual系列:MOSS企业级搜索之三——创建和使用搜索范围
在SharePoint Server 2007中搜索范围用于缩小用户执行查询后返回的搜索结果集。搜索范围可以定义成共享的,也可以是局部的。在搜索范围定义中,我们可以使用不同的规则,可以定义一个基于某种内容源的简单范围,也可以定义一个基于自定义元数据条件的复杂范围。我们可以在搜索下拉列表、搜索结果页面、高级搜索以及其他位置中看到搜索范围。我们可以简单的理解为,在搜索范围选取下拉列表中所看到的范围就是搜索范围。
管理员可以在浏览器重创建搜索范围。另外,MOSS还提供了一整套新的搜索管理对象模型。下面的代码中,我们将创建一个共享的搜索范围,并发布该范围,使其成为一个协作门户的搜索体验的一部分。
我们必须使下面的样例代码运行在装有MOSS的服务器上。该代码需要引用到Microsoft.SharePoint.dll,Microsoft.Office.Server.dll,Microsoft.Office.Server.Search.dll和System.Web.dll。添加下列的namespace:
using Microsoft.Office.Server.Administration;
using Microsoft.Office.Server.Search;
using Microsoft.Office.Server.Search.Administration;
连接到共享服务SSP(Shared Services Provider)和搜索上下文
明白如何添加到SSP和搜索服务上下文的引用是很重要的。这是我们进行搜索范围编程的基础。下面的代码展示了该过程。本例假设共享服务的名称为“SharedServices1”。
private SearchContext searchctx = null;
private void Form1_Load(object sender, EventArgs e)
{
serverctx = ServerContext.GetContext("SharedServices1");
searchctx = SearchContext.GetContext(serverctx);
}
列出已有的范围
通过传搜索上下文(SearchContext)给Scopes类的构造器来初始化一个Scopes对象。然后,可以通过循环遍历所有GetSharedScopes得到的范围。
foreach (Scope scope in scopes.GetSharedScopes())
{
TreeNode node = treeViewScopes.Nodes.Add(scope.Name);
}
获取相关的规则信息
规则决定了搜索范围。我们可以获取所有规则的细节。下面的代码展示了对象模型中提供的三种不同类型的规则。
{
foreach (ScopeRule rule in scope.Rules)
{
if (rule is PropertyQueryScopeRule)
{
PropertyQueryScopeRule prule = (PropertyQueryScopeRule)rule;
TreeNode childnode = node.Nodes.Add("Property Query Rule: ");
childnode.Text += prule.Property.Name + " = " + prule.Value;
}
if (rule is AllContentScopeRule)
{
AllContentScopeRule arule = (AllContentScopeRule)rule;
node.Nodes.Add("All Content Rule");
}
if (rule is UrlScopeRule)
{
UrlScopeRule urule = (UrlScopeRule)rule;
TreeNode childnode = node.Nodes.Add("URL Rule: ");
childnode.Text += urule.MatchingString;
}
}
}
创建一个共享的搜索范围
我们可以通过添加一个Scope实例到ScopeCollection中来创建一个共享的搜索范围。可以通过Scopes实例的AllScopes属性得到一个ScopeCollection。当我们创建好一个共享的搜索范围后,就可以使用CreateUrlRule方法来给该范围关联一个或多个规则。
(textBoxName.Text, string.Empty, null, true,
"results.aspx", ScopeCompilationType.AlwaysCompile);
newScope.Rules.CreateUrlRule
(ScopeRuleFilterBehavior.Include,
UrlScopeRuleType.HostName, textBoxURLRule.Text);
编译共享搜索范围
我们还需要在使用该范围前编译它。这包括了在物理的索引文件中标记出符合该范围的规则的条目的过程。编译是在Scopes实例的级别进行的。
列出显示组
搜索范围会出现在SharePoint站点的范围选取器中。一个范围选取器会把某个范围列在某个显示组中。下面的代码会获取某个特定站点集下所有的显示组。
{
if (group.OwningSite.Url == textBoxURL.Text)
comboBoxDisplayGroups.Items.Add(group.Name);
}
}
关联共享的搜索范围到某个显示组
我们必须把范围关联到某个显示组上,以便范围选取器显示它。
(new Uri(textBoxURL.Text),
comboBoxDisplayGroups.SelectedItem.ToString());
group.Add(newScope);
group.Update();
在MOSS环境中,我们可以定义两种级别的范围:
-
我们可以在SSP级别上创建共享的搜索范围。这样就可以在服务器场级别中,所有绑定该SSP的Web应用程序上,创建的网站集里使用该范围。
-
我们也可以在个别的网站集上创建用于局部的搜索范围。这样的范围无法在其他的网站集上重用。
一个搜索范围是由一个或多个规则定义的。SharePoint Server 2007对象模型中引入了新的规则,用于支持不同类型的搜索范围。
-
AllContentScopeRule 类 用于描述一个包含了索引中的所有条目的范围。
-
通过 PropertyQueryScopeRule 类我们可以创建出符合某个属性查询(如,作者=李向军)的范围
-
UrlScopeRule 类描述的范围中的条目都是在某个显示的URL网址下。
最终用户可以在范围选取下拉列表中选择某个特定的搜索范围或者一个上下文相关的搜索范围,如“搜索此网站”。
查看视频