Plantillas de índice en Elasticsearch: Cómo usar plantillas componibles

Explora cómo crear plantillas de índice componibles y de componentes en Elasticsearch para garantizar mappings consistentes y automatizar la configuración de la indexación.

Elasticsearch te permite indexar datos de manera rápida y flexible. Pruébalo gratis en el cloud o ejecútalo localmente para ver lo fácil que puede ser indexar.

Un índice de Elasticsearch puede configurar mediante mapeo, ajustes y alias: 

  • Las definiciones de mapeo especifican el esquema de datos.
  • Los ajustes ajustan el tamaño del fragmento y las frecuencias de refresco. 
  • Se emplean alias para dar nombres alternativos al índice.

Cuando indexamos un documento por primera vez o creamos un índice vacío usando la API Create Index, el índice se creará con la configuración predeterminada, sin esquema de datos y sin alias. Estos valores por defecto funcionan bastante bien en entornos de desarrollo y pruebas, pero puede que necesitemos personalizar nuestros índices para entornos de producción.

Trabajar con los mapeos y ajustes predeterminados en producción puede resultar en un índice y un rendimiento de búsqueda deficientes. Instanciar índices manualmente es un proceso tedioso y que consume mucho tiempo. Recrear tales índices en cualquier entorno es especialmente poco práctico si disponemos de un esquema de mapeo elaborado, así como de configuraciones y alias personalizados.

Por suerte, Elasticsearch nos proporciona una herramienta para aplicar automáticamente una configuración predefinida al crear índices en forma de plantillas de índices .

Plantillas de índice

Las plantillas de índice nos permiten crear índices con una configuración definida por el usuario. Un índice puede extraer la configuración de estas plantillas, por ejemplo un número determinado de fragmentos y réplicas o mapeos de campos, durante su instanciación. Se definirá una plantilla con un patrón de nombre y alguna configuración en él. Si el nombre del índice coincide con el patrón de nombres de la plantilla, el nuevo índice se creará con la configuración definida en la plantilla.

Elasticsearch mejoró su funcionalidad de plantillas en la versión 7.8 con plantillas componibles. Esta versión más reciente ofrece plantillas de índice mucho más reutilizables, como se demuestra en este artículo.

Tipos de plantillas de indexación

Las plantillas de índice pueden clasificar en dos categorías:

  • Plantillas de índice (o plantillas de índice composable): Las plantillas de índice componibles pueden existir por sí solas o estar compuestas por no tener o más plantillas componentes (ver la segunda categoría).
  • Plantillas de componentes: La plantilla de componentes es una plantilla reutilizable por sí sola que define la configuración requerida. Normalmente se espera que la plantilla de componentes esté asociada a una plantilla de índice. Cada una de las plantillas de componentes puede anexar con una o varias plantillas de índice. 

Como puedes ver en la imagen de abajo, las plantillas índice A y B comparten entre sí las plantillas de componentes (en este caso solo una, la Plantilla 3). Una plantilla de índice puede consistir en ninguna o muchas plantillas de componentes y cada una de las plantillas de componentes puede asociar a ninguna o a muchas plantillas de índice. Ambos tipos de plantillas pueden existir por separado, sin embargo, las plantillas de componentes no sirven a menos que estén adjuntas a una plantilla de índice.

La idea general es desarrollar un catálogo de plantillas de componentes para que una organización las emplee para diversas necesidades (por ejemplo, especificar las distintas plantillas de componentes para entornos individuales) y anexarlas a varios índices mediante las plantillas de índices componibles.

Cómo crear plantillas componibles (indexadas)

Elasticsearch proporciona un punto final _index_template para gestionar plantillas de índice. El usuario proporciona todos los mapeos, ajustes y alias necesarios junto con un patrón de nombres de índice en esta plantilla. Vamos a repasar un ejemplo de cómo crear una plantilla para una aplicación de microservicios client-order-service que es responsable de la lógica de generación de pedidos. 

Supongamos que nuestro requisito es crear una plantilla para pedidos de clientes, representada con un patrón que incluye comodines: *pedidos. Se espera que esta plantilla tenga ciertos mapeos y configuraciones, como el campo order_date, así como fragmentos y números de réplica.

Cualquier índice que se empareje con esta plantilla durante su creación hereda las configuraciones definidas en esta plantilla. Por ejemplo, un índice de black_friday_orders tendrá el campo order_date, los fragmentos se pondrán en 5 y las réplicas en 2. Además, todos los índices creados a partir de esta plantilla heredan también un único nombre de alias . Creemos este orders_template con un patrón de índice definido como *orders y con un esquema de mapeo que consiste en un solo campo de oder_date con un formato de fecha predefinido dd-MM-yyyy. El código que aparece a continuación muestra cómo crear esta plantilla de índice.

