El próximo jueves se celebrará un evento sobre Windows 10: el Hel10, en el que mi compañero Santiago Porras y un servidor, daremos una sesión sobre cómo utilizar el proyecto Oxford dentro del desarrollo de Aplicaciones Universales de Windows 10. Para complicar un poco más la sesión (lo que nos gusta), hemos incorporado el servicio de búsqueda que nos proporciona Azure: el Azure Search.
¿Qué es?
Es un servicio en la nube que nos permite utilizar la búsqueda dentro de nuestras aplicaciones, bien a través de un SDK o de una API. Está basado en la librería de .NET Lucene. Como todo buen buscador, dispone de una serie de características avanzadas como: mostrar las sugerencias anticipadas, filtro por categorías, etc.
Además al hacer uso de una plataforma Cloud, nos beneficiamos de ventajas como, por ejemplo, el escalado del servicio basado en la posibilidad de aumentar la capacidad de búsqueda o de almacenamiento según las necesidades del cliente. Este servicio trata de simplificar la creación de webs basados en búsqueda.
¿Qué posibilidades hay?
Dentro de Azure tenemos la posibilidad de tener un servicio gratuito y otro de pago.
Con el servicio gratuito tenemos las siguientes características:
- 10.000 Documentos Almacenados
- 3 Indices de búsqueda
- 50 MB de Almacenamiento
- No hay posibilidad de escalado
- Ubicado en un WebSite Compartido
Dentro del servicio de pago tenemos las siguientes características:
- 15.000.0000 Documentos Almacenados
- 50 Indices
- 25 Gb de Almacenamiento
- Posibilidad de escalado hasta 36 maquinas
- WebSiteDedicado
También hay posibilidad de incorporar integración con otro elemento de Azure como la Base de Datos NO SQL: Document DB.
¿Cómo utilizarlo en nuestros desarrollos de C#?
Partimos de la base de que ya tenemos creado el servicio de búsqueda dentro de nuestro portal de Azure. ¡OJO! El servicio de búsqueda solo está disponible desde el nuevo Portal. Para este ejemplo nos vamos a crear una Aplicación de Consola.
Abrimos Visual Studio -> New Project -> C# -> Console Aplication.
A continuación, instalamos el paquete Nuget de AzureSearch, que de momento solamente está en Prerelease.
Para empezar a utilizar el servicio de búsqueda, tenemos que poner instanciar el objeto SearchServiceClient indicando como parámetros el nombre de nuestro servicio y la APIKey que necesitamos para poder utilizarla.
var serviceClient=new SearchServiceClient(searchServiceName,new SearchCredentials(apiKey)); var indexClient= serviceClient.Indexes.GetClient(index);
Una vez ya tenemos la referencia a nuestro servicio, lo primero que tenemos que hacer es crearnos un índice y la estructura de campos que van a tener todos los elementos que se van a buscar en el mismo. El código necesario es el siguiente:
public bool CreateIndex(string nameIndex, Field[] field) { var definition = new Index() { Name = nameIndex, Fields= field }; var result= serviceClient.Indexes.Create(definition);
Donde la variable field puede ser así:
var field= new[] { new Field("Id",DataType.String) { IsKey = true }, new Field("Url", DataType.String) { IsSearchable = true, IsFilterable = true }, new Field("Nombre", DataType.String) { IsFilterable = true, IsSortable = true }, new Field("Categoria", DataType.String) { IsSearchable = true, IsFilterable = true, IsSortable = true, IsFacetable = true } };
Una vez ya tenemos el índice creado, el siguiente paso es agregar documentos para buscar. Partiendo del ejemplo anterior, añadiremos los siguientes elementos:
indexClient.Documents.Index(IndexBatch.Create(documents.Select(doc => IndexAction.Create(doc))));
Donde la variable documents puede ser una variable como la siguiente:
var documents = new Base[] { new Base() { Id="1", Nombre="Alberto Diaz", Categoria="MVP", Url="https://mvp.microsoft.com/en-us/PublicProfile/Photo/4030767" }};
Ahora nos queda realizar consultar sobre el servicio de búsqueda:
public ICollection<Helo10.Azure.Search.Base> Search(string query) { var resultSearch = new Collection<Base>(); var searchParameters = new SearchParameters(); DocumentSearchResponse<Helo10.Azure.Search.Base> response = indexClient.Documents.Search<Helo10.Azure.Search.Base>(query, searchParameters); foreach (var result in response) { resultSearch.Add(result.Document); } return resultSearch; }
En caso de que queramos eliminar el índice existente, también podemos hacerlo:
public bool DeleteIndex(string nameIndex) { if (serviceClient.Indexes.Exists(nameIndex)) { var result= serviceClient.Indexes.Delete(nameIndex); return (result !=null); } return true; }
¿Cuándo utilizarlo?
Es el servicio perfecto para desarrollos personalizados donde hay que añadir pequeñas capacidades de búsqueda. Por ejemplo, dentro de nuestro producto ENCAMINAMedia (además de otros servicios de Azure), hemos utilizado el Azure Search para todas las búsquedas de la aplicación. Es decir, tenemos una aplicación que necesitamos enriquecerla con las características de los buscadores enterprise.
Conclusión
Azure es una plataforma con muchos servicios y con muchas novedades. Desde el punto de vista de un desarrollador, uno de los aspectos positivos es que nos proporciona muchas utilidades para poder enriquecer nuestras Apps. En este caso concreto, mediante el Azure Search.