Febrero de 2017

Volumen 32, número 2

Puntos de datos: primer vistazo a Azure Search (tutorial para dispositivos portátiles)

Por Julie Lerman | Febrero de 2017

Julie LermanTuve curiosidad por Azure Search desde la primera vez que escuché hablar de este servicio a Pablo Castro, quien sabía que era uno de los creadores de Entity Framework y OData. Actualmente, es director de ingeniería de Microsoft y siempre ha sido un verdadero innovador y un genio excepcional en materia de datos. Su artículo de prensa sobre cómo Azure Search se convirtió en un proyecto de inicio en Microsoft es una lectura fascinante (bit.ly/2gzVFTQ).

Azure Search es un servicio que le permite usar el procesamiento y la inteligencia de Microsoft para agregar funcionalidades de búsqueda sofisticadas a sus propios datos. El servicio compila sus propios índices de búsqueda a partir de datos que proporciona y mantiene su propia "copia" de los datos en los que puede realizar búsquedas. Puede automatizar el proceso de actualización de los índices de Azure Search a medida que sus datos cambian, lo que aún resulta más fácil si su origen de datos es un almacén de datos de Azure, como DocumentDB.

Me resultó más fácil comprender los fundamentos de Azure Search explorando el servicio, que es lo que haré en este artículo, en lugar de intentar explicarlo solamente. Puede crear el servicio y los índices del código mediante REST u otras API, como la de cliente .NET. No obstante, también puede configurar las cosas visualmente en Azure Portal, que es por donde empezaré: crearé y consultaré un servicio Search gratuito en Azure Portal con un almacén de datos de muestra. Le guiaré en esta primera exploración y compartiré con usted algunos de mis descubrimientos. Con la comprensión que este primer paso proporciona, estará preparado para seguir indagando en las funcionalidades de los servicios y para empezar a interactuar con ellos mediante la API de REST o la API de cliente .NET.

Si tiene una suscripción a MSDN, ya tiene una suscripción a Azure y puede usarla para seguir adelante. Usaremos un servicio gratuito para evitar consumir sus créditos. Si no tiene actualmente ninguna suscripción a Azure, puede configurar una prueba gratuita rápidamente en azure.com/free.

Después de optar por agregar un nuevo recurso en Azure Portal, verá la opción Buscar en la categoría "Web y móvil", aunque, para mí, el camino más fácil es escribir "buscar" en el cuadro de búsqueda. (Es extremadamente metafísico, ¿no?) La configuración del servicio requiere que proporcione un nombre de servicio, que se convertirá en el primera parte de la URL. Usaré thedatafarm, con lo que obtengo la URL thedatafarm.search.windows.net. Como con cualquier recurso, debe optar por agregarlo a un grupo de recursos existente o crear uno nuevo. Al no tener aún nada más relacionado con mi servicio, creé un nuevo grupo de recursos que denominé datafarmsearchgroup en el este de EE. UU. La última información necesaria para configurar el recurso es seleccionar un plan de tarifa. Azure Search presenta un plan de tarifa gratuito que resulta ideal para probar el servicio. Permite 10 000 documentos, tres índices y 50 MB de almacenamiento sin escalado. Su suscripción le permite configurar un servicio de Search gratuito. Asegúrese de hacer clic en el botón Seleccionar después de elegir el nivel Gratis u obtendrá el nivel Estándar predeterminado. Averigüe como descubrí ese error.

Al hacer clic en Crear, Azure comprobará su configuración y, si todo se constata, el servicio debería tardar solo unos segundos en activarse.

Ahora que tiene un servicio, ¿qué va a buscar? En mi primer contacto con Azure Search, invertí mucho tiempo buscando un conjunto de datos idóneo para la búsqueda y, luego, descifrando cómo compartir los datos con mi servicio. Fue divertido, pero posteriormente, ojalá hubiese empezado con uno de los conjuntos de datos de ejemplo que Azure Search proporciona para estrenarme. Eso es precisamente lo que voy a hacer aquí.