Cuando ejecutas esta consulta en DevTools de Kibana, la plantilla se crea con el patrón índice *orders junto con el mapeo predefinido, los ajustes y un alias. El index_patterns es una variedad de patrones de coincidencia; cualquier índice que coincida con este patrón derivará la configuración de la plantilla. Puedes ejecutar lo siguiente para recuperar la plantilla persistente que debería reiterar lo que hicimos:

También hay una prioridad, un número positivo, definido al crear el atributo de plantilla definido en la plantilla: cada plantilla se define con una prioridad para que cualquier cambio conflictivo de diferentes plantillas se resuelva usando este valor con precedencia dada al valor de mayor prioridad. A continuación profundizaremos en la prioridad de las plantillas.

Crear un índice con la plantilla

Ahora que tenemos una plantilla – un plano para crear índices – el siguiente paso es crear un índice. Cuando el nombre del índice coincide con el patrón dado, las configuraciones con plantilla se aplican automáticamente. Para demostrar el punto, como muestra el código de abajo, creemos un índice completamente nuevo llamado: blackfriday_orders:

Como el nombre del índice (blackfriday_orders) coincide con el patrón de nombres definido en la plantilla (es decir, *órdenes), el índice debería obtener todas las configuraciones derivadas de la plantilla. Recuperemos este índice recién creado y compruebemos si esto es realmente cierto ejecutando el siguiente código:

Esto debería volver:

Como indica la respuesta, la configuración del blackfriday_orders fue heredada de la plantilla. Podemos probar con varias combinaciones de los índices que hereden con éxito la configuración plantillada:

Sin embargo, los siguientes índices no heredarán la configuración ya que el nombre no coincidirá con el patrón:

Algo importante a recordar es que todos los índices derivados de una plantilla tienen el mismo alias – all_orders – en este caso. Existe un beneficio en tener este alias: podemos consultar simplemente con este único alias en lugar de en múltiples índices.

Aunque creamos una plantilla para *pedidos, se espera que cualquier índice coincidente adopte la configuración de la plantilla. Normalmente, consciente o inconscientemente, los equipos pueden crear algunas plantillas más por diversas razones. Esto significa que a veces el nombre del índice puede coincidir con dos patrones de plantilla diferentes. Elasticsearch tiene que decidir cuál de las configuraciones de esas plantillas debe aplicar. Afortunadamente, este dilema puede resolver usando la prioridad de la plantilla.

Cómo crear plantillas de componentes

Aprendimos sobre las plantillas de índice en la parte anterior de este artículo. Hay un par de desventajas al crear las plantillas con la configuración incorporada; una de ellas es que la configuración no es exportable para otras plantillas. Si queremos tener una configuración similar, por ejemplo para plantillas relacionadas con clientes (*clientes), puede que tengamos que recrear toda la plantilla. Eso significa que podemos estar creando docenas de ellos en una organización típica (además puede que tengas algunos más según los entornos).

Como siempre esperamos la reutilización, Elasticsearch rediseñó las plantillas teniendo en cuenta la reutilización. Las plantillas de componentes cumplen con ese requisito. Si vienes de un entorno DevOps, lo más probable es que tengas que crear índices con una configuración preestablecida para cada uno de los entornos. En lugar de aplicar manualmente cada una de estas configuraciones, puedes crear una plantilla de componentes para cada uno de los entornos.

Una plantilla de componentes no es más que un bloque reutilizable de configuraciones que podemos usar para crear más plantillas de índice. Ten en cuenta que las plantillas de componentes no tienen valor a menos que estén agrupadas con plantillas de índice. Se exponen a través de un punto final _component_template. Veamos cómo encaja todo esto.

Configuraciones en una plantilla de índice

Vamos a extraer los ajustes que definimos en nuestra plantilla de índice antes y crear una plantilla de componente a partir de ella. Se espera que el settings_component_template tenga cinco fragmentos principales con dos réplicas por fragmento principal. El primer paso, como muestra la lista de código a continuación, es declarar y ejecutar una plantilla de componente con esta configuración.

Como muestra el código anterior, usamos el punto final _component_template para crear una plantilla de componentes. El cuerpo de la solicitud contiene la información de la plantilla en un objeto plantilla. El settings_component_template ya está disponible para su uso en otras partes de las plantillas del índice. Una diferencia notable es que esta plantilla no define ningún patrón de índice; Simplemente es un bloque de código que configura algunas propiedades para nosotros.

Plantilla de mapeo

De la misma manera, creemos otra plantilla. Esta vez, extraigamos el esquema de mapeo que definimos antes en las plantillas de índice independientes. El código siguiente muestra el guion:

Plantilla de alias

Siguiendo el mismo flujo, también podemos tener una plantilla de componentes con los alias – dos alias (all_orders y sales_orders):

Plantilla de índice componible

Ahora que tenemos estas tres plantillas de componentes, el siguiente paso es ponerlas en práctica. Podemos hacerlo dejando que una plantilla de índice para, por ejemplo, christmas_orders, la emplee:

