所以我们的场景是这样的:我们有多个可在“按要求”的基础上动态创建的Sharepoint站点。基本上每个新项目都有一个新站点。现在,对于我们想要添加搜索子句的每个站点,该子句表明只应找到元数据标记值等于网站名称的内容。快速举例: 有2个站点/项目:熊和狼。 Sharepoint Search会为这些站点中的所有文档/列表/等编制索引,并为它们提供公共存档。公共存档中的所有文档都有一个名为“ProjectName”的属性。当Wolf在Wolf团队中想要在他的项目网站(Wolf)中搜索“规范”时,他只想查看与该项目相关的文档。 那么如何确保所有文档的“ProjectName”值都设置为“Wolf”?
我猜我可以在这里使用Scopes,但是目前有大约200个站点,并且每个月都在增长,所以手动维护它不是一种选择。如果有一种相对简单的自动化范围的方法;优异。
答案 0 :(得分:1)
搜索范围很容易以编程方式管理。 请参阅here。
当搜索范围需要作为功能的一部分发布时,我已经这样做了。
工作正常。
下面,代码从上面的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添加到正确的范围。
这样就可以将文档添加到网站,而无需显式设置文档级“项目”属性,从而确保文档不会在特定范围内被排除在搜索之外。
另一个解决方案是遍历每个文档,添加一个字段(如果尚未指定项目名称),并在文档上设置该项目名称(如果它与站点的属性不匹配)。可能最终成为一个长期运行的任务。我认为使用搜索范围要好得多。
答案 1 :(得分:1)
虽然您可以使用范围,但我不推荐它。 href字段将为您提供完全自动化搜索所需的一切,而不会产生持续的维护负担。
您可以执行搜索并根据站点URL过滤掉所选站点之外的所有项目,作为返回的任何项目的必需前缀。这有效,因为例如如果网站位于http://server/bears,则网站中所有项目的网址格式为http://server/bears/ ....