搜索范围很容易以编程方式管理。见这里。
当搜索范围需要作为功能的一部分发布时,我已经这样做了。
工作正常。
下面,从上面的 MS 文章中提取的代码。
private ServerContext serverctx = null;
private SearchContext searchctx = null;
serverctx = ServerContext.GetContext("SharedServices1");
searchctx = SearchContext.GetContext(serverctx);
Scopes scopes = new Scopes(searchctx);
foreach (Scope scope in scopes.GetSharedScopes())
TreeNode node = treeViewScopes.Nodes.Add(scope.Name);
foreach (TreeNode node in treeViewScopes.Nodes)
{
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;
}
}
}
更新
我会向每个站点添加一个属性,并使用该属性来确定每个 Web 需要添加到哪个范围。然后,控制台样式的应用程序可以通过服务器上的每个 Web 并添加范围规则以将每个 url 添加到正确的范围内。
这将允许将文档添加到站点,而无需显式设置文档级别的“项目”属性,确保文档不会被排除在特定范围内的搜索之外。
另一个解决方案是遍历每个文档,如果还没有指定项目名称的字段,则添加一个字段,如果项目名称与站点的属性不匹配,则在文档上设置该项目名称。最终可能会成为一项长期运行的任务。使用我认为的搜索范围要好得多。