In einem Projekt habe ich derzeit die Anforderung  die KeywordSearch von Sharepoint zu benutzen. Dabei ist mir aufgefallen, dass man das Feld “ModifiedBy” einer Dokumentenbibliothek nicht über diese Art von Suche abfragen kann. Die genaue Eigenschaft, die leider standardmäßig auf false steht, stammt aus der Klasse ManagedProperty und heißt Retrievable. Um herauszufinden welche ManagedProperties Retrievable sind, kann ich folgendes Tool empfehlen, welches auch Suchabfragen für FullTextSQL- und FAST-Search beherrscht: http://fastforsharepoint.codeplex.com/

Ich hatte also die Möglichkeit entweder den Wert Retrievable von “ModifiedBy” auf true zu setzen oder dafür ein eigens ManagedProperty anzulegen. Ich habe mich für den zweiten Weg entschieden, da dort keine Probleme beim Zurückziehen der Lösung und eventuell vorhandenen Drittlösungen entstehen sollten.

Will man ein neues Managed Property erstellen muss man über das Schema der SearchApplication auf die ManagedProperties zugreifen. Dies veranschaulicht folgender Codeausschnitt.

SPServiceContext serviceContext = SPServiceContext.GetContext(webapp.ServiceApplicationProxyGroup, SPSiteSubscriptionIdentifier.Default);
SearchServiceApplicationProxy searchApplicationProxy = serviceContext.GetDefaultProxy(typeof(SearchServiceApplicationProxy)) as SearchServiceApplicationProxy;
SearchServiceApplicationInfo searchApplictionInfo = searchApplicationProxy.GetSearchServiceApplicationInfo();

SearchServiceApplication searchApplication = SearchService.Service.SearchApplications.GetValue<SearchServiceApplication>(searchApplictionInfo.SearchServiceApplicationId);
Schema searchSchema = new Schema(searchApplication);
ManagedPropertyCollection manProperties = searchSchema.AllManagedProperties;

ManagedProperty newModifiedBy = properties.Create("newModifiedBy", ManagedDataType.Text);
newModifiedBy.HasMultipleValues = false;
newModifiedBy.RemoveDuplicates = true;
newModifiedBy.Update();

Anschließend möchte ich die Crawled Properties auf das neue Managed Property mappen. Im Projekt habe ich alle die CrawledProperties gemappt die auch in “ModifiedBy” gespeichert werden. Folgender Codeausschnitt zeigt wie nur eines davon gemappt wird.

// Mapping
 MappingCollection mapColOfManProp = hpaModifiedBy.GetMappings();

 CrawledProperty ows_ModifiedBy = searchSchema.AllCategories["SharePoint"].GetCrawledProperty(new Guid("00130329-0000-0130-c000-000000131346"), "ows_ModifiedBy", 31);
 Mapping ows_ModifiedByMapping = new Mapping(ows_ModifiedBy.Propset, ows_ModifiedBy.Name, ows_ModifiedBy.VariantType, hpaModifiedBy.PID);
 if (!mapColOfManProp.Contains(ows_ModifiedByMapping))
 {
    mapColOfManProp.Add(ows_ModifiedByMapping);
 }
hpaModifiedBy.SetMappings(mapColOfManProp); hpaModifiedBy.Update();

Zum Schluss muss nun nur noch ein Update auf die ServiceApplication ausgeführt werden, da sonst das Update erst nach einem Reset des IIS erst die Änderungen überträgt.

searchApplication.Update();

 

Die neuen Daten erscheinen jedoch erst wenn ein neuer Full Crawl gestartet und durchgelaufen ist.

Leave a comment

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Time limit is exhausted. Please reload the CAPTCHA.