Bonjour à tous,

Aujourd’hui je vous propose une petite astuce performance si vous avez besoin de faire une requête Cross-Site Collection sur un type de liste spécifique.

Avant de faire du code, je vous conseil d’utiliser la search box dans un premier temps pour définir votre ou vos keyword qui renverrons les résultats attendus.

Dans quel cas choisir cette option:

– Quand vos requêtes ne sont pas performantes

– Quand vous avez une volumétrie de site important sur votre collection de site

Inconvéniant:

– Votre service de recherche doit être configuré en continuous crawl pour avoir des données relativement fraiche, sachant que vous avez quand même une latence entre l’ajout de la donnée et la disponibilité dans le service de recherche.

Voici comment je vous conseil de procéder pour utiliser cette méthode:

1 – Construisez votre KeywordQuery

Je vais prendre un exemple concret. Je dispose du liste de type tâche contenant des colonnes custom sur chaque sous site de ma collection de site. Ma volumétrie de sous site est évaluée environ 3000 à 5000 sous sites.

Comme vous le savez surement, chaque liste SharePoint dispose d’un type bien particulier. Grace à cette information nous allons pouvoir récupérer via le service de recherche les items de cette liste de tous les sous sites de ma collection de sites.

Dans ma search box je commence par essayer de récupérer mes listes. je tape donc: STS_List_10110 (10110 étant l’id de type de ma liste) dans la recherche sur ma collection de sites.

Je récupére bien l’ensemble de mes listes, si je souhaite récupérer les tâches je vais donc taper: STS_ListItem_10110

Parfait j’ai bien le résultat dont j’ai besoin, le principe vous le constatez est donc très simple.

Vous trouverez une liste des types de liste ici

2 – Implémentez le code c#

Dans un premier temps, j’explique l’implémentation server-side. Si besoin, commentez le post et je ferais l’implémentation client side.

On va commencer par ajouter quelques références:

using Microsoft.Office.Server.Search.Query;
using Microsoft.SharePoint;
using System.Data;

Vous devez ajouter les références suivant à votre projet:

Microsoft.Office.Server (C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\ISAPI\Microsoft.Office.Server.dll)

Microsoft.Office.Server.Search (C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\ISAPI\Microsoft.Office.Server.Search.dll)

Une fois fait, il suffit d’implémenter le code:


using (SPSite siteCollection = new SPSite(SPContext.Current.Web.Url))
{
KeywordQuery keywordQuery = new KeywordQuery(siteCollection);
keywordQuery.QueryText = "Votre Keyword";
SearchExecutor searchExecutor = new SearchExecutor();
ResultTableCollection resultTableCollection = searchExecutor.ExecuteQuery(keywordQuery);
ResultTable resultTable = resultTableCollection.Filter("TableType", KnownTableTypes.RelevantResults).FirstOrDefault();
DataTable dataTable = resultTable.Table;
}

Remplacez « Votre keyword » par votre keyword de recherche(exemple: STS_ListItem_DiscussionBoard)

Vous allez ainsi récupérer une datatable avec l’ensemble des colonnes par défaut de la liste.

Si une colonne n’est pas dans votre datatable mais bien dans votre liste il suffit de l’ajouter dans les selectproperties comme ceci:

keywordQuery.SelectProperties.Add("AssignedTo");

Par contre, si vous avez comme moi une colonne custom dans votre liste et que vous souhaitez récupérer cette information, il faut suivre l’étape 3. Si vous n’avez pas besoin vous avez terminé 🙂

3 – Mapping d’un champs custom dans le service de recherche

Rendez vous dans l’administration centrale puis dans Farm Search Administration et cliquez sur Search Schema

Cliquez ensuite sur « New Managed Property »

Remplissez le propertyName qui sera donc le nom du champs qui sera renvoyé par le service de recherche. Donc le nom à utiliser pour faire le add property dans votre requête.

Selectionnez le type.

Cochez les cases: Searchable,Retrievable,Queryable

Selectionnez oui dans les listes: Refinable et Sortable

Rendez vous dans la section « Mappings to crawled properties

Selectionnez « Include content from all crawled properties

Puis cliquez sur « add a mapping »

Recherchez le nom interne et custom de votre colonne, selectionnez le et validez.

Cliquez ensuite sur « ok »

Faites cette opération autant de fois que vous avez de colonnes custom dans votre liste et dont vous avez besoin de récupérer via la requête au service de recherche.

Une fois terminé, executez un full crawl de votre service de recherche et testez votre requête de recherche.

En espérant que cette astuce vous aidera à accroitre vos performances 🙂

A bientôt pour d’autres news!

SharePointez bien 🙂