Create a new Search Service Application in SharePoint 2013 using PowerShell

Create a new Search Service Application in SharePoint 2013 using PowerShell

  • Comments 7
  • Likes

 

The search architecture in SharePoint 2013 has changed quite a bit when compared to SharePoint 2010. In fact the Search Service in SharePoint 2013 is completely overhauled. It is a combination of FAST Search and SharePoint Search components.

apxvsdik


As you can see the query and crawl topologies are merged into a single topology, simply called "Search topology". Provisioning of the search service application creates 4 databases:

  • SP2013_Enterprise_Search - This is a search administration database. It contains configuration and topology information
  • SP2013_Enterprise_Search_AnalyticsReportingStore - This database stores the result of usage analysis
  • SP2013_Enterprise_Search_CrawlStore - The crawl database contains detailed tracking and historical information about crawled items
  • SP2013_Enterprise_Search_LinksStore - Stores the information extracted by the content processing component and also stores click-through information

# Create a new Search Service Application in SharePoint 2013

Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue

# Settings
$IndexLocation = "C:\Data\Search15Index” #Location must be empty, will be deleted during the process!
$SearchAppPoolName = "Search App Pool"
$SearchAppPoolAccountName = "Contoso\administrator"
$SearchServerName = (Get-ChildItem env:computername).value
$SearchServiceName = "Search15"
$SearchServiceProxyName = "Search15 Proxy"
$DatabaseName = "Search15_ADminDB"
Write-Host -ForegroundColor Yellow "Checking if Search Application Pool exists"
$SPAppPool = Get-SPServiceApplicationPool -Identity $SearchAppPoolName -ErrorAction SilentlyContinue

if (!$SPAppPool)
{
    Write-Host -ForegroundColor Green "Creating Search Application Pool"
    $spAppPool = New-SPServiceApplicationPool -Name $SearchAppPoolName -Account $SearchAppPoolAccountName -Verbose
}

# Start Services search service instance
Write-host "Start Search Service instances...."
Start-SPEnterpriseSearchServiceInstance $SearchServerName -ErrorAction SilentlyContinue
Start-SPEnterpriseSearchQueryAndSiteSettingsServiceInstance $SearchServerName -ErrorAction SilentlyContinue

Write-Host -ForegroundColor Yellow "Checking if Search Service Application exists"
$ServiceApplication = Get-SPEnterpriseSearchServiceApplication -Identity $SearchServiceName -ErrorAction SilentlyContinue

if (!$ServiceApplication)
{
    Write-Host -ForegroundColor Green "Creating Search Service Application"
    $ServiceApplication = New-SPEnterpriseSearchServiceApplication -Partitioned -Name $SearchServiceName -ApplicationPool $spAppPool.Name 
-DatabaseName $DatabaseName
}

Write-Host -ForegroundColor Yellow "Checking if Search Service Application Proxy exists"
$Proxy = Get-SPEnterpriseSearchServiceApplicationProxy -Identity $SearchServiceProxyName -ErrorAction SilentlyContinue

if (!$Proxy)
{
    Write-Host -ForegroundColor Green "Creating Search Service Application Proxy"
    New-SPEnterpriseSearchServiceApplicationProxy -Partitioned -Name $SearchServiceProxyName -SearchApplication $ServiceApplication
}


$ServiceApplication.ActiveTopology
Write-Host $ServiceApplication.ActiveTopology

# Clone the default Topology (which is empty) and create a new one and then activate it
Write-Host "Configuring Search Component Topology...."
$clone = $ServiceApplication.ActiveTopology.Clone()
$SSI = Get-SPEnterpriseSearchServiceInstance -local
New-SPEnterpriseSearchAdminComponent –SearchTopology $clone -SearchServiceInstance $SSI
New-SPEnterpriseSearchContentProcessingComponent –SearchTopology $clone -SearchServiceInstance $SSI
New-SPEnterpriseSearchAnalyticsProcessingComponent –SearchTopology $clone -SearchServiceInstance $SSI
New-SPEnterpriseSearchCrawlComponent –SearchTopology $clone -SearchServiceInstance $SSI

Remove-Item -Recurse -Force -LiteralPath $IndexLocation -ErrorAction SilentlyContinue
mkdir -Path $IndexLocation -Force

New-SPEnterpriseSearchIndexComponent –SearchTopology $clone -SearchServiceInstance $SSI -RootDirectory $IndexLocation
New-SPEnterpriseSearchQueryProcessingComponent –SearchTopology $clone -SearchServiceInstance $SSI
$clone.Activate()

Write-host "Your search service application $SearchServiceName is now ready"

Update

To configure failover server(s) for Search DBs, use the following PowerShell:

Thanks to Marcel Jeanneau for sharing this!

#Admin Database
$ssa = Get-SPEnterpriseSearchServiceApplication “Search Service Application”
Set-SPEnterpriseSearchServiceApplication –Identity $ssa –FailoverDatabaseServer <failoverServerAlias\instance>

#Crawl Database
$CrawlDatabase0 = ([array]($ssa | Get-SPEnterpriseSearchCrawlDatabase))[0]
Set-SPEnterpriseSearchCrawlDatabase -Identity $CrawlDatabase0 -SearchApplication $ssa -FailoverDatabaseServer <failoverServerAlias\instance>

#Links Database
$LinksDatabase0 = ([array]($ssa | Get-SPEnterpriseSearchLinksDatabase))[0]
Set-SPEnterpriseSearchLinksDatabase -Identity $LinksDatabase0 -SearchApplication $ssa -FailoverDatabaseServer <failoverServerAlias\instance>

#Analytics database
$AnalyticsDB = Get-SPDatabase –Identity <id of database>
$AnalyticsDB.AddFailOverInstance(“failover alias\instance”)
$AnalyticsDB.Update()

 

See the following articles for information about Search Service Application in SharePoint 2013

Comments
  • Great script

  • I noticed that with this script the Farm account gets used as teh Default content access account even though the Pool account gets properly configure. Maybe it is something specific to my configuration, but I am pretty sure you don't want the Farm Application Pool account to be the default content access account. Also: I am guessing since the Default content access account is not a managed account, you probably don't want to use managed accounts if they are going to have scheduled password chanages. Any comments or thoughts on how to do this differently so that a different search account is used for the Default content access account would be greatly appreciated.

  • You can always change the default content access account using the following command:

    $password = Read-Host –AsSecureString**********Set-SPEnterpriseSearchService -id "SSA name" –DefaultContentAccessAccountName Contoso\account –DefaultContentAccessAccountPassword $password

  • Found this script on MANY blogs and in Wrox book, but "New-SPEnterpriseSearchAdminComponent..." commands after #Configuring Search Component Topology always fail with my SP2013 install.  Do you know what the proper commands are?

  • What is the error when the New-SPEnterpriseSearchAdminComponent command fails ?

  • thanks for the amazing article it worked for me except the DB name is not correct , instead of "DatabaseName = "Search15_ADminDB" " it adds DB as "Search15" and give this error.
    -DatabaseName : The term '-DatabaseName' is not recognized as the name of a cmdlet, function, script file, or operable program.
    Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
    At line:29 char:1

    also how to make sure that search working properly, as i have add start address on the Content Sources, and run full crawl, however, not able to get a search result

  • lol, your error is that the line in the script beginning with -DatabaseName is actually a continuation of the previous line... put it back up there and it should work.

Your comment has been posted.   Close
Thank you, your comment requires moderation so it may take a while to appear.   Close
Leave a Comment