In an effort to setup Enterprise Search in SharePoint 2013 using PowerShell to make sure every nook and cranny was covered, I came across a number of scripts, but none seemed to do as good of a job as this one. I’m not sure what the original source is or who put it together, but it worked flawlessly. This is probably by far the best PowerShell script I have found for setting up Enterprise Search that does a good job of setting up every component. Enjoy!
Before running, create a folder on a hard drive of your choosing where indexes will be stored. In this case, I used “C:\SPSearchIndexes” for the Index location. This has to be created beforehand, otherwise it will fail!
## Create Enterprise Search Service (If Upgrading Use Existing Database Names) ##
Add-PsSnapin Microsoft.SharePoint.PowerShell #-ErrorAction SilentlyContinue
#Variables/Parameters
$searchMachines = "serverName"
$searchQueryMachines = "serverName"
$searchCrawlerMachines = "serverName"
$searchAdminComponentMachine = "serverName"
$searchSAName = "Enterprise Search Service"
$saAppPoolName = "Enterprise Search App Pool"
$databaseServerName = "dBserverName"
$searchDatabaseName = "SPSearchDB"
$indexLocation = "C:\SPSearchIndexes"
$SearchAccount = "searchServiceAccount"
#Create search service
Write-Host "Creating Search Service and Proxy…"
Write-Host "Starting Services…"
foreach ($machine in $searchMachines)
{
Write-Host "Starting Search Services on $machine"
Start-SPEnterpriseSearchQueryAndSiteSettingsServiceInstance $machine -ErrorAction SilentlyContinue
Start-SPEnterpriseSearchServiceInstance $machine -ErrorAction SilentlyContinue
}
Write-Host "Creating Application Pool"
$searchAppPool = New-SPServiceApplicationPool -name $saAppPoolName -account $SearchAccount
Write-Host "Creating Search Application…"
$searchApp = Get-SPEnterpriseSearchServiceApplication -Identity $searchSAName -ErrorAction SilentlyContinue
if (!$searchApp)
{
$searchApp = New-SPEnterpriseSearchServiceApplication -Name $SearchSAName -ApplicationPool $saAppPoolName -DatabaseServer $databaseServerName -DatabaseName $searchDatabaseName
}
$searchInstance = Get-SPEnterpriseSearchServiceInstance -Local
Write-Host "Defining the Search Topology…"
$initialSearchTopology = $searchApp | Get-SPEnterpriseSearchTopology -Active
$newSearchTopology = $searchApp | New-SPEnterpriseSearchTopology
Write-Host "Creating Admin Component…"
New-SPEnterpriseSearchAdminComponent -SearchTopology $newSearchTopology -SearchServiceInstance $searchInstance
Write-Host "Creating Analytics Component…"
New-SPEnterpriseSearchAnalyticsProcessingComponent -SearchTopology $newSearchTopology -SearchServiceInstance $searchInstance
Write-Host "Creating Content Processing Component…"
New-SPEnterpriseSearchContentProcessingComponent -SearchTopology $newSearchTopology -SearchServiceInstance $searchInstance
Write-Host "Creating Query Processing Component…"
New-SPEnterpriseSearchQueryProcessingComponent -SearchTopology $newSearchTopology -SearchServiceInstance $searchInstance
Write-Host "Creating Crawl Component…"
New-SPEnterpriseSearchCrawlComponent -SearchTopology $newSearchTopology -SearchServiceInstance $searchInstance
Write-Host "Creating Index Component…"
New-SPEnterpriseSearchIndexComponent -SearchTopology $newSearchTopology -SearchServiceInstance $searchInstance -RootDirectory $indexLocation
Write-Host "Activating the new topology…"
$newSearchTopology.Activate()
Write-Host "Creating Search Application Proxy…"
$searchProxy = Get-SPEnterpriseSearchServiceApplicationProxy -Identity "$searchSAName Proxy" -ErrorAction SilentlyContinue
if (!$searchProxy)
{
New-SPEnterpriseSearchServiceApplicationProxy -Name "$searchSAName Proxy" -SearchApplication $searchSAName
}
Robert
HOw to add multiple servers in the variable $searchMachines = “serverName”? If I want the Query running on two machines is there a way to add it to multiple?
David Westerfield
That’s a great question, I’m honestly not sure.