Search Driven Sharepoint – Custom sorting van zoekresultaten

Het CoreResultsWebPart in Sharepoint 2010 is een rijke feature. Out-of-the-box kan het onwijs veel, biedt het veel configuratiemodelijkheden en kan het de meeste scenario’s zonder problemen aan. Maar, het CoreResultsWebPart is bedoeld voor traditionele zoekimplementaties. Zodra je meer “search driven” oplossingen gaat implementeren, loop je snel tegen de beperkingen aan. In dit blog belicht ik één van de vele aspecten van search driven oplossingen: de noodzaak tot custom sorting.

Wat? Waarom?

Sharepoint search geeft je weinig opties tot het sorteren van je zoekresultaten. Vanuit de gedachte dat het zoekresultaten zijn en je dus de meest relevante opties bovenaan wilt hebben, is dit natuurlijk prima. Maar wat doe je als je het nieuws uit alle sites in je sitecollecties wilt tonen, relevantie wordt dan opeens publicatiedatum. Wat doe je als je een productsuggestiefunctie voor een webshop bouwt? Dan is relevantie een stuk complexer dan tekstuele overeenkomsten en wil je zelfs direct invloed kunnen uitoefenen op de resultaten. Dit is het topje van de ijsberg met betrekking tot search driven applicaties en in dit blog licht ik een simpel voorbeeld toe van hoe je dit voor elkaar kunt krijgen in Sharepoint 2010.

Allereerst: FAST

FAST Search kan dit soort operaties (en meer) OOB. Het grootste voordeel van FAST werkt helaas in het nadeel.  FAST is een beest van een applicatie en dat leidt tot een behoorlijke footprint, licentiekosten, expertise en consultancy en stevige hardware vereisten. Dat maakt FAST niet geschikt voor alle implementaties, het is al snel een kanon om een mug dood te schieten.

Dus je kunt niet altijd FAST inzetten, maar wilt wel beschikken over custom sorting

Dat kan! Maar het kost wel wat werk. Het CoreResultsWebPart is niet sealed. Door een webpart te maken dat overerft uit CoreResultWebPart heb je de mogelijkheid om het gedrag van je zoekapplicatie te beïnvloeden. In dit specifieke geval overriden we de DataSourceView voor de resultaten. Dit doen we in 3 stappen: eerst maken we een overriding class voor CoreResultsWebPart en specificeren we een nieuwe DataSource.

public class CustomSortedResultsWebPart : CoreResultsWebPart {

   protected override void CreateChildControls() {
      base.CreateChildControls();
   }

   // override the DataSource to allow overriding the DataSourceView
   protected override void CreateDataSource() {
      this.DataSource = new CustomSortedResultsDataSource(this);
   }
}

Vervolgens geven we in deze custom DataSource aan dat we een custom CoreResultsDatasourceView willen gebruiken.

public class CustomSortedResultsDataSource : CoreResultsDatasource {
   public CustomSortedResultsDataSource(CoreResultsWebPart ParentWebpart) : base(ParentWebpart) {
         //create the View that will be used with this datasource
         this.View = new CustomSortedResultsDataSourceView(this,"CustomSortedResults");
      }
}

En tot slot geven overriden we in de custom CoreResultsDatasourceView de AddSortOrder om onze eigen sorteren te tonen.

public class CustomSortedResultsDataSourceView : CoreResultsDatasourceView {

     public CustomSortedResultsDataSourceView(SearchResultsBaseDatasource DataSourceOwner, string ViewName) : base(DataSourceOwner, ViewName) {
         //make sure we have a value for the datasource
         if (DataSourceOwner == null) {
             throw new ArgumentNullException("DataSourceOwner");
         }

         //get a typed reference to our datasource
         CustomSortedResultsDataSource ds = this.DataSourceOwner as CustomSortedResultsDataSource;

         //configure the query manager for this View
         this.QueryManager = SharedQueryManager.GetInstance(ds.ParentWebpart.Page).QueryManager;
     }

     // Add a custom Sort Order for the results
     public override void AddSortOrder(SharePointSearchRuntime runtime) {

         #region Ensure Runtime
         //make sure our runtime has been properly instantiated
         if (runtime.KeywordQueryObject == null) {
             return;
         }
         #endregion

         // use the following to get a handle to the CoreResultsWebPart, allowing this webpart to be configurable though properties etc
         //CustomSortedResultsWebPart webPart = DataSourceOwner.ParentWebpart as CustomSortedResultsWebPart ;

         // remove any other sorted fields we might have had to ensure our custom sort
         runtime.KeywordQueryObject.SortList.Clear();

         // configure the sort list with sort field and direction
         runtime.KeywordQueryObject.SortList.Add("MyCustomField", SortDirection.Ascending);
     }
 }
Frans Sharepoint Developer

Geef een reactie

Nieuwsbrief

WE WON WINNING!!!