Sharepoint 2010 – PowerShell et Search (Metadata)

Posted on

Dans notre article nous allons aborder la modification de propriété d’indexation du moteur de recherche, ainsi que celle des Métadonnées gérées de SharePoint 2010 en PowerShell.

L’objectif recherché est de proposer des exemples simples, compréhensibles et de voir comment via l’utilisation de ILSPY, que certaines commandes ne sont pas si complètes que ça.

 

Crawling

Trois cmdlets sont principalement utilisées pour le Crawling : Get-SPEnterpriseSearchMetadataCrawledProperty, qui permet de récupérer les propriétés, Set-SPEnterpriseSearchMetadataCrawledProperty, celle-ci pour les mettre à jour et New-SPEnterpriseSearchMetadataCrawledProperty, pour la création.

Voici un exemple afin de récupérer des composants existant et de les mettre à jour avec la propriété IsMappedToContents qui permet de faire un mapping sur des métadonnées existantes, nous utilisons un fichier XML pour la récupération des éléments.

<? xml version=”1.0″ encoding=”utf-8″?>

<SearchProperties>

<ServiceName>Search Service Application</ServiceName>

<CrawledProperties>

<CrawledProperty Name=”ows_ContentType” />

</CrawledProperties>

<ExistingProperties>

<ManagedProperty Name=”ContentType”/>

</ExistingProperties>

<NewManagedProperties>

<!–Types = 1:Text, 2:Integer,3:Decimal,4:DateTime,5:YesNo,6 :Binary–>

<ManagedProperty Type=”4″ Name=”Demo”>

<Map Category=”Basic” Variant=”64″>15</Map>

</ManagedProperty>

</NewManagedProperties>

</SearchProperties>

 

Voici maintenant le code de Recherche :

if ( (Get-PSSnapin -Name Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue) -eq $null )

{

Add-PsSnapin Microsoft.SharePoint.PowerShell

}

#Fichier XML

[System.Xml.XmlDocument] $XmlDoc = new-object System.Xml.XmlDocument

$file = resolve-path(“.MonFichier.xml”)

if (!$file)

{

Write-Host “Fichier non trouvé- Opération Annulé.” -ForegroundColor red

Break

}

write-host -f Green “Traitement du fichier:” $file

$XmlDoc = [xml](Get-Content $file)

 

#Parse des données

$sa = $XmlDoc.SearchProperties.ServiceName

$searchapp = Get-SPEnterpriseSearchServiceApplication $sa

 

$CrawledPropNodeList = $XmlDoc.SearchProperties.CrawledProperties

 

write-host -f Yellow ” Recherche des données Crawl existantes :”

foreach ($CrawledPropNode in $CrawledPropNodeList.CrawledProperty)

{

$SPCrawlProp = $CrawledPropNode.Name

#Vérification

if($crawledproperty =Get-SPEnterpriseSearchMetadataCrawledProperty -Name $SPCrawlProp -VariantType $SPCrawlVariant -SearchApplication $searchapp -ea “silentlycontinue”)

{

write-host -f Green “Des Crawl existent: Nom :” $crawledproperty.Name “- Indexé :” $crawledproperty.IsMappedToContents

write-host  “Mise à jour :”

$crawledproperty | Set-SPEnterpriseSearchMetadataCrawledProperty -IsMappedToContents $True

 

write-host -f Green “Nom :” $crawledproperty.Name “- Indexé :” $crawledproperty.IsMappedToContents

}

else

{

write-host -f Red “Veuillez vérifier dans le fichier XML et Sharepoint qu’ils existent”

}

}

 

Metadata

Concernant les Metadata ici nous utilisons deux méthodes Get-SPEnterpriseSearchMetadataManagedProperty, pour récupérer des métadonnées et Set-SPEnterpriseSearchMetadataManagedProperty, pour la mise à jour.

Concernant les attributs nous utilisons EnabledForScoping, pour définir l’indexation, FullTextQueriable, pour rendre la propriété requêtable, RespectPriority qui correspond dans votre interface utilisatrice aux phrases suivantes : « Inclure les valeurs à partir de toutes les propriétés analysées mappées » ou « Inclure les valeurs à partir d’une propriété analysée unique en fonction de l’ordre spécifié »

