Categorías: busquedas

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.

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.

Compartir
Publicado por
Adrián Díaz

Este sitio web utiliza cookies para que tengas la mejor experiencia de usuario. Si continuas navegando, estás dando tu consentimiento para aceptar las cookies y también nuestra política de cookies (esperemos que no te empaches con tanta cookie 😊)