La etiqueta composed_of es una colección de todas las plantillas de componentes que conforman esta plantilla. En este caso, elegimos las plantillas de componentes de configuración, mapeo y alias. También estamos subiendo la prioridad, así que esta plantilla supera a cualquier otra. Una vez que la plantilla está lista, cualquier índice que coincida con el patrón *orders heredará la configuración de estas tres plantillas componentes.

Dicho esto, si deseamos crear una nueva plantilla, por ejemplo clientes, con solo una de las plantillas existentes (settings_component_template) y una nueva (aliases_component_template – ver más abajo), podemos hacerlo con:

La plantilla del índice es la siguiente:

¿Viste que el settings_component_template se ha (re)empleado en dos plantillas diferentes? Ese es el poder de las plantillas de componentes.

Prioridad de la plantilla de indexación

Existe la posibilidad de que los desarrolladores creen múltiples plantillas de índice sin mirar el stock existente. Es importante establecer una prioridad en cada una de estas plantillas para que se emplee la de mayor prioridad. Por ejemplo, el my_orders_template_1 anula la my_orders_template_2 en el siguiente fragmento de código:

Cuando tienes varias plantillas que coinciden con los índices que se están creando, Elasticsearch aplica todas las configuraciones de todas las plantillas coincidentes pero anula cualquier cosa que tenga mayor prioridad.

Precedencia de plantillas

Por último, puede que te preguntes por la precedencia de las plantillas: ¿la configuración definida en la plantilla de componentes anula la que aparece en la plantilla principal del índice? ¿O al revés? Bueno, hay algunas reglas:

  • Un índice creado con configuraciones tiene prioridad explícita sobre todo; esto significa que si creas un índice con configuración explícita, no esperes que las plantillas las sobreescriban.
  • Las plantillas heredadas (plantillas creadas antes de la versión 7.8) tienen una prioridad inferior a las plantillas componibles.

Resumen

  • Un índice contiene mapeos, configuraciones y alias: los mapeos definen el esquema de campos, los ajustes establecen los parámetros del índice como el número de fragmentos y réplicas, y los alias dan nombres alternativos al índice.
  • Las plantillas nos permiten crear índices con configuraciones predefinidas. Nombrar un índice con un nombre que coincida con el patrón de índice definido en una plantilla específica configurará automáticamente ese índice según la plantilla.
  • Elasticsearch introdujo plantillas de índice componibles en la versión 7.8. Las plantillas de índice componibles permiten modularidad y versionado de las plantillas.
  • Las plantillas componibles consisten en no tener o más plantillas de componentes.
  • Una plantilla de índice también puede tener su propia configuración definida.
  • Una plantilla de componente es una plantilla reutilizable con configuración predefinida, igual que una plantilla de índice componible.
  • Sin embargo, se espera que las plantillas de componentes formen parte de una plantilla de índice; No sirven de nada si no están "compuestas" en una plantilla de índice.
  • Las plantillas de componentes no tienen un patrón de índice definido, lo que es otra razón por la que se "espera" que formen parte de una plantilla de índice.
  • Cada una de las plantillas tiene una prioridad: un número positivo. Cuanto mayor sea el número, mayor es la precedencia para que se aplique esa plantilla.

Preguntas frecuentes

¿Qué son las plantillas de índice en Elasticsearch?

Son planos que aplican automáticamente configuraciones predefinidas (mappings, ajustes y alias) a nuevos índices. Cuando un nombre de índice coincide con el patrón de una plantilla (por ejemplo, *órdenes), hereda esa configuración automáticamente, lo que ahorra tiempo y garantiza la consistencia.

¿Cuál es la diferencia entre plantillas componibles y plantillas de componentes?

Las plantillas de componentes son bloques de construcción pequeños y reutilizables (como una configuración específica de "mapping" o "shard") que no tienen un patrón de índice. Las plantillas de índice componibles son las plantillas finales que tienen un patrón de índice y "componen" o agrupan varias plantillas de componentes juntas.

¿Cómo resuelve Elasticsearch los conflictos si una indexación coincide con varias plantillas?

Se utiliza un sistema de prioridades. A cada plantilla se le asigna un valor numérico de prioridad. Si una indexación coincide con varios patrones, la plantilla con el número de prioridad más alto tendrá preferencia y su configuración prevalecerá sobre las demás.

Contenido relacionado

¿Estás listo para crear experiencias de búsqueda de última generación?

No se logra una búsqueda suficientemente avanzada con los esfuerzos de uno. Elasticsearch está impulsado por científicos de datos, operaciones de ML, ingenieros y muchos más que son tan apasionados por la búsqueda como tú. Conectemos y trabajemos juntos para crear la experiencia mágica de búsqueda que te dará los resultados que deseas.

Pruébalo tú mismo