In this article I will explain to how to add ‘Rating Stars’ to the search results. Please let me know if you find any issues while implementing it.
Create a custom list and enable rating
We will start with creating the list with some dummy columns and insert some data in it. I have created a ‘Employee List’ whose structure looks something like this:
Now we need to enable the rating to the list. Click on the list settings from the ribbon under the ‘List Tools’ Group and ‘List’ tab:
Now click on the ‘Rating Settings’ link under the ‘General Settings’ category:
Select ‘Yes’ under ‘Allow items in this list to be rated?’ and click ‘Ok’. This has successfully enabled ratings on the list and added following two columns required for rating to work.
- Rating (0-5) / Number of Ratings
- Rating (0-5) / Number of Ratings
If you go back to the list it would have added the Rating Column to the list:
Rate some entries and run the rating services
Now add rating to these entries. It wont be reflected immediately on the list, it will get updated once ‘User Profile Service Application – Social Data Maintenance Job’ and ’User Profile Service Application – Social Rating Synchronization Job’ jobs are executed. These jobs are scheduled to run every hour (By default) by the sharepoint timer services. However we can change the frequency of the this jobs. Go to:
Central Administration -> Monitoring -> Timer Jobs -> Review job definitions
Scroll down to locate the above services:
Click on each of the job and schedule it to run for every 1 min (Just so that we don’t have to wait for our ratings to get updated, in normal scenario running every one hour is just fine. Once this jobs are executed successfully, the ratings that you entered previously would have started reflecting:
Start a full crawl of the site
Now once we have to prepare our FAST search server to include the ratings in our search indexing. So go to the crawled property categories and select ‘Sharepoint’ category. Now search for ‘rating’. It should return following to crawled properties:
- ows_averagerating(Decimal)
- ows_ratingcount(Integer)
If it does not return the above two crawled properties, You need to start full crawl of the site where your list is located. Once the crawl is successful, sharepoint will automatically create the above crawled properties
Create a managed property for the ratings
As we have the crawled property created we can create a managed property for each of them and map it to crawled property. So you need to create following two managed property:
- Rating
- RatingCount
Below are the details of the managed property that will help you to create a managed property:
Start a full crawl of the site
After creating the managed property we need to full crawl the site ‘AGAIN’. Yes, When we earlier crawled the site it just recognised that two more fields are available for crawling. But managed properties were not mapped so it didnt knew where to index the data. So start the full crawl of the site, leave it as it is and proceed to the next step.
Modify core result webpart and it’s XSLT
Now we need to modify the search webpart of our site to display the rating stars in our search. So go to your results.aspx and then edit the page. Now edit your core results webpart. Under:
coreresultswebpart properties->Core Result -> Display Properties -> Fethced Properties
include the following lines before the </Column> tag:
<Column Name="Rating"/> <Column Name="RatingCount"/>
Open the XSL Editor of the webpart by clicking on ‘XSL Editor’ button. Add the below lines of code after the Div tag of ‘<div class=”srch-Title2″>’
<div class="srch-Description"> <xsl:if test="rating > 0"> <b> <xsl:call-template name="DisplayRating"> <xsl:with-param name="theRating" select="rating" /> <xsl:with-param name="theRatingCount" select="ratingcount" /> </xsl:call-template> </b> <br /> </xsl:if> </div>
Copy the following code before the </xsl:stylesheet> tag
<xsl:template name="DisplayRating">
<xsl:param name="theRating"/>
<xsl:param name="theRatingCount"/>
<xsl:if test="$theRating > 0">
<div style="display: inline-block; padding-left: 8px;">
<div>
<xsl:variable name="tempTitle" select="concat($theRating, ' Stars (')"/>
<xsl:variable name="tempTitle2" select="concat($theRatingCount, ' Ratings)')"/>
<xsl:variable name="ratingTitle" select="concat($tempTitle, $tempTitle2)"/>
<xsl:attribute name="title">
<xsl:value-of select="$ratingTitle"/>
</xsl:attribute>
<xsl:choose>
<xsl:when test="round($theRating) = 0 and $theRating > 0">
<xsl:attribute name="style">background-image:url(/_layouts/images/Ratings.png);cursor:
default;height:16px;margin:0px;background-repeat:no-repeat;background-position:-368px 0px;
width:16px;</xsl:attribute>
</xsl:when>
<xsl:when test="round($theRating) = 1 and round($theRating) <= $theRating">
<xsl:attribute name="style">background-image:url(/_layouts/images/Ratings.png);cursor:
default;height:16px;margin:0px;background-repeat:no-repeat;background-position:-352px 0px;
width:16px;</xsl:attribute>
</xsl:when>
<xsl:when test="round($theRating) = 2 and round($theRating) > $theRating">
<xsl:attribute name="style">background-image:url(/_layouts/images/Ratings.png);cursor:
default;height:16px;margin:0px;background-repeat:no-repeat;background-position:-352px 0px;
width:32px;</xsl:attribute>
</xsl:when>
<xsl:when test="round($theRating) = 2 and round($theRating) <= $theRating">
<xsl:attribute name="style">background-image:url(/_layouts/images/Ratings.png);cursor:
default;height:16px;margin:0px;background-repeat:no-repeat;background-position:-336px 0px;
width:32px;</xsl:attribute>
</xsl:when>
<xsl:when test="round($theRating) = 3 and round($theRating) > $theRating">
<xsl:attribute name="style">background-image:url(/_layouts/images/Ratings.png);cursor:default;
height:16px;margin:0px;background-repeat:no-repeat;background-position:-336px 0px;width:48px;
</xsl:attribute>
</xsl:when>
<xsl:when test="round($theRating) = 3 and round($theRating) <= $theRating">
<xsl:attribute name="style">background-image:url(/_layouts/images/Ratings.png);cursor:default;
height:16px;margin:0px;background-repeat:no-repeat;background-position:-320px 0px;width:48px;
</xsl:attribute>
</xsl:when>
<xsl:when test="round($theRating) = 4 and round($theRating) > $theRating">
<xsl:attribute name="style">background-image:url(/_layouts/images/Ratings.png);cursor:default;
height:16px;margin:0px;background-repeat:no-repeat;background-position:-320px 0px;width:62px;
</xsl:attribute>
</xsl:when>
<xsl:when test="round($theRating) = 4 and round($theRating) <= $theRating">
<xsl:attribute name="style">background-image:url(/_layouts/images/Ratings.png);cursor:default;
height:16px;margin:0px;background-repeat:no-repeat;background-position:-304px 0px;width:64px;
</xsl:attribute>
</xsl:when>
<xsl:when test="round($theRating) = 5 and round($theRating) > $theRating">
<xsl:attribute name="style">background-image:url(/_layouts/images/Ratings.png);cursor:default;
height:16px;margin:0px;background-repeat:no-repeat;background-position:-304px 0px;width:80px;
</xsl:attribute>
</xsl:when>
<xsl:when test="round($theRating) = 5">
<xsl:attribute name="style">background-image:url(/_layouts/images/Ratings.png);cursor:default;
height:16px;margin:0px;background-repeat:no-repeat;background-position:-160px 0px;width:80px;
</xsl:attribute>
</xsl:when>
</xsl:choose>
</div>
</div>
</xsl:if>
</xsl:template>
Click ‘Ok’ and save the page.
Search Results
You are ready to search for the results now! My search page something like this:
This post originally appeared on Dhaval Shah’s SharePoint blog.

























