martes, 27 de julio de 2010

Add managed properties programmatically

Siguiendo con el tema de búsqueda en MSS 2010, nos podemos encontrar que deseamos crear managed properties en tiempo de despliegue, por lo que necesitariamos de alguna forma poder crear managed properties dentro de un feature receiver por ejemplo. Antes de proceder comentar que si bien esto es posible, primero necesitariamos contar con crawled properties ya generadas (por ejemplo de nuestros metadatos), y para ello primero necesitariamos una primera indexación. Una vez comentado esto procederemos a explicar como provisionar estas managed properties.

Lo primero que deberiamos hacer es obtener el searchserviceapplication, para que a partir de este podamos obtener el schema. Esto lo vimos en el post anterior.



SPServiceContext serviceContext = SPServiceContext.GetContext(site);

SPServiceApplicationProxy proxy = serviceContext.GetDefaultProxy(typeof(SearchServiceApplicationProxy));
SearchServiceApplicationProxy searchAppProxy = proxy as SearchServiceApplicationProxy;

SearchServiceApplicationInfo ssai = searchAppProxy.GetSearchServiceApplicationInfo();
SearchServiceApplication application =
Microsoft.Office.Server.Search.Administration.SearchService.Service.SearchApplications.
GetValue(ssai.SearchServiceApplicationId);

Schema schema = new Schema(application);



Una vez tenemos esto podemos proceder a crear la managed property, una managed property consta principalmente de un nombre, un tipo de dato (text, integer, datetime), y un mapping con una o más crawled properties.



MappingCollection mappingCollection = new MappingCollection();

Microsoft.Office.Server.Search.Administration.ManagedProperty managedProperty = schema.AllManagedProperties.Create("My Managed Property", ManagedDataType.Text);


CrawledProperty crawledProperty = GetCrawledProperty(schema, "MyCrawledProperty", ManagedDataType.Text);
Mapping mapping = new Mapping(crawledProperty.Propset, crawledProperty.Name, crawledProperty.VariantType, managedProperty.PID);

mappingCollection.Add(mapping);


managedProperty.SetMappings(mappingCollection);

managedProperty.Update();



En este trozo de código podemos ver que hacemos una llamada a un método que nos devuelve una crawled property a partir del schema, un tipo y un nombre. A continuación muestro este método que se encarga de recorrer las crawled properties para obtener la que hemos solicitado.



protected CrawledProperty GetCrawledProperty(Schema schema, string name, ManagedDataType type)
{
CrawledProperty result = null;

foreach (CrawledProperty cproperty in schema.QueryCrawledProperties(string.Empty, 1000, Guid.NewGuid(), string.Empty, true))
{
if (cproperty.Name == name)
{
if (cproperty.VariantType == GetVariantType(type))
{
result = cproperty;
break;
}
}
}

return result;
}

protected int GetVariantType(ManagedDataType type)
{
switch (type)
{
case ManagedDataType.Text: return 31;
case ManagedDataType.Decimal: return 5;
case ManagedDataType.Integer: return 20;
case ManagedDataType.DateTime: return 64;
default: return 31;
}
}


Bueno, pues esto es todo.

No hay comentarios: