SharePoint Online: How to Trigger Full Reindex using PowerShell?
Requirement: Reindex SharePoint Online site using PowerShell.
How to Reindex the SharePoint site?
After mapping a crawled property to a new managed property in SharePoint Online, We had to Reindex the SharePoint Online site. Typically, whenever you make changes to the search schema, You should Re-index the site. Unlike SharePoint On-premises, where we use the Search Service application to trigger a full crawl, We can’t force a full crawl through the admin user interface in SharePoint Online. Instead, we must go to each site and manually trigger the crawl to ensure all content is fully searchable. This article will explore how to reindex a SharePoint Online site using site settings and PowerShell.
To reindex a SharePoint Online site, do the following:
- Go to Site Settings >> Under the “Search” heading, Click on Search and Offline Availability.
- On the the Search and offline Availability page, under the Reindex section, click the “Reindex” button and confirm the prompt.
Reindex Site in SharePoint Online using PowerShell
Behind the scenes, when you click on Reindex from the SharePoint Online site, a property called “vti_searchversion” gets incremented to instruct SharePoint to denote the site needs to be reindexed. So, let’s use PowerShell to reindex the site in SharePoint Online.
#Load SharePoint CSOM Assemblies
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"
#Function to Reindex SharePoint Online Site (web)
Function Reindex-SPOWeb($WebURL)
{
#Setup Credentials to connect
$Cred= Get-Credential
$Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.Username, $Cred.Password)
#Setup the context
$Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($WebURL)
$Ctx.Credentials = $Credentials
#Get the Search version from Property bag
$Web = $Ctx.Web
$Ctx.Load($Web)
$Ctx.Load($Web.AllProperties)
$Ctx.ExecuteQuery()
[Int]$SearchVersion = 0
#Get the Search Version Property - If exists
If ($Web.AllProperties.FieldValues.ContainsKey("vti_searchversion") -eq $True)
{
$SearchVersion = $Web.AllProperties["vti_searchversion"]
}
#Increment Search Version
$SearchVersion++
$Web.AllProperties["vti_searchversion"] = $SearchVersion
$web.Update()
$Ctx.ExecuteQuery()
Write-Host -f Green "Updated Search Version To: " $SearchVersion
}
#variable
$WebURL="https://Crescent.sharepoint.com/"
#Call the function to reindex
Reindex-SPOWeb -WebURL $WebURL
This marks the site for reindex in SharePoint Online.
PowerShell to Reindex SharePoint Online Site Collection
Let’s change the script a bit to iterate through all sites within a site collection to trigger re-indexing for all sites in a site collection on the next crawl cycle.
#Load SharePoint CSOM Assemblies
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"
#Function to Reindex SharePoint Online Site (web)
Function Reindex-SPOWeb($WebURL)
{
Try {
#Setup the context
$Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($WebURL)
$Ctx.Credentials = $Credentials
#Get the Search version from Property bag
$Web = $Ctx.Web
$Ctx.Load($Web)
$Ctx.Load($Web.Webs)
$Ctx.Load($Web.AllProperties)
$Ctx.ExecuteQuery()
[Int]$SearchVersion = 0
#Get the Search Version Property - If exists
If ($Web.AllProperties.FieldValues.ContainsKey("vti_searchversion") -eq $True)
{
$SearchVersion = $Web.AllProperties["vti_searchversion"]
}
#Increment Search Version
$SearchVersion++
$Web.AllProperties["vti_searchversion"] = $SearchVersion
$web.Update()
$Ctx.ExecuteQuery()
Write-Host -f Green "Updated Search Version To '$SearchVersion' on "$WebURL
#Process all subsites of the current site
ForEach($SubWeb in $Web.Webs)
{
Reindex-SPOWeb -WebURL $SubWeb.URL
}
}
Catch {
write-host -f Red "Error Setting Reindex Flag!" $_.Exception.Message
}
}
#Site collection URL
$WebURL="https://Crescent.sharepoint.com"
#Setup Credentials to connect
$Cred= Get-Credential
$Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.Username, $Cred.Password)
#Call the function to reindex
Reindex-SPOWeb -WebURL $WebURL
This PowerShell marks the SharePoint Online site for reindexing in the next crawl.
PnP PowerShell to Reindex SharePoint Online Site
Here is how to request reindex a SharePoint Online site using the PnP PowerShell cmdlet Request-PnPReIndexWeb:
#Config Variables
$SiteURL = "https://Crescent.sharepoint.com"
#Connect to PnP Online
Connect-PnPOnline -Url $SiteURL -Credentials (Get-Credential)
#Get the Web
$Web = Get-PnPWeb
#Request Reindex
Request-PnPReIndexWeb -Web $Web
By reindexing your SharePoint Online site, you can ensure that your content is easily discoverable and accessible through search, helping to improve productivity and collaboration within your organization.