/// <summary> /// Get a crawled property by name /// </summary> /// <param name="site">The context site</param> /// <param name="crawledPropertyName">The crawl property name</param> /// <returns>The crawled property</returns> public CrawledProperty GetCrawledPropertyByName(SPSite site, string crawledPropertyName) { CrawledProperty crawledProperty = null; var ssa = this.searchHelper.GetDefaultSearchServiceApplication(site); // Get the search schema var sspSchema = new Schema(ssa); // Search in all categories foreach (var category in sspSchema.AllCategories) { foreach (var property in category.GetAllCrawledProperties()) { if (string.CompareOrdinal(property.Name, crawledPropertyName) == 0) { crawledProperty = property; } } } return(crawledProperty); }
private static void EnsureManagedProperties(SPSite site, IEnumerable <ManagedPropertyDefinition> definitions) { SearchServiceApplication searchApplication = GetSearchServiceApplication(site); if (searchApplication != null) { Schema schema = new Schema(searchApplication); IEnumerable <CrawledProperty> allCrawledProperties = schema.AllCategories["SharePoint"].GetAllCrawledProperties().OfType <CrawledProperty>(); foreach (ManagedPropertyDefinition definition in definitions) { int variantType = VariantTypeDictionary[definition.DataType]; CrawledProperty rawProperty = allCrawledProperties.FirstOrDefault(v => v.Name == definition.CrawledPropertyName); if (rawProperty == null || rawProperty.GetMappedManagedProperties().GetEnumerator().MoveNext()) { continue; } ManagedProperty property; try { property = schema.AllManagedProperties[definition.MappedPropertyName]; } catch (KeyNotFoundException) { property = schema.AllManagedProperties.Create(definition.MappedPropertyName, definition.DataType); } MappingCollection mappings = property.GetMappings(); Mapping mapping = new Mapping(); mapping.CrawledPropset = rawProperty.Propset; mapping.CrawledPropertyName = rawProperty.Name; mapping.ManagedPid = property.PID; mappings.Add(mapping); property.SetMappings(mappings); property.Update(); } FlushCache(site); } }
public static ManagedProperty CreateManagedProperty(SPSite site, string name, string crawledName, ManagedDataType type, SearchCategory searchCategory = SearchCategory.SharePoint, bool searchable = true, bool refinable = true, bool retrievable = true, bool sortable = true, bool hasMultipleValues = false, bool safeForAnonymous = false, bool tokenNormalization = false) { // Get the default service context var context = SearchContext.GetContext(site); // Get the schema of our Search Service Application Schema schema = new Schema(context); if (schema.AllManagedProperties.SingleOrDefault(i => i.Name == name) != null) { Logger.Logger.Debug("SearchUtils.CreateManagedProperty", $"The property \"{name}\" already exists."); return(null); } var categoryName = Enum.GetName(typeof(SearchCategory), searchCategory).Replace("_", " "); Category category = schema.AllCategories.Single(i => i.Name == categoryName); CrawledProperty crawledProperty = category.GetAllCrawledProperties().SingleOrDefault(i => i.Name == crawledName); if (crawledProperty != null) { // Get all the managed properties ManagedPropertyCollection properties = schema.AllManagedProperties; // Add a new property ManagedProperty property = properties.Create(name, type); property.Searchable = searchable; property.Refinable = refinable; property.Retrievable = retrievable; property.Sortable = sortable; property.HasMultipleValues = hasMultipleValues; property.TokenNormalization = tokenNormalization; property.SafeForAnonymous = safeForAnonymous; // Get the current mappings MappingCollection mappings = property.GetMappings(); // Add a new mapping to a previously crawled field var myMapping = new Mapping(); myMapping.CrawledPropertyName = crawledProperty.Name; myMapping.CrawledPropset = crawledProperty.Propset; myMapping.ManagedPid = property.PID; // Add the mapping mappings.Add(myMapping); // Update the collection of mappings property.SetMappings(mappings); // Write the changes back property.Update(); return(property); } return(null); }