Sunday, November 14, 2010

European SharePoint Best Practices Conference 2011

I am honoured to be contributing to next year's European SharePoint Best Practices Conference 2011 as a speaker.

The conference takes places on April 11th - 13th 2011 at the Queen Elizabeth II Conference Centre, London.

The conferences features 96 sessions , 69 speakers (includes the 15 community track speakers and sessions) and this excludes the sponsor partner sessions, It will be the SharePoint conference to attend in Europe in 2011 no other conference outside Microsoft’s in the US will have this many talented SharePoint speakers in one conference. Exhibitor Party / Conference Party / SharePint night and full set of Video Recorded,MP3 and PowerPoint DVDs sent out after the conference, We are expecting the conference to sell out so booking early is recommended.

More information at

Monday, August 30, 2010

Self-Service BI and PowerPivot Session @ SharePoint UK User Group - 2nd September 2010

I'll be delivering another session at the Leeds/Bradford SharePoint UK User Group on 2nd September 2010 on Self-Service BI and PowerPivot. I'll update this post to provide a link to the slide deck after the session. In the meantime, see the agenda below:


- What is PowerPivot?

- Architecture – PowerPivot for Excel and PowerPivot for SharePoint (Analysis Services & Vertipaq mode)

- Installing PowerPivot (Dev/Prod build considerations)

- The client tools – Excel-Add In for PowerPivot

- Connecting to back end line of business applications with a worked example

- Modelling data in PowerPivot with a worked example

- PivotTables/Charts

- Slicing and Dicing data in PowerPivot

- Custom queries using DAX

- Publishing PowerPivot applications to SharePoint

Saturday, June 26, 2010

A note on SharePoint and Windows Update KB938444

A Windows Update security patch (KB938444) has been known to cause a number of issues within a SharePoint farm after its application. Errors such as:

- HTTP 404
- Server Error
- Cannot connect to the configuration database

can appear after applying the patch. You should read Microsoft’s statement on the SharePoint blog and a complete description of the problem from the Small Business Server team at the following locations:

Monday, June 21, 2010

Custom Ranking Models with SharePoint 2010: Background, Value and Administrative Overview


At a recent SharePoint user group session, where I spoke on Enterprise Search in SharePoint 2010, I was introduced as discussing the "black art" of search. The reason, I think, that search was described in that way reflects the way in which most people think about search: something that is pervasive and quickly yields the information required, usually on the first page of results. It's fair to say that the average user doesn't comprehend the complexity and effort required to maintain relevancy, and nor should they need to.

With the accuracy, power and flexibility of the big-name internet search engines comes a certain expectation from end users in terms of search engine performance behind the corporate firewall. Striving to achieve the same level of fidelity of search results behind the firewall with most Enterprise Content Management (ECM) systems presents a major challenge and administrative headache. SharePoint 2010 alleviates some of this pain and provides the ability to override the default ranking model for enterprise search results. This enables the development of application and organisation specific enterprise search applications which provide contextual results.

This article is the first of a series I'll produce on custom ranking models with SharePoint 2010. The aim of this article is to provide a background on custom ranking models, why they're important and how SharePoint 2010 supports the implementation and management of custom ranking models through PowerShell and XML configuration files.

Background on Custom Ranking Models and SharePoint 2010

The ranking model that SharePoint 2010 uses is based upon BM25F. BM25F is actually BM25, a ranking function originally implemented at London City University, with field weighting and per-field length normalisation and provides support for weightings for managed properties/metadata amongst other things. It is at this point that I would strongly urge the reader to investigate the references at the end of this article. There is an extent to which the successful implementation of custom ranking models depends upon foundation knowledge of BM25F.

There are nine ranking models available out of the box with SharePoint 2010 and these are:

  • Main Results Default Ranking Model
  • Expertise Social Distance Ranking Model
  • High Proximity Ranking Model
  • Main People Social Distance Model
  • Expertise Model
  • Name Social Distance Ranking Model
  • Name Model
  • Main People Model
  • No Proximity Model

There is no support to modify these ranking models and you must create your own. For reference purposes, these can be viewed within the MSSRankingModels table of the SSA Admin DB as shown below:

