Metadatos administrados: Modelo de objetos y controles (II)

Siguiendo con el post Metadatos administrados: Modelo de objetos y controles (I), veremos en esta ocasión cómo crear nuevas estructuras de metadatos y como consultar los elementos que estén asociadas a ellas mediante el modelo de objetos.

Creación de términos

Crearemos una estructura similar a la siguiente imagen:

image

Lo primero que haremos será hacer un “using Microsoft.SharePoint.Taxonomy;”, para conectar al servicio de metadatos obtendremos una referencia mediante “new TaxonomySession(site);”, a continuación agregaremos un código similar al siguiente:

public static void CrearTerminos()
{
            using (SPSite site = new SPSite(«
http://UrlColecciónDeSitios»))
            {
                TaxonomySession session = new TaxonomySession(site);
                TermStore termStore = session.TermStores[«Servicio de metadatos administrados»]; // Almacén de términos
                Group NuevoGrupo = termStore.CreateGroup(«Grupo de Pruebas»);
                NuevoGrupo.AddContributor(«Dominio\usuario»);
                TermSet conjuntoDeTerminos = NuevoGrupo.CreateTermSet(«Nuevo conjunto»);
                int lcidSpanish = System.Globalization.CultureInfo.GetCultureInfo(«es-ES»).LCID;
                Term termino1 = conjuntoDeTerminos.CreateTerm(«Término 1», lcidSpanish);
                Term termino2 = conjuntoDeTerminos.CreateTerm(«Término 2», lcidSpanish);
                termStore.CommitAll();
            }
}

 

Mediante la propiedad TermStores obtenemos una referencia al almacén de metadatos sobre el que crearemos nuestra estructura. Con el método CreateGroup() crearemos un nuevo grupo de términos. Con CreateTermSet crearemos un nuevo conjunto de términos, si no indicamos nada en el segundo parámetro se creará para el idioma por defecto. Con el método CreateTerm() crearemos términos por debajo del grupo de términos o debajo de otros términos, el segundo parámetro indica el código lcid del idioma del término.

 

Consulta de términos

Una vez hayamos asociado los metadatos a nuestros contenidos podremos realizar consultas sobre ellos con el modelo de objetos, CAML y el motor de búsqueda.

 

Para obtener un término a partir de su descripción utilizaremos el método GetTerms():

public static void ObtenerTerminos()
{
            using (SPSite site = new SPSite(«
http://UrlColecciónDeSitios»))
            {
                TaxonomySession session = new TaxonomySession(site);
                int lcidSpanish = System.Globalization.CultureInfo.GetCultureInfo(«es-ES»).LCID;
                TermSetCollection termSetColl= session.GetTermSets(«Nuevo conjunto», lcidSpanish);
                TermCollection termColl = session.GetTerms(«Término 1», true);
            }
}

 

Para realizar consultas con CAML nos encontraremos con que tendremos que realizar una serie de pasos adicionales ya que al agregar una columna de tipo “Metadatos administrados” SharePoint creará una columna oculta de tipo lookup para facilitar las búsquedas.

Tendremos que obtener entonces el identificador de la columna lookup para construir después la consulta CAML con una estructura similar a la siguiente:

<Query><Where><In><FieldRef LookupId=»TRUE» Name=»{Nombre interno de la columna a consultar}» /><Values><Value Type=»Integer»>{Id de la columna lookup de metadatos}</Value></Values></In></Where></Query>

 

El siguiente ejemplo muestra cómo obtener los elementos catalogados con el término “Automóvil” en una lista mediante CAML:

 public static void ObtenerElementosConTermino() 
{
            using (SPSite site = new SPSite(«
http://UrlColecciónDeSitios»))
            {
                TaxonomySession session = new TaxonomySession(site);
                TermCollection termColl = session.GetTerms(«Automóvil», true);
                foreach(Term term in termColl)
                {
                    if (term.IsKeyword)
                    {
                        int[] arIdsDeElementos = TaxonomyField.GetWssIdsOfKeywordTerm(site, term.Id, 1000);
                    }

                    int[] arIdsDeElementos2 = TaxonomyField.GetWssIdsOfTerm(site, term.TermStore.Id, term.TermSet.Id, term.Id, true, 1000);
                    using (SPWeb web = site.OpenWeb())
                    {
                        SPList listaDocumentos = web.Lists[«Documentos generales»];
                        SPQuery queryCAML = new SPQuery();
                        StringBuilder sb = new StringBuilder();
                        foreach(int idLookup in arIdsDeElementos2)
                        {
                            sb.Append(string.Format(«<Value Type=»Integer»>{0}</Value>», idLookup));
                        }
                        queryCAML.Query = string.Format(«<Query><Where><In><FieldRef LookupId=»TRUE» Name=»{0}» /><Values>{1}</Values></In></Where></Query>»,  listaDocumentos.Fields[«Temática»].InternalName,  sb.ToString());
                        SPListItemCollection items = listaDocumentos.GetItems(queryCAML);
                    }
                }
            }
}

 

Mediante el motor de búsqueda de SharePoint también podremos realizar filtros en base a términos. La propiedad de búsqueda “owstaxIdMetadataAllTagsInfo” nos permite filtrar por un identificador de un término. Además, cada vez que se agregue una nueva columna a una lista del tipo “Metadatos administrados” el motor de búsqueda crear una propiedad administrada para filtrar sobre esa columna, esta propiedad se creará con la estructura “owstax{NombreInternoDeColumna}”.

image

 

En el siguiente ejemplo se muestra cómo realizar una búsqueda con el motor de búsqueda de todos aquellos documentos catalogados con un término:

 

using Microsoft.Office.Server;
using Microsoft.Office.Server.Search;

using Microsoft.Office.Server.Search.Query;

 

public static void ObtenerElementosConBuscador() 
{
           using (SPSite site = new SPSite(«
http://UrlColecciónDeSitios»))
           {
               TaxonomySession session = new TaxonomySession(site);
               TermCollection termColl = session.GetTerms(«Automóvil», true);

               FullTextSqlQuery myConsulta = new FullTextSqlQuery(site);
               myConsulta.RowLimit = 10; 
               myConsulta.QueryText = string.Format(«SELECT Title, Author, URL FROM Scope() WHERE («SCOPE» = ‘Todos los sitios’) AND («owstaxIdMetadataAllTagsInfo»=’#0{0}’)», termColl[0].Id);
               myConsulta.ResultTypes = ResultType.RelevantResults;
               ResultTableCollection misResultados = myConsulta.Execute();
               ResultTable resultadosRelevantes = misResultados[ResultType.RelevantResults];
           }
}

 

En el filtro se ha utilizado la propiedad owstaxIdMetadataAllTagsInfo indicando un valor del tipo “#0{GUID del término}”. No se puede utilizar la propiedad owstaxIdMetadataAllTagsInfo en la parte de consulta Select, solo podremos utilizarla en la parte Where.

 

 

Podréis encontrar más información en:

http://msdn.microsoft.com/en-us/library/ff625182.aspx

Publicado por

Mario Cortés

Mario Cortés Flores es MVP en Office 365, trabaja en Plain Concepts como Team Lead y escribe habitualmente en geeks.ms/blogs/mcortes y en Twitter @mariocortesf. Podréis encontrarlo colaborando activamente con la comunidad de MadPoint y SUGES

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *