Sonntag, 3. November 2019

ErgebnisTypen automatisiert aktualisieren

Wenn im Rahmen eines Projektes Anzeigevorlagen (DisplayTemplates) und Ergebnistypen (ResultTypes) erstellt werden, müssen die Ergebnistypen immer wieder aktualisiert werden.
Die entsprechende Meldung stellt sich so dar:

Viele Projekte erschweren sich das Leben, indem dieser Schritt immer manuell vollzogen werden muss - auch wenn der Rest automatisiert ist.

Das aktualisieren ist eigentlich (on premises) kein Hexenwerk: Set-SPEnterpriseSearchResultItemType kann verwendet werden um die DisplayProperties zu aktualisieren.

Ich habe ein Skript erstellt, mit dem alle ResultTypes automatisch aktualisiert werden können:

<#  
.SYNOPSIS  
    Updates the DisplayProperties of the ResultItemTypes.
.Notes
    This script currently only updates Site-Level-ResultTypes.
    
.Example
    Update-ResultItemTypesProperties -SiteUrl https://my.sharepoint.com/sites/search
    Updates DisplayProperties of all non builtin ResultTypes
#>
[CmdletBinding()]
param(
    [Parameter(Mandatory=$true)]
    [string]$SiteUrl
)
$ErrorActionPreference="Stop"

$site = Get-SPSite $SiteUrl     
$ssa = Get-SPEnterpriseSearchServiceApplication
$owner = Get-SPEnterpriseSearchOwner -Level SPSite -SPWeb $site.RootWeb
# TODO: Ssa and SPWeb are also possible locations for owner...

$masterPageGallery = $site.GetCatalog("MasterPageCatalog")

$resultTypes = Get-SPEnterpriseSearchResultItemType -Owner $owner -SearchApplication $ssa | ? { -not $_.Builtin }
$resultTypes | % {
    Write-Verbose "Processing: $($_.Name)"
    $displayTemplateFileName = Split-Path -Path $_.DisplayTemplateUrl -Leaf
    $displayTemplate = $masterPageGallery.Items | ? {$_.Name -eq $displayTemplateFileName}
    $propPairs = $displayTemplate[[guid]"a0dd6c22-0988-453e-b3e2-77479dc9f014"];
    $propsString = ""
    if(-not [string]::IsNullOrWhiteSpace($propPairs)){
        $props = $propPairs.Split(",") | %{ $_.Split(":") | Select -Last 1 } | %{ $_.Trim("'") }
        $propsString = [string]::Join(",", $props)    
    }

    if($_.DisplayProperties -eq $propsString) {
        # match
        return;
    }

    Set-SPEnterpriseSearchResultItemType  -Identity $_ -Owner $owner -SearchApplication $ssa -DisplayProperties $propsString
}

Mikael Svenson hat dazu auch einen c# Schnipsel veröffentlicht, der die entsprechende Aktualisierung durchführt. Dieser kann z.B. in einem FeatureReceiver verwendet werden.