1

所以我们的场景是这样的:我们有多个 Sharepoint 站点,这些站点是根据“请求”动态创建的。基本上每个新项目都有一个新站点。现在,对于每个站点,我们要添加一个搜索子句,说明只有元数据标记值等于站点名称的内容才能被找到。快速示例:有 2 个站点/项目:Bear 和 Wolf。Sharepoint Search 已经索引了这些站点中的所有文档/列表/等,并为它们建立了一个公共存档。公共档案中的所有文档都有一个名为“ProjectName”的属性。当 Wolf 团队的 Bill 想要在他的项目站点 (Wolf) 中搜索“规范”时,他只想查看与该项目相关的文档。那么如何确保所有文档的“ProjectName”值都设置为“Wolf”?

我猜我可以在这里使用 Scopes,但目前有大约 200 个站点,而且每个月都在增长,因此手动维护它不是一种选择。如果有一种相对简单的自动化范围的方法;出色的。

4

2 回答 2

1

虽然您可以为此使用范围,但我不推荐它。href 字段将为您提供完全自动化搜索所需的一切,而无需持续的维护负担。

您可以执行搜索并根据站点 URL 过滤掉所选站点之外的所有项目,作为返回的任何项目的必需前缀。这是可行的,因为例如给定一个位于http://server/bears的站点,该站点内所有项目的 URL 将采用http://server/bears/ ...的形式。

于 2008-12-29T05:46:10.413 回答
1

搜索范围很容易以编程方式管理。见这里

当搜索范围需要作为功能的一部分发布时,我已经这样做了。

工作正常。

下面,从上面的 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 添加到正确的范围内。

这将允许将文档添加到站点,而无需显式设置文档级别的“项目”属性,确保文档不会被排除在特定范围内的搜索之外。

另一个解决方案是遍历每个文档,如果还没有指定项目名称的字段,则添加一个字段,如果项目名称与站点的属性不匹配,则在文档上设置该项目名称。最终可能会成为一项长期运行的任务。使用我认为的搜索范围要好得多。

于 2008-11-19T20:34:58.830 回答