Arquitectura, buenas prácticas y desarrollo sobre la nueva herramienta de Microsoft SharePoint 2016

Cómo paginar utilizando la API de búsqueda en servidor

Muchas veces te he contado que el servicio de búsqueda es uno de los grandes valores que hay en SharePoint y su buen aprovechamiento hace que muchas organizaciones consideren SharePoint como un referente dentro de su organización.

Session-Video--Killer-Visuals-with-SharePoint-Search-and-Display-Templates_header_2daeb7

Ahora bien, este aprovechamiento al 100% de sus posibilidades, va ligado con el uso del WebPart Content Search. Éste es un elemento que viene de serie en SharePoint 2013 que permite a los usuarios generar plantillas mediante DisplayTemplates y mostrar los resultados de búsqueda de una forma bastante elegante (mira la web de CompartiMOSS). Esto hace que las plantillas sean muy útiles y muy aprovechables en todos los sitios que hay en tu organización. Sin embargo, este WebPart solamente se puede utilizar en entornos Onpremise cuando la licencia de SharePoint es la Enterprise. 

Este servicio lo podemos/debemos utilizar independientemente del licenciamiento que el cliente tenga. Hay muchos motivos:

  • Poder consultar elementos de todos los sitios de nuestra granja
  • Consultas más complejas y más rápidas
  • Integrada con permisos
  • Refinadores

Pero, aunque no lo parezca, también tiene inconvenientes:

  • El contenido para poder ser utilizado tiene que estar previamente indexado.
  • Es necesaria una buena infraestructura para que la granja no se vea repercutida cuando se activa el servicio de búsqueda.

Cómo utilizar el servicio de búsqueda dentro de un desarrollo

Para poder utilizar el servicio de búsqueda, debes de agregar la siguiente referencia al proyecto:

    using Microsoft.Office.Server.Search.Query;

En primer lugar, tienes que crear un objeto KeywordQuery en el pondrás la consulta que vas a realizar al servicio de búsqueda, unido con los campos que vas a traer. Al mismo objeto también le debes a añadir el número de elementos que vas a traer como máximo, el/los campos por los que vas a ordenar la consulta. El código sería como el siguiente:

 var keywordQuery = new KeywordQuery(SPContext.Current.Site) { QueryText = query };
 keywordQuery.SortList.Add(sortProperty, direction);
 keywordQuery.SelectProperties.AddRange(selectProperties);
 keywordQuery.RowLimit = rowLimit.Value;

Una vez tienes creado el objeto sobre el que vas a realizar la búsqueda, tienes que crear un objeto de tipo SearchExecutor() e indicarle que realice la búsqueda:

var searchExecutor = new SearchExecutor();
var resultTableCollection = searchExecutor.ExecuteQuery(keywordQuery);

En el objeto resultTableCollection, tienes que dejar el objeto preparado para poder consultar los datos de la búsqueda:

 var resultTables = resultTableCollection.Filter("TableType", tableType);
 var resultTable = resultTables.FirstOrDefault();                
 var dataTable = resultTable.Table;

¿Cómo puedes paginar los resultados?

Para poder paginar e ir consultando los resultados, por ejemplo de la misma que hace Google, en primer lugar tendrás que saber si tienes más resultados que los que has consultado. Para ello, siguiendo dentro de la variable resultaTable tienes una propiedad que te indica el número Total de elementos que coinciden con la consulta. Esta propiedad es resultTable.TotalRows. Con lo cual, saber si tienes más elementos que consultar es muy simple.

Y… ¿Cómo le dices al buscador que te devuelva la segunda página de resultados? Dentro del Objeto que KeyworQuery, dispones de una propiedad a la que le indicarás a partir de que elemento te devolverá el servicio. Esta propiedad es StartRow y EndRow. Con todos estos ingredientes puedes implementar una función como la siguiente:

public static ResultSearch GetSearchResults(string siteUrl, string query, string tableType, string sortProperty = null, SortDirection direction = SortDirection.Descending, string[] selectProperties = null, int? rowLimit = null, int numPage = 0)
        {
            var result=new ResultSearch();
            using (var siteCollection = new SPSite(siteUrl))
            {
                var keywordQuery = new KeywordQuery(siteCollection) { QueryText = query };
                if (!string.IsNullOrWhiteSpace(sortProperty)) keywordQuery.SortList.Add(sortProperty, direction);
                if (selectProperties != null && selectProperties.Length > 0) keywordQuery.SelectProperties.AddRange(selectProperties);
                if (rowLimit.HasValue) keywordQuery.RowLimit = rowLimit.Value;
                keywordQuery.StartRow = keywordQuery.RowLimit*(numPage - 1);
                var searchExecutor = new SearchExecutor();
                var resultTableCollection = searchExecutor.ExecuteQuery(keywordQuery);
                var resultTables = resultTableCollection.Filter("TableType", tableType);
                var resultTable = resultTables.FirstOrDefault();                
                var dataTable = resultTable.Table;
                result.Result=  dataTable;
                if (resultTable.TotalRows>rowLimit.Value)       {
                    var item =  Convert.ToInt32(Math.Ceiling((double) resultTable.TotalRows/rowLimit.Value));
                    result.Pages= new List<string>();
                    for(int i=0;i<item;i++)
                    {
                        result.Pages.Add((i +1).ToString());
                    }
                }
            }

            return result;            
        }

La clase ResultSearch tiene la siguiente definición:

public class ResultSearch{
public DataTable Result{get;set;}
public IList<string> Pages{get;set;}
}

La clase que devuelves tiene, por un lado los resultados que te devuelve la búsqueda, y por otro lado el número de páginas que tienes disponibles para realizar dicha búsqueda.

Conclusión

Muchas veces, cuando abordas una solución debes adaptarte al escenario que tiene disponible el cliente y, por mucho que ese escenario no sea el mejor posible, siempre tienes que buscar una solución que satisfaga al mismo. Lo bueno de SharePoint es que es una plataforma que te proporciona gran cantidad de API’s para poder cumplir estos objetivos.

En este artículo, has visto cómo sacarle partido al servicio de búsqueda utilizando la Api de búsqueda de servidor.

mm

Sobre Adrián Díaz

Adrián Díaz es Ingeniero Informático por la Universidad Politécnica de Valencia. Es MVP de Microsoft en la categoría Office Development desde 2014, MCPD de SharePoint 2010, Microsoft Active Profesional y Microsoft Comunity Contribuitor 2012. Cofundador del grupo de usuarios de SharePoint de Levante LevaPoint. Lleva desarrollando con tecnologías Microsoft más de 10 años y desde hace 3 años está centrado en el desarrollo sobre SharePoint. Actualmente es Software & Cloud Architect Lead en ENCAMINA.
Esta entrada ha sido publicada en busquedas y etiquetada como , . Enlace permanente .
Suscríbete a Desarrollando sobre SharePoint

Suscríbete a Desarrollando sobre SharePoint

Recibe todas las actualizaciones semanalmente de nuestro blog

You have Successfully Subscribed!

ENCAMINA, piensa en colores