Search no se ejecuta en los datos, sino en los índices de datos, y los índices se presentan en forma de documentos. Para los que somos usuarios de bases de datos relacionales, un índice se parece a una tabla, mientras que un documento es similar a una fila individual de una tabla, es decir, una sola unidad de datos. Por tanto, lo primero que debe hacer es crear un índice de los datos que quiere buscar. Los datos pueden proceder de distintos recursos. La creación de índices a partir de datos que residen en otro servicio de Azure es el camino más rápido, aunque el método más simple es hacerlo con los servicios de la misma suscripción que Search. Puede apuntar a una base de datos existente de Azure DocumentDB, Azure SQL Database o SQL Server que resida en una máquina virtual de Azure. Mientras escribo esto, la compatibilidad con Azure Table Storage y Blob Storage se encuentra en versión preliminar. Azure Search proporciona acceso a algunos datos de ejemplo creados previamente. Por tanto, en lugar de empezar haciendo clic en la opción Agregar índice, elija Importar datos, que también creará el primer índice por usted.

En la hoja Importar datos, que se muestra en la Figura 1, elija Muestras y, a continuación, los datos de realestate-us-sample. Al escribir hoy este artículo, esa es la única opción, pero pronto habrá más muestras. Por el icono puede ver que se trata de una base de datos de Azure SQL Database, de modo que creará un índice de documentos a partir de datos relacionales. Search transformará los datos en la estructura que necesita para la indexación. Este es un proceso de tres pasos. En primer lugar, se selecciona el origen de datos, luego se define el índice y, finalmente, se importan los datos en el índice.

Azure Search ya sabe cómo conectarse a los datos almacenados en Azure
Figura 1 Azure Search ya sabe cómo conectarse a los datos almacenados en Azure

Definir un índice

Después de seleccionar la muestra, el portal le presentará una cuadrícula con todos los campos descubiertos en el origen de datos de ejemplo. Este es el paso donde se define el índice, que en este caso el asistente del servicio ha predefinido por usted (Figura 2). Esta es su única oportunidad de ajustar el índice antes de importar los datos. La redefinición de un índice implica volver a importar los datos, lo que podría no ser deseable en un entorno de producción.

Primeras filas del índice predeterminado creado a partir de los datos de realestate-us-sample
Figura 2 Primeras filas del índice predeterminado creado a partir de los datos de realestate-us-sample

Un índice en Azure SQL Database o SQL Server puede corresponder solo a una tabla o una vista. Si usa un almacén de datos no relacionales como origen, Search comprende los gráficos completos que están almacenados en un documento o blob concreto. Por tanto, lo que ve aquí es de la tabla única de la base de datos. Existen 26 campos y la cuadrícula permite definir cómo se implicará cada uno de ellos en la búsqueda, mediante las opciones Recuperable, Filtrable, Ordenable, Clasificable y Buscable. Así, como puede ver, la búsqueda proporciona flexibilidad más allá de la simple escritura de un término de búsqueda. En la cuadrícula se incluyen columnas para definir cómo se usará el campo en la búsqueda. El asistente para índices ha seleccionado algunos valores predeterminados por usted.

Es posible que no necesite buscar en todos los campos. Por ejemplo, existen siete campos de descripción, uno en inglés y cada uno de los demás en un idioma diferente. Si la aplicación que usa este recurso solo la emplearán personas de Quebec y tiene previsto admitir solo búsquedas en francés e inglés, podría eliminar los otros cinco campos del índice de búsqueda. Para realizar esta acción en el portal, haga clic con el botón derecho en el campo y seleccione Eliminar.

La definición de índices exige reflexiones y planeamiento, pero yo solo llevaré a cabo las selecciones realizadas por la herramienta de importación. Dedique un poco de tiempo a observar la cuadrícula para comprender qué se define. Observe, por ejemplo, que los campos de descripción admiten búsquedas y se pueden recuperar, pero no filtrar ni ordenar. En cambio, los campos escalares simples, como los de pies cuadrados (ft²) y precio, se pueden ordenar y filtrar.

Uso de un indexador para importar los datos

Ahora que el índice está definido, puede continuar y extraer los datos. La definición del índice tendrá un impacto enorme en la manera de importar los datos. Recuerde que los datos se extraen en el índice en lugar de aplicar un índice a los datos. El tiempo necesario para esta operación dependerá del tamaño, la estructura y la ubicación de los datos, así como de la definición del índice. Por ejemplo, la indexación de siete campos de descripción diferentes tardará más tiempo que la indexación de solo dos.

