Querying on Managed Metadata Field Values in SharePoint Server 2010‏

This two posts from Mario Cortes will give you a good understanding on how to use the Taxonomy in SharePoint 2010:

http://geeks.ms/blogs/mcortes/archive/2010/06/30/metadatos-administrados-modelo-de-objetos-y-controles-i.aspx

http://geeks.ms/blogs/mcortes/archive/2010/07/06/metadatos-administrados-modelo-de-objetos-y-controles-ii.aspx

Metadatos administrados: Modelo de objetos y controles (I)

Mediante el servicio de metadatos podremos asociar a nuestro contenido metadatos con una estructura con sentido para nuestra organización. Además de la poder manejarlos desde la interfaz gráfica, dispondremos de un modelo de objetos para realizar el mantenimiento, consultas y visualizarlo mediante controles.

Modelo de objetos

SharePoint nos proporciona una serie de clases para manejar y navegar por la estructura de metadatos. Para obtener una referencia al conjunto de almacenes de términos definidos para una Colección de Sitios utilizaremos la clase TaxonomySession. Mediante la propiedad TermStores podremos obtener los distintos almacenes de términos del tipo TermStore que representa un almacén de grupos de términos.

Para obtener los grupos de términos utilizaremos la propiedad Groups de la clase TermStore que nos devolverá una colección de elementos del tipo Group.

Para obtener los conjuntos de términos de un grupo utilizaremos la propiedad TermSets.

Para ilustrar un ejemplo:

SPSite site = SPContext.Current.Site; TaxonomySession session = new TaxonomySession(site); TermStore termStore = session.TermStores[“Servicio de metadatos administrados”]; // Almacén de términos Group group = termStore.Groups[“MiGrupo”]; // Grupo de términos TermSet productsTermSet = group.TermSets[“MiConjunto”]; // Conjunto de términos

Term termino = productsTermSet.Terms[“MiTérmino”]; // Término o palabra

Para manejar una columna de tipo “Metadatos administrados” disponemos de la clase TaxonomyField, con el método GetFieldValue() obtendremos una referencia del tipo TaxonomyFieldValue para manejar los valores almacenados en la columna.

De la clase TaxonomyFieldValue podemos obtener el identificador del término almacenado con la propiedad TermGuid y con la propiedad Label el texto del término.

SPList listaConMetadato = SPContext.Current.Site.RootWeb.Lists[“NombreLista”]; SPListItem itemConMetdato = listaConMetadato.Items[0]; TaxonomyFieldValue valordeMetadato = new TaxonomyFieldValue((string)itemConMetdato[“NombreColumna”]); string idTermino = valordeMetadato.TermGuid; string textoTermino = valordeMetadato.Label;

Controles

En la parte visual dispondremos de varios controles como:

  • TaxonomyFieldControl
  • TaxonomyWebTaggingControl

Ambos controles los encontraremos en la dll Microsoft.SharePoint.Taxonomy.dll en el namespace Microsoft.SharePoint.Taxonomy. Para registrar estos controles en una página o control utilizaremos:

<%@ Register Tagprefix=”Taxonomy” Namespace=”Microsoft.SharePoint.Taxonomy” Assembly=”Microsoft.SharePoint.Taxonomy, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c” %>

El control TaxonomyFieldControl lo utilizaremos para poder asociar un elemento de una lista o biblioteca a un metadato, es el control que utilizará SharePoint al visualizar una columna de tipo “Metadatos administrados”. Por ejemplo las páginas wiki disponen de la opción de catalogar las páginas mediante una columna de tipo “Metadatos administrados” y en el layouts:

<Taxonomy:TaxonomyFieldControl FieldName=”Wiki_x0020_Page_x0020_Categories” EmptyValueDescriptionForTargetTemplate=”<%$Resources:cms,enterwiki_nocategories_assigned%>” DisableInputFieldLabel=”true” runat=”server” />


El control TaxonomyWebTaggingControl lo utilizaremos para navegar por la estructura de metadatos. Para utilizarlo tendremos que indicarle que subconjunto del árbol de metadatos utilizará, por ejemplo:

taggingTaxonomy.SspId.Add(termStore.Id); taggingTaxonomy.TermSetId.Add(productsTermSet.Id); taggingTaxonomy.AllowFillIn = true; // Permite autocompletar taggingTaxonomy.IsMulti = false; // Indica si permite multiselección

Para leer el metadato seleccionado, disponemos de la propiedad “Text” que devuelve los términos seleccionados con el formato “Término|GUID”. En este caso no podremos utilizar una clase del tipo TaxonomyFieldValue para extraer los valores por separado ya que el formato que devuelve la propiedad TaxonomyWebTaggingControl.Text no es compatible.

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:

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&#8221;)) { 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&#8221;)) { 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&#8221;)) { 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}”.

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&#8221;)) { 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

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 )

Google photo

You are commenting using your Google 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 )

Connecting to %s

%d bloggers like this: