2008-11-19 141 views
1

所以我们的场景是这样的:我们有多个Sharepoint网站,这些网站是根据“请求”动态创建的。基本上每个新项目都有一个新的网站。现在,对于我们想要添加搜索子句的每个网站来说,只应该找到具有等于网站名称的元数据标记值的内容。快速示例: 有2个网站/项目:熊和狼。 Sharepoint Search对这些网站的所有文档/列表/等进行了索引,并为它们提供了一个通用档案。公用存档中的所有文档都有一个名为“ProjectName”的属性。当沃尔夫团队的比尔想要在他的项目网站(沃尔夫)中搜索“规格说明”时,他只想看到与该项目相关的文档。 那么如何确保所有文档的“ProjectName”值设置为“Wolf”?如何将动态搜索参数添加到Sharepoint搜索?

我猜我可能在这里使用范围,但目前有〜200个网站,这是每个月增长,所以手动维护不是一个选项。如果有一个相对简单的范围自动化方法,优秀。

回答

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; 
    } 
    } 
} 

UPDATE

我将一个属性添加到每个站点,并使用该属性来确定每个网站需要被添加到该范围。 然后,控制台样式的应用程序可以通过服务器上的每个网站并添加范围规则以将每个网址添加到正确的范围。

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

对此的另一个解决方案是遍历每个文档,如果尚未存在指定项目名称的字段,则添加一个字段,并在文档与该网站的属性不匹配时在该文档上设置该项目名称。最终可能是一项长期运行的任务。使用我想的搜索范围会更好。

+0

这种方法的问题,我相信,是我们的范围是OR范围。所以基本上我们要搜索属性“ProjectName”== Wolf的所有文档或者该属性不存在的地方。使用范围我们可以将其限制为“ProjectName == Wolf”,但是这会排除大量文档... – noocyte 2008-11-27 11:06:32

1

虽然你可以使用这个范围,我不会推荐它。 href字段将为您提供所有您需要的全部自动化搜索功能,而无需维护。

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

+0

不幸的是,我们有一个源于Sharepoint(Meridio实际)之外的源,因此这些URL不能用作过滤器...看起来像我们将直接添加查询条件... – noocyte 2009-01-06 11:11:13