I would urge you to 'look' at these ranking models in a development environment because that will give you an idea of the power and flexibility that you can leverage through XML files alone.

Why are custom ranking models important?

Custom Ranking Models are important because they allow search results to be tailored based upon what we know is already important within our organisation. Consider an Enterprise Search Center for a Sales division within an organisation. Sales people are sales driven and have an much greater interest in specific content types and information than others e.g. a PowerPoint slide deck relating to a SharePoint sales pitch rather than an extensive Word document along the technical aspects of SharePoint Enterprise Search. Ranking Models, simply put, allow us to define what is appropriate and relevant within a specific organisation and promote/demote search results based on the criteria that we define.

The Ranking Model Schema

Microsoft provide a ranking model schema, given below, which provides a blueprint on which to validate your custom models.

<rankingModel name="string" id="GUID" description="string" xmlns="">


<queryDependentFeature pid="PID" name="string" weight="weightValue" lengthNormalization="lengthNormalizationSetting" />



<categoryFeature pid="PID" default="defaultValue" name="string">

<category value="categoryValue" name="string" weight="weightValue" />


<languageFeature pid="PID" name="string" default="defaultValue" weight="weightValue" />

<queryIndependentFeature pid="PID" name="string" default="defaultValue" weight="weightValue">

<transformRational k="value" />

<transformInvRational k="value" />

<transformLinear max="maxValue" />




This basic blueprint will be explored in future articles as we discuss the actual development of custom ranking models. For now, I would draw your attention to the QueryDependantFeature and QueryIndependantFeature XML elements.

Query Dependant Features within the ranking model provide the ability to define managed properties which supports dynamic ranking. Query Independent Features are static ranking properties that apply irrespective of the query issued or the results returned. Why is this important? Well… we may want to stipulate that we always want to rank PowerPoint presentations above Word documents. We could then express this as a Query Independent Feature.

Administrative Overview

The power of custom ranking models becomes even more impressive when we realise that developer intervention is not necessary for their implementation and management. The necessary tools to implement and manage custom ranking models are PowerShell and XML.

Managing custom ranking models with PowerShell

There are four PowerShell cmdlets that provide the functionality to manage existing, and implement new, ranking models.


Returns a ranking model


Adds a ranking model to a shared search application


Deletes a ranking model


Sets the properties of a ranking model for a shared search application

These speak for themselves and I won't discuss each in turn any more than the descriptions given above. Suffice to say, I urge you to look at those cmdlets within PowerShell and take some time to understand their parameters.

Applying custom ranking models in Enterprise Search

Once you have a custom ranking model applied, using the aforementioned PowerShell cmdlets, there are three ways in which you can test the effects that other ranking models have on search results.

  1. Add rm={GUID} parameter to your search centre query string

    This is the easiest way to test the effects that a custom ranking model will have on search results and is probably the route you will take during development and testing. To quickly see how search results change based on different ranking models, you can take one of the GUIDs from the ModelId column in the MSSRankingModels table and apply that.

  2. Export Core Results WebPart, modify RankingModel parameter and reimport

    This is useful when developer intervention is not required or available. A standard out of the box Core Results Web Part can be exported to a .webpart file. An administrator is then able to modify this file and insert the GUID of the ranking model to use before reimporting the file into the page or Web Part gallery.

  3. Inherit the Core Results Web Part and wire up your ranking model in code

    This is the most likely option when there is already a development effort underway or there are other specific customisations to the Core Results Web Part needed.

What's next?

The next article will explore the development of custom ranking models. This would benefit from an entire blog post of its own. For now, and before you embark on developing custom ranking models, I would urge you to begin to understand the fundamental concepts of BM25F and begin to identify what information is important to your organisation that you can use to influence ranking.


Microsoft Cambridge at TREC–14: Enterprise track

Monday, May 24, 2010

Slide deck from SharePoint User Group -18th May 2010 - Enterprise Search and SharePoint 2010 - What's New?

I presented at the SharePoint User Group UK in Nottingham on 10th May 2010. I covered Enterprise Search in SharePoint 2010 from a "What's New/?" perspective around architecture, development and administration.

The demos were how to create a Custom Connector for BCS and Search and Administering Custom Ranking Models using PowerShell and XML. Feedback is welcome, as always.

Download my slide deck here