Es posible que ya se esté preguntando qué sucede cuando los datos del origen de datos cambian. Azure Search tiene algunos mecanismos para actualizar el índice que, en muchos casos, es posible automatizar como parte de la definición del servicio Azure Search. Las reglas y los parámetros relacionados con la detección de cambios y el movimiento de datos varían según el origen de datos. Puede obtener más información al respecto en la documentación.

A continuación, el asistente le pedirá que cree un indexador. Un indexador es un rastreador (crawler) que lee los datos del origen de datos y rellena el índice de destino. Es lo que realiza la indexación inicial, además de actualizar el índice de acuerdo con una programación definida o a petición. Dado que elegí un origen de datos de Azure SQL Database, el asistente usará un indexador definido especialmente que sabe cómo rastrear una base de datos de Azure SQL Database. Como todos los recursos, el indexador necesita un nombre.  Denominé al mío defaultindexer, que no sería un procedimiento de nomenclatura recomendado, pero cumple con el objetivo de esta demostración.

Al hacer clic en Aceptar, se iniciará la indexación. El portal mostrará una notificación emergente para indicarle que se inició y que puede ver su progreso en la hoja del indexador. Mi importación se realizó tan rápido que, cuando miré, ya se había completado. En la Figura 3, me desplacé hacia abajo por la página de la hoja del servicio de Search thedatafarm. Como puede ver, el cuadro Indizadores está resaltado y, al hacer clic en él, la hoja Indizadores se abrió a la derecha e indica que defaultindexer terminó su trabajo y creó 4959 documentos de búsqueda a partir del origen de datos.

La hoja de indexador de mi servicio de Search muestra el estado de la importación de datos
Figura 3 La hoja de indexador de mi servicio de Search muestra el estado de la importación de datos

Extraer del repositorio documentos que se pueden buscar

El índice ya está listo para la búsqueda. El explorador de búsqueda es un buen método para tantear la búsqueda, así como para probar las búsquedas directamente antes de implementarlas en el código. Si ha trabajado con OData en alguna ocasión, podrá observar que la manera en que expresa el filtrado, la ordenación y la paginación usa la sintaxis de OData. La búsqueda en sí se puede realizar mediante una de las dos sintaxis de consulta. La sintaxis predeterminada se conoce como una sintaxis simple y la otra es la sintaxis de consulta de Lucene.

Para su primera búsqueda, le recomiendo que simplemente haga clic en el botón Buscar sin indicar nada en el campo Cadena de consulta. Esta acción devolverá todos los datos, aunque se presentarán en bloques de 50 páginas cada vez. Al ser este un origen de datos desconocido, vale la pena echarle un vistazo. También permite tantear la estructura de los datos.

Los resultados comienzan con un encabezado que describe el índice. Toda la matriz de documentos se encapsula en una etiqueta "value" y cada documento empieza por un valor de puntuación de búsqueda y, luego, cada campo se muestra con su valor.

Combinación de Search con el recuento y el filtro OData

Para la segunda búsqueda, usaremos un procedimiento de búsqueda simple. Escriba condominium en el campo Cadena de consulta y haga clic en Buscar. Observe que el URI termina con &search=condominium.

De manera predeterminada, Azure Search devolverá datos paginados con 50 documentos cada vez, pero es bastante difícil ver qué se obtiene aquí. Vamos a agregar un parámetro de OData para solicitar el recuento. Dado que ahora usa varios parámetros, deberá especificar que condominium forma parte de una búsqueda. Esta es la cadena de consulta:

$count=true&search=condominium

Ahora, en los resultados, que se muestran en la Figura 4, después de la descripción del índice y antes de la enumeración del primer valor, puede observar que el recuento de los resultados es de 399 documentos. La búsqueda se realizó en todos los campos definidos para ello en el índice y devolvió un recuento de todos los documentos donde encontró la cadena "condominium" y, a continuación, los 50 primeros de los 399 documentos coincidentes. Si se desplaza hasta el final, observará que se incluye un URI para ayudarle a recuperar los 50 documentos siguientes. Este es un patrón que reconocerá si ya trabajó antes con OData.

Principio de un conjunto de resultados de una consulta con $count de OData en la solicitud; el recuento forma parte de la raíz de resultados
Figura 4 Principio de un conjunto de resultados de una consulta con $count de OData en la solicitud; el recuento forma parte de la raíz de resultados

