2008-11-19 8 views
1

Notre scénario est le suivant: Nous avons plusieurs sites Sharepoint créés dynamiquement "sur demande". Fondamentalement, il y a un nouveau site pour chaque nouveau projet. Maintenant, pour chaque site, nous voulons ajouter une clause de recherche qui dit que seuls les contenus avec une valeur de balise de métadonnées égale au nom de site doivent être trouvés. Exemple rapide: Il y a 2 sites/projets: Bear et Wolf. Sharepoint Search a indexé tous les documents/listes/etc de ces sites et une archive commune pour eux. Tous les documents de l'archive commune ont une propriété appelée "ProjectName". Lorsque Bill, qui fait partie de l'équipe Wolf, veut rechercher des «spécifications» sur son site de projet (Wolf), il veut seulement voir des documents pertinents pour ce projet. Comment puis-je m'assurer que tous les documents ont la valeur "ProjectName" définie sur "Wolf"?Comment ajouter des paramètres de recherche dynamiques à la recherche par Sharepoint?

Je suppose que pourrait utiliser Scopes ici, mais actuellement il y a ~ 200 sites et cela se développe tous les mois et donc maintenir manuellement n'est pas une option. S'il y a une manière relativement simple d'automatiser les Scopes; excellent.

Répondre

1

Les étendues de recherche sont assez faciles à gérer par programme. Voir here.

Je l'ai fait lorsque les étendues de recherche devaient être libérées dans le cadre d'une fonctionnalité.

Fonctionne bien. Ci-dessous, code extrait de l'article MS ci-dessus.

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

MISE À JOUR

Je voudrais ajouter une propriété à chaque site et utiliser cette propriété pour déterminer quelle portée chaque bande nécessaire à ajouter. Une application de style console peut ensuite parcourir chaque site Web sur le serveur et ajouter des règles d'étendue pour ajouter chaque URL à la bonne portée ou non.

Cela permettrait aux documents d'être ajoutés au site sans avoir à définir explicitement une propriété «projet» au niveau du document, en veillant à ce que les documents ne soient pas exclus de la recherche dans une portée particulière. Une autre solution consiste à parcourir chaque document, ajouter un champ s'il n'y est pas déjà qui spécifie le nom du projet et définir ce nom de projet sur le document s'il ne correspond pas à la propriété du site. Pourrait finir par être une tâche de longue durée. Il vaut mieux utiliser la portée de la recherche, je pense.

+0

Le problème avec cette approche, je crois, est que notre portée est la portée OU. Donc, fondamentalement, nous voulons rechercher tous les documents où la propriété "ProjectName" == Wolf ou où cette propriété n'est pas présente. Avec une portée nous pourrions la limiter à "ProjectName == Wolf", mais cela exclurait beaucoup de docs ... – noocyte

1

Bien que vous puissiez utiliser des étendues pour cela, je ne le recommanderais pas. Le champ href vous fournira tout ce dont vous avez besoin pour automatiser entièrement la recherche sans aucun fardeau de maintenance.

Vous pouvez exécuter une recherche et filtrer tous les éléments en dehors du site sélectionné en fonction de l'URL du site en tant que préfixe requis pour tous les éléments renvoyés. Cela fonctionne parce que par exemple compte tenu d'un site au http://server/bears, les URL de tous les éléments dans le site seront de la forme http://server/bears/ ....

+0

Malheureusement nous avons une source en dehors de Sharepoint (Meridio en fait), donc les URL ne peuvent pas être utilisées comme un filtre ... On dirait que nous allons ajouter des termes de requête directement ... – noocyte

+0

Pouvez-vous appliquer la convention par exemple?la valeur de la balise ProjectName dans Meridio doit correspondre à la partie site de l'URL du site du projet? Si tel est le cas, la requête de recherche est un peu plus complexe mais peut à nouveau être automatisée. –

Questions connexes