function ExistingMeta

{

#Gestion de propriétés pour Settings

 

$OthersPropertyNodeList = $XmlDoc.SearchProperties.ExistingProperties

foreach ($PropertyNode in $OthersPropertyNodeList.ManagedProperty)

{

$SharePointProp = $PropertyNode.Name

if($mp=Get-SPEnterpriseSearchMetadataManagedProperty -SearchApplication $searchapp -Identity $SharePointProp -ea “silentlycontinue” )

{

if($mp.EnabledForScoping -eq $False)

{

$mp | Set-SPEnterpriseSearchMetadataManagedProperty -EnabledForScoping 1

}

if($mp.FullTextQueriable -eq $False)

{

$mp | Set-SPEnterpriseSearchMetadataManagedProperty -FullTextQueriable 1

}

if($mp.RespectPriority -eq $False)

{

$mp | Set-SPEnterpriseSearchMetadataManagedProperty -RespectPriority 1 -ea “silentlycontinue”

}

}

}

}

 

Concernant la création nous utilisons la cmdlet suivante New-SPEnterpriseSearchMetadataManagedProperty

try

{

write-host “Création :”

$mp = New-SPEnterpriseSearchMetadataManagedProperty -SearchApplication $searchapp -Name $SharePointProp -Type $SharePointPropType -EnabledForScoping 1 -FullTextQueriable 1

$mp.HasMultipleValues = $True

$mp.Update()

}

catch [Exception]

{

write-host -f Red “Erreur de création” $_;

}

 

Pour associer un mapping au Metadata il vous faut exécuter le code suivant :

 

$PropertyNodeList = $XmlDoc.SearchProperties.NewManagedProperties

foreach ($PropertyNode in $PropertyNodeList.ManagedProperty)

{

$SharePointProp = $PropertyNode.Name

$SharePointPropType = $PropertyNode.Type

$SharePointPropMapList = $PropertyNode.Map

$SharePointPropMultiple = $PropertyNode.Multiple

 

foreach ($SharePointPropMap in $SharePointPropMapList)

{

$SPMapCat = $SharePointPropMap.Category

$SPMapName = $SharePointPropMap.InnerText

$SPVariant = $SharePointPropMap.Variant

$cat = Get-SPEnterpriseSearchMetadataCategory –SearchApplication $searchapp –Identity $SPMapCat

$prop = Get-SPEnterpriseSearchMetadataCrawledProperty -SearchApplication $searchapp -Category $cat -Name $SPMapName -VariantType $SPVariant

write-host -f Cyan $cat.Name “-” $prop.Name

$mp=Get-SPEnterpriseSearchMetadataManagedProperty -SearchApplication $searchapp -Identity $SharePointProp -ea “silentlycontinue”

try

{

write-host “Création de la donnée finale”

$property = New-SPEnterpriseSearchMetadataMapping -SearchApplication $searchapp -CrawledProperty $prop -ManagedProperty $mp

}

catch [Exception]

{

write-host -f Red “Erreur de création de la donnée finale” $_;

}

}

}

 

ILSPY

 

Deux propriétés ne sont pas accessibles au niveau des options des cmdlets, celles qui apparaissent dans la section suivante de l’interface utilisatrice des métadonnées : « Optimiser le stockage des propriétés gérées »

Pour mettre à jour les propriétés nous utilisons ILSPY afin de voir le code appelé dans la librairie suivante : Microsoft.Office.Server.Search.dll puis nous cherchons la propriété suivante : Microsoft.Office.Server.Search.Internal.UI.ManagedPropertyPage, la méthode correspondante à OkButtonClicked(object sender, EventArgs e). Dans cette méthode nous observons que deux propriétés n’existent pas dans les attributs des cmdlets,  QueryPropertyBlob = true; et PutInPropertyBlob = true;

Il ne vous reste plus qu’à les appeler dans votre code PowerShell de la façon suivante :

$mp. QueryPropertyBlob = $True

$mp. PutInPropertyBlob = $True

$mp.Update()

 

Notons toutefois que ces propriétés sont référencées dans la MSDN et sont pleinement accessible en utilisant les API de SharePoint. En conclusion nous avons la possibilité grâce à PowerShell d’automatiser certains processus de création et de modification des composants de recherche.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s