Para buscar en el panel de resultados, asegúrese primero de que el cursor esté en algún punto de los resultados y, a continuación, use el comando de búsqueda del explorador (por ejemplo, Ctrl+F). Aparece un cuadro de búsqueda especial claramente diferente al cuadro de búsqueda del explorador. Escriba condominium y haga clic en los resultados de la búsqueda. Verá aparecer la palabra en los campos de descripción y etiqueta, y quizás en otros, pero yo solo observé unos pocos.

Recuerde que algunos campos estaban definidos en el índice para que pudieran filtrarse. Modifique la consulta para agregar un filtro para enumeraciones de tres dormitorios; en otras palabras, donde el campo beds sea tres. Filter es un parámetro de OData y tiene que ir precedido de un signo de dólar. Esta es la nueva cadena de consulta con la sintaxis de OData para el filtrado:

$count=true&search=condominium&$filter=beds eq 3

El recuento indica que hemos bajado a 73 documentos.

En este punto, empecé a tener una idea mejor sobre cómo podía definir mi índice, algo que podía estar fuertemente influenciado por el objetivo que usted había marcado para su aplicación. Puede tener distintas aplicaciones que acceden al mismo almacén de datos, pero que requieren diferentes funcionalidades u otros datos en los resultados. Con Azure Search, puede compilar índices diferentes para satisfacer las distintas necesidades y, dado que cada índice tiene su propio conjunto de datos, las aplicaciones no tendrán conflictos entre sí por los recursos, lo que podría afectar negativamente al rendimiento.

Me gusta poder visualizar con qué estoy trabajando. Al iniciar mi formación en Azure Search a través del portal, podía visualizar el índice y los resultados. También podía probar las consultas. Con toda esta experiencia en mi haber, tengo más confianza para probar Azure Search en una aplicación mediante el cliente .NET o simplemente ejecutando consultas directamente con REST. Puedo usar mis propias bases de datos u otros datos de ejemplo. Un experimento que ya realicé fue el de importar datos del conjunto de datos públicos compartido por el Museo de Cooper-Hewitt en bit.ly/2hrOCej. Cargué un conjunto de documentos JSON del conjunto de datos de sus objetos en una base de datos de Azure DocumentDB y, luego, compilé un servicio de Search y un índice a partir de este. Después de este proyecto, descubrí que una de las aplicaciones de ejemplo del equipo de Azure había tomado una dirección similar usando los datos disponibles públicamente en la Galería Tate. Puede jugar con su demo en bit.ly/2gxoHQL para conocer mejor las funcionalidades de Azure Search, como, por ejemplo, el uso de la navegación por facetas. (Las facetas son otra opción de configuración para definir un índice). La muestra usa JavaScript e interactúa con Azure Search directamente a través de los URI, de modo que observar el código en GitHub (bit.ly/2gI1ej9) no solo es educativo, sino que también ofrece una vista impresionante de lo simple que puede ser su propia lógica, ya que Azure Search se encarga de todo el trabajo pesado por usted.

Espero que este primer contacto con Azure Search le ayude a superar cualquier temor inicial de que sea un servicio intenso y abrumador destinado solo a expertos en Azure avanzados. El objetivo de Azure es encargarse del trabajo duro, para que no tenga que hacerlo usted. Azure Search es un excelente ejemplo de ello, ya que se encarga de la difícil parte de agregar funcionalidades de búsqueda a sus aplicaciones.


Julie Lerman es una Microsoft MVP, mentora y consultora de .NET que vive en las colinas de Vermont. Puede encontrarla haciendo presentaciones sobre el acceso a datos y otros temas de .NET a grupos de usuarios y en conferencias en todo el mundo. Su blog es thedatafarm.com/blog y es la autora de "Programming Entity Framework", así como de una edición de Code First y una edición de DbContext, de O’Reilly Media. Sígala en Twitter en @julielerman y vea sus cursos de Pluralsight en juliel.me/PS-Videos.

Gracias al siguiente experto técnico de Microsoft por revisar este artículo: Pablo Castro
Pablo es arquitecto de software del grupo de datos de Microsoft. Actualmente, es el director de ingeniería de Azure Search, un producto de búsqueda como servicio de escala global, que forma parte de la plataforma en la nube de Azure.