Monday, 31 March 2014

Upgrade Search Settings and result sources using PowerShell in SharePoint 2013

I came up with a requirement where I want the user to search the results only from the site collection level. In SharePoint 2010, we all know there are search scopes which help us to narrow down our search based on content sources, web address and metadata. However; there is no search scopes in SharePoint 2013. There is a new concept similar to Search Scope called as Search Result Sources.

This Result sources can be created at "Application Level", "Site Collection Level" and "Site Level".

You could find more information on Result Sources in SharePoint 2013 @ http://technet.microsoft.com/en-us/library/dn186229(v=office.15).aspx

I decided to script out the following
1. Creation of Enterprise Search Centre site
2. Update the search settings to point to this new search centre instead of default OSSSearchResults page.
3. Create a site collection level result source
4. Update the search results webpart properties to query only at above created site collection result source.

1. Create Enterprise Search Centre via PowerShell
$Url = $(Read-Host -Prompt "Enter site url:")
if(-not(Get-PSSnapin | Where-Object {$_.Name -eq "Microsoft.SharePoint.PowerShell"})) {
Add-PSSnapin Microsoft.SharePoint.PowerShell;
}
$site = Get-SPSite $Url
Write-Host "Settings up search centre setup for your site" -ForegroundColor Yellow
$webs=$site.AllWebs | ? {$_.Url -like "*search*"}
$webs | % { Write-Host "Deleting old search centre" -ForegroundColor Yellow ; $_.Delete() }
Enable-SPFeature -Identity "BaseSite" -Url $site.Url
$searchSiteUrl= $site.Url+"/searchcentre"
New-SPWeb $searchSiteUrl -Name Search -Template SRCHCEN#0 -UseParentTopNav
Write-Host "Search centre is setup for your site successfully" -ForegroundColor Green
view raw gistfile1.ps1 hosted with ❤ by GitHub

Note: you need to activate the "BaseSite" Collection hidden feature before creating the search centre.
2. Settings the results page for your above search centre
Write-Host "Settings results page for search centre for your site" -ForegroundColor Yellow
$SEARCH_SETTINGS_PROPERTY_NAME = "SRCH_SB_SET_WEB"
$settingsObj = @{}
$settingsObj.Inherit = $false
$settingsObj.ResultsPageAddress = "/searchcentre/pages/results.apsx"
$settingsObj.ShowNavigation = $false
$settingsObjAsJSON = ConvertTo-Json $settingsObj -Compress
if (!$web.AllProperties.ContainsKey($SEARCH_SETTINGS_PROPERTY_NAME))
{
Write-Host "- adding new entry " -ForegroundColor Yellow -NoNewline
$web.AllowUnsafeUpdates = $true
$web.AddProperty($SEARCH_SETTINGS_PROPERTY_NAME, $settingsObjAsJSON)
$web.Update()
}
else
{
Write-Host "- updating entry " -ForegroundColor Yellow -NoNewline
$web.AllowUnsafeUpdates = $true
$web.SetProperty($SEARCH_SETTINGS_PROPERTY_NAME, $settingsObjAsJSON);
$web.Update()
}
Write-Host "Results page for search centre for your site is set succesfully" -ForegroundColor Green
view raw gistfile1.ps1 hosted with ❤ by GitHub

3. Create a Site Collection level result source
rite-Host "setting up the site collection level result souce for the site" -ForegroundColor yellow
$resultSourceName="MyResultSource"
$resultSourceDescription ="site collection result source"
$query="{searchTerms?} Path:{SiteCollection.Url}"
$ssa = Get-SPEnterpriseSearchServiceApplication "Search Service Application"
$fedman = New-Object Microsoft.Office.Server.Search.Administration.Query.FederationManager($ssa)
$searchOwner = Get-SPEnterpriseSearchOwner -SPWeb $web -Level SPSite
$resultSource = $fedman.GetSourceByName($resultSourceName, $searchOwner)
#Check To See if it exists
if(!$resultSource){
$resultSource = $fedman.CreateSource($searchOwner)
}
$resultSource.Name =$resultSourceName
$resultSource.ProviderId = $fedman.ListProviders()['Local SharePoint Provider'].Id
$resultSource.Description = $resultSourceDescription
$resultSource.CreateQueryTransform($query)
$resultSource.Commit()
Write-Host "Settings the Site Collection scope for the search results in the Search Results webpart" -ForegroundColor yellow
view raw gistfile1.ps1 hosted with ❤ by GitHub

4. Update the search results webpart to use this above result source for query.
$resultSourceID=$resultSource.ID
$resultSourceLevel="SPSite"
$webURL =$web.Url + "/searchcentre"
$web=Get-SPWeb $webURL
$pageUrl="$webURL/Pages/results.aspx?k=test"
$page=$web.lists["Pages"].Items | ? {$_.Name -eq "results.aspx"}
$page.File.CheckOut();
$webpartmanager=$web.GetLimitedWebPartManager($pageUrl, [System.Web.UI.WebControls.WebParts.PersonalizationScope]::Shared)
$webpart = $webpartmanager.WebParts | ? { $_.Title -eq 'Search Results' }
$dataProvider = ConvertFrom-Json $webpart.DataProviderJSON
$dataProvider.SourceID=$resultSourceID
$dataProvider.SourceLevel=$resultSourceLevel
$dataProvider.SourceName=$resultSourceName
$webpart.DataProviderJSON = ConvertTo-Json $dataProvider -Compress
$webpartmanager.SaveChanges($webpart)
$page.File.CheckIn("Changed the Result Source")
$page.File.Publish("Changed the Result Source")
Write-Host "Site Collection scope for the search results in the Search Results webpart is set to 'MyResultSource' successfully" -ForegroundColor green
view raw gistfile1.ps1 hosted with ❤ by GitHub

Hope you like my approach.
enjoy!!
Isha Jain

Runtime error when creating SharePoint 2013 Pulishing site

Today, I received a very strange error when creating a sub publishing site in SharePoint 2013. I received the below error runtime error with the famous yellow screen.



I am surprised to see this error and I have full control to the site and uls logs says access denied to one of the mobile channel list. I wondered what is mobile channel list is, then after much searching I have found that there is a new feature introduced in SharePoint 2013 called device channels.

With Device channel in SharePoint 2013, you can render a single publishing site in multiple ways by using different designs that target different devices like Mobile, i-Pad etc.

In order to resolve this error, you need to grant at least read only access to all the users to this device channel list or break the unique permissions to this list. Device channel list is hidden and can be accessible via site settings -> Device Channels




Thus to solve the above error while creating the sub publishing site, at least provide read only permission to sub site owners at device channel list.

Hope this must have saved lot of your time.

Cheers,
Isha Jain