Tuesday, March 23, 2010

UserSelectionMode issue when extracting Person/Group field definitions in WSS 3.0/MOSS 2007

An issue exists when extracting Person or Group fields from SharePoint, specifically using SPSource but I'm guessing this issue transcends the use of SPSource due to the following article from

The issue is that when you've extracted a field you may see an 'invalid' attribute value in UserSelectionMode="PeopleOnly". Basically this value should be 0 for people only as the schema defines this as an int. If you attempt to deploy a field definition in XML via Elements.xml you'll see the following error:

Feature definition with Id xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx failed validation, file 'ECM.SiteColumns\Columns.xml', line 17, character 98:

The 'UserSelectionMode' attribute is invalid - The value 'PeopleOnly' is invalid according to its datatype '' - The string 'PeopleOnly' is not a valid Int32 value.

ECM.wsp: The Solution installation failed.

The value for UserSelectionMode should be set to 0 for PeopleOnly or 1 for PeopleAndGroups. I haven't tested yet, but I wonder whether this would be valid if the field was provisioned programmatically using AddFieldAsXml() method. This would then yield consistent behaviour with the <Customization> child element bug discussed on the SharePointDev wiki @

Friday, March 5, 2010

First article published on

Head on over to and read my thoughts on the business value of SharePoint, and why we need to understand how that value changes when we apply SharePoint to different levels of an organisation.

Read more @

Wednesday, February 24, 2010

Developing Custom SharePoint Timer Jobs and the importance of separating SharePoint development from SharePoint deployment

The catalyst for me writing this blog post was a pretty standard requirement for a daily timer job on a Web Content Management (WCM) project for a customer last week. I spent the best part of a day writing the logic for the timer job inside a Console Application project where the debug cycle is far greater reduced. I then spent 5 minutes packaging that up and deploying. I then decided I needed to modify the schedule which was originally set via the Feature Receiver but I didn't want to redeploy or reactivate, and nor should I. This reminded me of how many more junior SharePoint developers I see who forget very basic rules about not confusing the development process with the deployment process. This blog post discusses the resources, and methods I used to quickly wrap a piece of SharePoint functionality into a timer job, deploy it to a WSP and modify its schedule via the UI.

So, after you've got your logic written in your Console Application and you want to package that up into a timer job, then what? Well, that's pretty simple. Visit Andrew Connell's blog and read his article on Creating Custom SharePoint Timer Jobs. This isn't groundbreaking, complex code but quite simply put; it works. In the interests of brevity I'm not going to repeat any content here. One thing you will notice is that the scheduling for the job is inside the FeatureActivated() event within the Feature Receiver. This is fine if you know the schedule at the time you deploy. The chances are however you're going to want to modify the schedule after you've deployed when the customer inevitably changes their mind about when, and how often, a specific piece of functionality runs. For this, there's an awesome tool on the CodePlex website called SharePoint Timer Job Administration. This is an awesome piece of software that gives you a link within SharePoint Central Administration called "Manage Timer Jobs" where you can modify the schedule and disable/delete timer jobs. Simply modify the UI and restart the Windows SharePoint Services Timer Service (OWSTimer.exe) and you're good to go.

So my point? By 4:30pm last Thursday I had a piece of code written and tested. By 5pm that code was wrapped in a timer job, packaged inside a WSP and deployed into a customer environment. From that point its schedule was modified multiple times via the browser. Even though I understand how to write timer jobs and how to package SharePoint artefacts into deployable solutions, I would have wasted a great deal of time if I was deploying code into SharePoint inside a timer job from the beginning. Imagine how much timer I'd have wasted if I didn't understand SharePoint timer jobs and I did that? We need to think about what it is we're testing when we write SharePoint code and be absolutely sure to separate functional testing of SharePoint artefacts (Content Types, Site Columns, Timer Jobs) from their deployment. Tools such as the SharePoint Solution Generator, and more recently SPSource, make it so much easier to separate development from deployment and we should take full advantage of them. These tools allow us to generate entire publishing solutions via SharePoint Designer and the SharePoint UI and extract them afterwards. I wrote a tweet today on how the variety and quality, in general, of CodePlex tools make the life of a SharePoint consultant so much easier. I meant it, too.