<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title><![CDATA[Operaciones - Elasticsearch Labs]]></title>
    <description><![CDATA[Articles and tutorials from the Search team at Elastic]]></description>
    <copyright><![CDATA[© 2026. Elasticsearch B.V. All Rights Reserved]]></copyright>
    <image>
      <title><![CDATA[Operaciones - Elasticsearch Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1121c0bf0e8a6e65/6a88da6340a1841030ef456f/search-labs-thumbnail.png</url>
      <link>https://www.elastic.co/es/search-labs/blog/category/operations</link>
    </image>
    <link>https://www.elastic.co/es/search-labs/blog/category/operations</link>
    <atom:link href="https://www.elastic.co/es/search-labs/rss/category/operations.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[es]]></language>
    <lastBuildDate>Tue, 29 Sep 2026 02:09:47 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Búsqueda con IA de agentes y barreras de protección determinísticas en Elasticsearch para una ejecución segura de consultas]]></title>
    <description><![CDATA[Los sistemas de búsqueda con IA de agentes suelen fallar cuando los LLM generan consultas directamente. Aprende cómo las barreras de protección deterministas y la arquitectura de plano de control permiten una ejecución de consultas segura, fiable y regulada con Elasticsearch.]]></description>
    <content:encoded><![CDATA[<p><a href="https://www.elastic.co/search-labs/blog/agentic-ai-search-deterministic-guardrail-query-execution">En las partes 1 a 7</a> de esta serie se describió un plano de control regulado para la búsqueda en el comercio electrónico. Un usuario introduce una consulta. El plano de control clasifica la intención, impone restricciones de negocio, resuelve conflictos de políticas y enruta a la estrategia de recuperación apropiada, todo antes de que se consulte el catálogo de productos. Toda la arquitectura asume que la entrada es un texto de búsqueda que ha escrito un comprador humano.</p><p>En esta última publicación nos preguntamos: ¿Qué cambia cuando la entrada proviene de un agente de IA?</p><p>La respuesta es que la arquitectura no cambia, pero las implicancias sí. Cada propiedad del plano de control regulada que es relevante para las consultas de autor humano es <em>más</em> importante cuando quien toma decisiones en sentido ascendente es un modelo de lenguaje grande (LLM). El determinismo, la auditabilidad, la resolución de conflictos y la aplicación de restricciones se convierten en medidas de seguridad fundamentales, en vez de simples comodidades operativas, ya que el sistema que genera los datos de entrada es de naturaleza probabilística.</p><h2>El problema de la búsqueda con agentes</h2><p>El enfoque más común para la búsqueda impulsada por IA es sencillo: proporciona al LLM el esquema de base de datos y las reglas de negocio en la indicación, y deja que el agente genere la consulta directamente.</p><p>Para un chatbot de comercio electrónico, esto significa inyectar el mapeo del índice, los tipos de campos, las taxonomías de categorías, la lógica de precios y las restricciones de negocio de Elasticsearch en la ventana de contexto del agente, y luego pedir al LLM que traduzca el lenguaje natural a un DSL de búsqueda de Elasticsearch válido. El LLM se convierte en el autor de la consulta.</p><p>Este enfoque funciona en demostraciones. Sin embargo, falla en producción por cuatro razones.</p><h3>Exceso de contexto</h3><p>El mapeo de índices de comercio electrónico empresarial no es un documento trivial. Las definiciones de campo, los objetos anidados, las configuraciones de varios campos y la configuración del analizador pueden ejecutarse en miles de tokens antes de que se agregue cualquier lógica de negocio. Además del mapeo, el agente necesita taxonomías de categorías (que en el comercio electrónico empresarial pueden contener decenas de miles de valores), reglas de precios, jerarquías de marcas, restricciones de elegibilidad y lógica de campañas.</p><p>El resultado es una ventana de contexto en la que predominan los metadatos estructurales en vez de la intención real del usuario. Esto aumenta la latencia, incrementa el costo de los tokens y reduce la capacidad del LLM para seguir instrucciones a medida que aumenta el contexto. Este es un fenómeno bien documentado, a veces llamado <a href="https://www.trychroma.com/research/context-rot"><em>descomposición de contexto</em></a>: a medida que el mensaje se hace más largo, la atención del modelo a cualquier instrucción particular se debilita.</p><h3>Alucinación probabilística</h3><p>Los LLM generan consultas basadas en patrones en sus datos de entrenamiento y el contexto proporcionado. Cuando se le solicita al modelo que genere un DSL de consulta de Elasticsearch, este puede inventar nombres de campos inexistentes, elaborar cláusulas de consulta sintácticamente inválidas, aplicar de forma errónea tipos de filtro a campos equivocados o generar consultas que son sintácticamente válidas pero semánticamente incorrectas, por lo cual arroja resultados que no coinciden con la intención del usuario.</p><p><a href="https://cloud.google.com/blog/products/databases/how-to-get-gemini-to-deeply-understand-your-database">La prueba de rendimiento BIRD</a> de Google Cloud para la conversión de texto a SQL muestra los límites de este enfoque. El resultado de vanguardia de un solo modelo de Google alcanzó entre un 70% y un 80% de precisión, lo que significa que casi una de cada cuatro consultas generadas era incorrecta. Esto es para SQL, que está mucho más estandarizado que Elasticsearch Query DSL. La tasa de error para consultas de Elasticsearch generadas por LLM en un entorno de producción real, con mapeos complejos y semántica específica del negocio, probablemente sería mayor.</p><p>Una tasa de error de una de cada cuatro consultas en un sistema de comercio electrónico que es fundamental para los ingresos no es un problema de ajuste que deba resolverse de forma iterativa. Es una limitación arquitectónica del enfoque.</p><h3>La brecha de seguridad</h3><p>Cuando el LLM tiene acceso al esquema de la base de datos y actúa como el autor de la consulta, el sistema es vulnerable a la inyección indirecta de indicaciones. Un usuario que interactúa con un chatbot de comercio electrónico puede crear entradas diseñadas para manipular al agente y que genere consultas no intencionadas.</p><p>No se trata de un riesgo teórico. La <a href="https://www.elastic.co/blog/owasp-top-10-for-llms-guide">inyección de indicaciones</a> es una de las superficies de ataque que más se investiga de forma activa en sistemas de MLM desplegados. El problema fundamental es que, cuando el agente crea la consulta, no hay una separación clara entre la intención del usuario y la ejecución de la consulta. El LLM interpreta la solicitud del usuario y, al mismo tiempo, crea la operación de la base de datos. Cualquier manipulación de la primera afecta directamente a la segunda.</p><h3>Fallo de escalado de alta cardinalidad</h3><p>Ciertos campos del comercio electrónico tienen una cardinalidad extrema. Un catálogo de productos puede tener 17 000 valores de categoría, miles de marcas y cientos de combinaciones de atributos. Los flujos de trabajo estándar de los agentes requieren inyectar estos valores en el contexto para que el LLM pueda seleccionar el correcto al construir una consulta.</p><p>Esto crea un dilema imposible: se inyectan todos los valores posibles (consumiendo un contexto enorme y degradando el rendimiento), se inyecta un subconjunto (y se acepta que el agente no puede hacer referencia a valores fuera de ese subconjunto) o se recurre a una búsqueda no regulada. Esto se conecta directamente con el problema principal de la <a href="https://www.elastic.co/search-labs/blog/ecommerce-search-governance-improve-retrieval">Parte 1</a>: si el LLM busca “naranjas” y Elasticsearch devuelve refresco de naranja, la experiencia de chat se degrada de la misma manera que lo hace una experiencia de búsqueda.| La ausencia de gobernanza significa que el sistema no puede aplicar la resolución prevista por el comprador.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt14a980ba09d88ee8/6a16f34d66c4f98516f8bd97/f11c44feb5291002d4ec4ac79484ea39d4e48a95-642x133.png" alt="Un diagrama de flujo muestra la solicitud de usuario &quot;Quiero hacer una bebida refrescante...&quot;, la cual conduce a una salida LLM de “naranjas”, seguida de un servidor de aplicaciones que envía una consulta de texto para naranjas a un catálogo de productos, terminando con resultados que muestran mermelada, naranjas enteras y refresco de naranja." /><p>Recuperar valores relevantes que estén dinámicamente basados en la consulta es una alternativa conocida, pero introduce un paso adicional no determinista donde la recuperación en sí puede omitir valores relevantes. Además, esto agrega latencia y complejidad a cada consulta.</p><h2>La alternativa arquitectónica: desacoplar la intención de la ejecución</h2><p>El plano de control regulado descrito en las Partes 1 a 7 ofrece un enfoque totalmente diferente. En vez de que el LLM elabore la consulta final, su papel se reduce a una sola tarea bien delimitada: extraer un texto de intención de búsqueda de la entrada de lenguaje natural del usuario.</p><p>El usuario dice: "Estoy buscando zapatos marrones baratos". La función del agente no es generar una consulta de Elasticsearch. Su función es extraer y transmitir la intención de búsqueda (en este caso, algo como "zapatos marrones baratos") al plano de control. Entonces, el plano de control hace lo de siempre: filtra la intención de texto por las políticas almacenadas, compone las políticas coincidentes mediante transformaciones en cascada, resuelve los conflictos de forma determinista y produce una consulta de Elasticsearch controlada.</p><p>El LLM nunca ve el mapeo de índice. Nunca sabe sobre tipos de campos, taxonomías de categorías o umbrales de precios. Nunca construye una cláusula de consulta. Opera en el lado del lenguaje natural de un límite arquitectónico que llamamos el <em>espacio aéreo de metadatos</em>, una separación estricta entre el componente probabilístico (el LLM) y la capa de datos estructurados (esquema, políticas y construcción de consultas).</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb4d701bfa4f2f279/6a16f34e1949f70ddce7a78d/12dacc77f0c481c9ada84725eff370c7e2c4b429-642x143.png" alt="Un diagrama de flujo muestra la solicitud del usuario, &quot;Quiero preparar una bebida refrescante...&quot;, que lleva a una salida LLM de &quot;naranjas&quot;, seguida de un servidor de aplicaciones que envía la consulta a un plano de control y luego recibe una consulta reescrita, que se emplea para realizar una consulta de texto para naranjas en la categoría Frutas, finalizando con una búsqueda de producto que devuelve imágenes de naranjas." /><h3>Lo que proporciona el aislamiento de metadatos</h3><ul><li><p><strong>Ceguera de esquema.</strong> El LLM no tiene acceso al esquema de la base de datos y, por lo tanto, no puede generar consultas inválidas, alucinar nombres de campo ni ser manipulado para exponer información estructural. El esquema existe solo en el lado determinista del aislamiento.</p></li><li><p><strong>Contexto mínimo.</strong> En vez de miles de tokens de datos de mapeo, reglas de negocio y taxonomías de categorías, la indicación del LLM contiene solo instrucciones de extracción de persona e intención. Esto reduce drásticamente el costo de tokens, la latencia y la degradación del contexto.</p></li><li><p><strong>Ejecución determinista.</strong> Cada consulta que llega a Elasticsearch está construida por el plano de control usando plantillas de políticas controladas por humanos, no generadas probabilísticamente por un LLM. La validez sintáctica está garantizada. La corrección semántica se aplica mediante el mismo marco de políticas descrito en las Partes 1 a 6.</p></li><li><p><strong>Seguridad por arquitectura.</strong> La inyección inmediata deja de ser eficaz desde el punto de vista estructural. Incluso si un usuario manipula al agente para que produzca un texto de intención inusual, ese texto se filtrará por las políticas almacenadas. Si ninguna política coincide, no se genera ninguna consulta. El usuario no puede pedirle al agente que cree una consulta porque el agente no crea consultas. El plano de control lo hace, y el plano de control es determinista.</p></li></ul><h2>Cómo se conectan las piezas</h2><p>El siguiente recorrido muestra cómo el plano de control regulado maneja una consulta mediada por agente.</p><h3>Paso 1: El usuario habla con el agente</h3><p>Un comprador que interactúa con un chatbot de comercio electrónico dice: "Estoy buscando chocolate barato, nada con maní."</p><h3>Paso 2: El agente extrae la intención</h3><p>La función del LLM es extraer intenciones, no generar consultas. Con un prompt mínimo que le indica identificar la intención del producto, el agente produce un texto de intención de búsqueda: "chocolate barato sin maní".</p><p>Esta es una tarea de clasificación sencilla. El LLM no necesita el mapeo de índice, la taxonomía de categorías ni las reglas de precios para realizarlo. Necesita entender el lenguaje natural, que es precisamente la fortaleza de los LLM.</p><h3>Paso 3: El plano de control regula la consulta</h3><p>El texto de intención "chocolate barato sin maní" se pasa al plano de control, que lo filtra por el índice de políticas. Tres políticas coinciden:</p><ul><li><p>La política de "barato" (extrae "barato", aplica un filtro de precio basado en la categoría del producto).</p></li><li><p>La política de "chocolate" (limita los resultados a categorías de chocolate).</p></li><li><p>La política de negación "sin" (extrae el objetivo de exclusión y aplica un filtro <code>must_not</code> )</p></li></ul><p>El plano de control aplica estas políticas mediante la misma transformación en cascada descrita en la <a href="https://www.elastic.co/search-labs/blog/ecommerce-search-governance-control-plane-architecture">Parte 3 y la Parte</a> <a href="https://www.elastic.co/search-labs/blog/elasticsearch-percolator-search-governance">4</a>: orden de prioridad, resolución de conflictos por campo, seguimiento de frases consumidas. Si una política de “campaña navideña” también está activa, se compone con las políticas del producto exactamente como se describe en <a href="https://www.elastic.co/search-labs/blog/ecommerce-search-governance-control-plane-architecture">Parte 3,</a> la participación del agente no cambia el modelo de gobernanza en absoluto.</p><h3>Paso 4: Se ejecuta la consulta regulada</h3><p>El plano de control produce una consulta de Elasticsearch completamente regulada: una búsqueda de “chocolate”, limitada a las categorías adecuadas, con un límite de precio derivado de la política “barato”, un filtro de exclusión para productos que contienen maní y cualquier impulso activo de campaña aplicado. Si la política de “chocolate” también incluye pesos de optimización económica (<a href="https://www.elastic.co/search-labs/blog/ecommerce-search-optimization-query-governed">Parte 7</a>), estos también se aplican. El aumento de margen está establecido en 3.0x porque “chocolate” es una consulta de navegación donde el minorista se beneficia de promover productos de mayor margen. Si el comprador tiene historial de compras (<a href="https://www.elastic.co/search-labs/blog/elasticsearch-personalized-search-governed-ecommerce">Parte 6</a>), las señales de personalización se superponen. Esta consulta es sintácticamente válida por construcción y semánticamente correcta por diseño de políticas.</p><h3>Paso 5: Los resultados se envían a través del agente</h3><p>Los resultados del producto se arrojan al agente, que los presenta de forma conversacional al usuario. El papel del agente en la ruta de retorno es la presentación: formatear resultados, responder preguntas de seguimiento, proporcionar detalles del producto. La recuperación en sí fue regulada, determinista y explicable.</p><h2>En qué es bueno el agente (y en qué no lo es)</h2><p>Esta arquitectura aprovecha las fortalezas del LLM y protege al sistema de sus debilidades.</p><p>Los LLM sobresalen en la comprensión de la intención del lenguaje natural. “Estoy buscando chocolate barato, nada con maní” es una tarea de comprensión del lenguaje natural, análisis de intención, identificación de referencias de productos, reconocimiento de negación. Los LLM gestionan esto de forma fiable porque es un problema de clasificación, no de generación. La salida es un texto corto de intenciones, no una consulta estructurada y compleja.</p><p>A los modelos de lenguaje grande (LLM) les cuesta generar salidas estructuradas con precisión bajo restricciones complejas. La generación de una DSL de consulta de Elasticsearch válida requiere nombres de campo exactos, anidación correcta de cláusulas, tipos de filtro adecuados para cada campo y una aplicación coherente de reglas de negocio en miles de casos límite. Estas son exactamente las propiedades que un sistema determinista impone de forma trivial y que un sistema probabilístico impone de forma poco fiable.</p><p>El plano de control regulado coloca cada componente donde corresponde: el LLM en el lado del lenguaje natural, el motor de políticas deterministas en el lado de construcción de consultas, y un límite arquitectónico entre ellos.</p><h2>La gobernanza limita el alcance del impacto</h2><p>Esta es la misma información de la <a href="https://www.elastic.co/search-labs/blog/ecommerce-search-governance-control-plane-architecture">Parte 3</a>, extendida al contexto agente. En la Parte 3, observamos que la gobernanza hace que la recuperación semántica sea más segura, ya que reduce el conjunto de candidatos antes de que comience la recuperación. Una búsqueda semántica sobre 500 productos en una categoría regulada es una propuesta muy diferente a una búsqueda semántica sobre 500 000 SKU.</p><p>El mismo principio se aplica a las consultas mediadas por agentes. Sin gobernanza, un agente que malinterprete "chocolate barato" podría generar una consulta que realice una búsqueda en todo el catálogo sin restricciones de precio, sin filtro de categoría y sin exclusiones. Con gobernanza, incluso si el agente produce un texto de intención imperfecto, el plano de control restringe la consulta a las políticas que coinciden. El peor caso es que se activen menos políticas, no que una consulta sin límite acceda al catálogo de productos.</p><p>La gobernanza reduce el alcance de los errores probabilísticos. Esto es cierto tanto si el componente probabilístico es un modelo de recuperación semántica como un agente LLM.</p><h2>Políticas sugeridas por LLM: ampliar la cobertura</h2><p><a href="https://www.elastic.co/search-labs/blog/ecommerce-search-governance-zero-deploy">La Parte 2</a> presentó la idea de que un LLM puede sugerir nuevas políticas que ingresen en el mismo pipeline Author → Test → Promote que las de autoría humana. En el contexto de agentes, esto se convierte en un ciclo de retroalimentación poderoso.</p><p>Un LLM puede analizar registros de consultas, identificar patrones donde el plano de control no tiene una política coincidente (consultas que llegan a la recuperación sin modificaciones) y sugerir nuevas políticas para cubrir esas brechas. Un comerciante revisa cada sugerencia, la prueba y la promueve si produce el comportamiento esperado. El modelo de gobernanza asegura que ninguna política sugerida por LLM llegue a producción sin validación humana.</p><p>Con el tiempo, esto crea un ciclo virtuoso: la cobertura de políticas del plano de control se expande, la proporción de consultas que requieren una recuperación sin modificar se reduce, y el sistema se vuelve cada vez más regulado, con cada política auditable, versionada e individualmente reversible.</p><h2>El patrón general: barreras de seguridad deterministas para sistemas probabilísticos</h2><p>La arquitectura descrita en este serial, un plano de control determinista situado entre una fuente de entrada probabilística y un sistema de recuperación de datos, no es específica de la búsqueda en el comercio electrónico. El mismo patrón se aplica siempre que un agente de IA necesite interactuar con datos estructurados.</p><p>Un agente que consulta una base de datos SQL se enfrenta a los mismos desafíos: exceso de contexto por inyección de esquemas, nombres de columnas alucinados, riesgos de inyección inmediata y selección de valores de alta cardinalidad. Un agente que trabaja con un sistema de gestión de incidencias como Jira, un sistema de gestión de relaciones con los clientes (CRM) como Salesforce o un repositorio de código como GitHub se enfrenta a problemas similares. En todos los casos, la pregunta arquitectónica del núcleo es la misma: ¿Debe el LLM crear la consulta, o debe el LLM extraer la intención y pasarla a una capa determinista que crea la consulta?</p><p>El plano de control regulado proporciona una respuesta repetible a esa pregunta. Las políticas son datos. La función del LLM es extraer intenciones. El plano de control se ocupa de desarrollar consultas. El espacio de metadatos los mantiene separados. Y el marco de trabajo (orden de prioridad, resolución de conflictos, transformaciones en cascada, auditabilidad) asegura que la capa determinista sea operacionalmente manejable a medida que aumenta el número de políticas.</p><h2>Conclusión</h2><p>Los patrones de gobernanza de búsqueda en comercio electrónico descritos en este serial (políticas como datos, el flujo de trabajo Author → Test → Ascender flujo de trabajo, transformaciones en cascada, resolución de conflictos por campo, coincidencia inversa basada en filtro y respaldo multinivel) se diseñaron para un mundo donde el comerciante redacta políticas y el cliente tipifica consultas. Pero la arquitectura tiene más potencial que su caso de uso inicial.</p><p>Cuando la fuente de entrada es un agente de IA en vez de un comprador humano, el plano de control regulado se convierte en la capa de seguridad fundamental entre un sistema probabilístico y un almacén de datos de producción. Ofrece las garantías determinísticas (validez sintáctica, corrección semántica, auditabilidad y seguridad) que necesitan los sistemas empresariales y que los modelos de lenguaje grande (LLM) no pueden ofrecer por sí solos.</p><p>El plano de control determinista no reemplaza al agente de IA. Hace que el agente de IA sea seguro para desplegar.</p><h2>Pon en práctica la búsqueda gobernada de comercio electrónico</h2><p>La arquitectura del plano de control regulado descrita en este serial, desde el paradigma de política como datos hasta la búsqueda basada en filtro, personalización, optimización económica y el aislamiento de agente, fue diseñada y desarrollada por Elastic Services Engineering. Todos los patrones que se describen en esta serie provienen de un sistema operativo creado y validado con catálogos de productos a escala empresarial.</p><p>Si tu equipo está desarrollando experiencias de búsqueda impulsadas por IA y necesita límites deterministas para consultas mediadas por agentes, o si quieres implementar una arquitectura de búsqueda regulada y editable por el negocio en Elasticsearch, Elastic Professional Services puede acelerar tu implementación. Ponte en contacto con <a href="https://www.elastic.co/consulting">Elastic Professional Services</a>.</p><h2>Únete a la discusión</h2><p>¿Tienes preguntas sobre la gestión de búsquedas, las estrategias de recuperación o la arquitectura de búsqueda en el comercio electrónico? Únete a la <a href="https://discuss.elastic.co/">conversación general de la comunidad de Elastic</a>.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/agentic-ai-search-deterministic-guardrail-query-execution</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/agentic-ai-search-deterministic-guardrail-query-execution</guid>
    <category><![CDATA[Operaciones]]></category>
    <dc:creator><![CDATA[Alexander Marquardt,Honza Král,Taylor Roy]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5b5aa5493a75281a/6a16f3490811ae71b8e9fe94/769cdc7b53cbb222f52095193cd423277e8017d9-1280x720.png" length="0" type="image/png"/>
    <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Personalización de la búsqueda en comercio electrónico: integración del historial de compras y cohortes de usuarios]]></title>
    <description><![CDATA[Aprende a crear una experiencia de búsqueda personalizada en Elasticsearch sin infringir la gobernanza. En esta publicación se explica cómo destacar los productos que un comprador ha adquirido previamente y cómo activar políticas específicas de cohortes basadas en perfiles de usuario.]]></description>
    <content:encoded><![CDATA[<p>En las <a href="https://www.elastic.co/search-labs/blog/series/governed-search-patterns">partes 1 a 5</a> de esta serie se describe un plano de control gobernado que clasifica la intención, impone restricciones, resuelve conflictos de políticas y enruta a la estrategia de recuperación apropiada, todo antes de que se consulte el catálogo de productos. Todos los mecanismos descritos hasta ahora tratan a todos los compradores de la misma manera. Una búsqueda de “chocolate” produce el mismo conjunto de resultados, independientemente de si el comprador es vegano, un padre que compra para el cumpleaños de su hijo o un consumidor que observa las leyes halal.</p><p>En esta publicación se presentan dos mecanismos de personalización que amplían el plano de control gestionado sin modificar su arquitectura. Ambos mecanismos se apilan multiplicativamente con la capa de gobernanza de las partes 1 a 5: las políticas aún se activan, las restricciones aún se aplican, los conflictos aún se resuelven y las señales de personalización se componen en la misma consulta gobernada, lo que asegura que los resultados que devuelve Elasticsearch ya están personalizados.</p><p>El primer mecanismo impulsa los productos que el comprador individual ha adquirido anteriormente. El segundo activa políticas específicas de cohorte basadas en el perfil del comprador. En conjunto, demuestran que la personalización no es un sistema separado que se combina con la búsqueda ni se aplica como procesamiento posterior a la recuperación; es una extensión natural del plano de control orientado a políticas.</p><p>Para profundizar en las matemáticas de las técnicas de personalización utilizadas en esta publicación, consulta <a href="https://alexmarquardt.com/elastic/personalizing-search-in-elasticsearch-without-ml-post-processing/">Personalización de la búsqueda en Elasticsearch sin postprocesamiento de ML</a> y <a href="https://www.elastic.co/search-labs/blog/ecommerce-search-relevance-cohort-aware-ranking-elasticsearch">Clasificación basada en cohortes en Elasticsearch</a>.</p><p>Para ver una demostración en vivo de cómo se puede usar el historial de compras para mejorar los resultados de búsqueda de los clientes que regresan, mira el video: <a href="https://www.youtube.com/watch?v=TGf_pOWHA5M">Personalización explicable: cómo impulsar la búsqueda con historial de compras</a>.</p><h2>Impulso del historial de compras individuales</h2><p>La forma más simple de personalización es también una de las más efectivas: si un comprador ha adquirido un producto antes, promuévalo cuando haga una búsqueda de algo relacionado. Un comprador que adquiere habitualmente una marca concreta de galletas con pepitas de chocolate debería ver esas galletas mejor posicionadas en los resultados de búsqueda cuando busque “galletas”, no porque un modelo predijo una preferencia, sino porque existe evidencia conductual directa.</p><h3>Cómo funciona</h3><p>Cuando una solicitud de búsqueda incluye un identificador de usuario, como sería el caso de un usuario que tiene una sesión abierta, el plano de control ejecuta dos consultas de Elasticsearch en paralelo utilizando un thread pool:</p><ol><li><p>La consulta del percolador contra el índice de políticas (la misma búsqueda de gobernanza descrita en las partes 3 y 4).</p></li><li><p>Una búsqueda de historial de compras contra un índice de <code>user_purchases</code>, filtrada al usuario específico por <code>term(user_id)</code> y luego comparando el texto de búsqueda actual con los títulos de producto de ese usuario.</p></li></ol><p>Estos procesos se ejecutan en paralelo (ninguno espera al otro), así que la búsqueda de personalización no agrega una latencia significativa al pipeline de gobernanza.</p><p>La búsqueda del historial de compras utiliza <a href="https://www.elastic.co/docs/manage-data/data-store/text-analysis">el análisis de texto de Elasticsearch</a> (derivación, tokenización) al comparar la cadena de búsqueda actual con los títulos de los productos almacenados. Esto significa que una búsqueda de “cookies” coincidirá con una compra anterior de “galletas brownie” a través del análisis de texto estándar, sin requerir una coincidencia exacta de cadenas.</p><h3>Cálculo de pesos de aumento</h3><p>No todas las compras anteriores merecen el mismo impulso. La ponderación considera dos factores intuitivos: la frecuencia con la que el comprador adquirió el producto y qué tan reciente fue la compra. Un producto comprado 15 veces la semana pasada es una señal mucho más fuerte que un producto comprado una vez hace seis meses. La ponderación utiliza una escala logarítmica basada en la frecuencia (para que un único artículo comprado en grandes cantidades no eclipse al resto) y un decaimiento exponencial basado en la antigüedad (para que las compras más antiguas pierdan relevancia de forma natural con el tiempo).</p><p>Para conocer los detalles matemáticos de la fórmula de aumento, consulta <a href="https://alexmarquardt.com/elastic/personalizing-search-in-elasticsearch-without-ml-post-processing/">Cómo personalizar la búsqueda en Elasticsearch sin posprocesamiento de ML</a>.</p><h3>Cómo se convierte en una consulta</h3><p>Los impulsos del historial de compras se integran en la consulta como la capa de puntuación más externa, envolviendo los filtros de política de gobernanza y los impulsos de las partes 3 y 4 y cualesquier<a href="https://www.elastic.co/search-labs/blog/function-score-query-boosting-profit-popularity-elasticsearch"> impulso de señales comerciales, como margen y popularidad</a> (que exploraremos en la parte 7). Esto significa que un producto que se elimina por una política de gobernanza no reaparecerá debido a un impulso en el historial de compras. La <em>gobernanza</em> controla el conjunto de resultados; la <em>personalización</em> ajusta el orden dentro de él. Los productos sin historial de compras no se penalizan. Se mantiene su clasificación gobernada, aunque los productos con un historial de compras relevante aparecerán por encima de ellos, en igualdad de condiciones.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt731e67dfd3bd6ee2/6a17e9523e9e4582bbba14b6/80f0285bd80935703d39b7a4e1fd6094d71af0aa-545x273.jpg" alt="Un diagrama de flujo muestra cómo la búsqueda de “naranjas” de un usuario se mueve a través de un servidor de aplicaciones, un plano de control, el historial de compras y las búsquedas de políticas, y luego a un índice de catálogo de productos para devolver resultados de productos de naranja." /><h3>¿Por qué consultar Elasticsearch en cada búsqueda?</h3><p>El historial de compras se consulta desde Elasticsearch en cada búsqueda, en lugar de almacenarse en caché en la capa de la aplicación. Esta es una decisión de diseño deliberada. Como la consulta compara la cadena de búsqueda actual con los títulos de productos mediante el pipeline de análisis de texto de Elasticsearch, el sistema se beneficia de la misma reducción a la raíz, tokenización y manejo del lenguaje que usa la propia búsqueda de productos. Una consulta en memoria caché requeriría reimplementar ese análisis o aceptar una coincidencia menos precisa.</p><p>Para ver por qué este orden es importante, considere a un comprador que previamente adquirió jugo de naranja y ahora busca “naranjas”. La consulta de historial de compras compara “jugo de naranja” con el término de búsqueda “naranjas” mediante análisis de texto y calcula un impulso para ese producto. Pero la capa de gobernanza ya ha restringido las “naranjas” a la categoría de productos, filtrando completamente el jugo de naranja. El impulso del historial de compras para el jugo de naranja está presente en la consulta, pero no tiene efecto porque no hay un documento coincidente en el conjunto de resultados gobernado sobre el que pueda actuar. El comprador ve naranjas frescas, ordenadas por relevancia y personalización. La barrera de seguridad de gobernanza se mantiene.</p><p>El costo de rendimiento es mínimo: el índice de historial de compra es pequeño (el historial de compra de un usuario suele ser de decenas o cientos de documentos, no de millones), y la consulta se ejecuta en paralelo con la búsqueda del percolador, por lo que no alarga la ruta crítica.</p><h3>Ejemplo de búsqueda para “agua de manantial” sin historial de usuario</h3><p>Si un usuario que no ha iniciado sesión o un usuario que nunca ha comprado “agua de manantial” busca, es posible que vea resultados similares a los siguientes:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt90249896bcf2b8c2/6a17e954af47b685f5cddfcf/1d03558c8f6492a0999e1ac4f1d22680c8f3a6ce-1130x1028.png" alt="Una página web muestra resultados de búsqueda para “agua de manantial”, mostrando una barra de búsqueda, filtros de categoría y marca, y tres listados de productos con detalles como marca, composición y precio." /><h3>Ejemplo de historial de compra del usuario</h3><p>Por otro lado, una usuaria llamada Carol tiene un historial de compras que contiene los siguientes productos:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3aa784ccb0653a0d/6a17e95563baffd6b7741c8d/31c1fb789efc6cef673984e9711d571efce8ed27-661x523.png" alt="Una interfaz digital titulada “Perfil de compras” muestra a una compradora llamada Carol con dos cohortes y una lista de artículos comprados recientemente, lo que incluye cantidades, fechas de última compra y tiempo desde cada compra." /><h3>Ejemplo de búsqueda de “agua de manantial” con el historial de compras anterior</h3><p>Si Carol busca “agua de manantial”, verá resultados personalizados que reflejan lo que ha comprado en el pasado. Al observar el historial de compras anterior, ella compró “agua de manantial carbonatada” (la botella verde) unas 40 veces, y más recientemente hace dos días. Si busca “agua de manantial”, ese producto aparecerá en los primeros resultados, ya que sabemos que le gusta. Observa que en los resultados no personalizados, el agua de manantial Rubicon fue el primer resultado en aparecer.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf243c5ef1a1808ba/6a17e95763baff5d73741c91/6fce63ff051e345a79fef934cd6e71ba113ae585-1159x1062.png" alt="Una página web muestra los resultados de búsqueda de “agua de manantial”, la lista de detalles del producto, precios y categorías de filtros para bebidas y marcas." /><h2>Activación de políticas con reconocimiento de cohortes</h2><p>El historial de compras individual funciona bien para los clientes habituales con un comportamiento ya establecido. Pero muchos compradores son nuevos, anónimos o navegan fuera de sus hábitos habituales. Para estos compradores, la membresía de cohorte proporciona un tipo diferente de personalización, una basada en quién es el comprador, no en lo que han hecho.</p><p>Un comprador vegano que busque “chocolate” debería ver el chocolate vegano clasificado más alto. Un comprador que sigue las normas halal y busca “refrigerios” debería ver opciones con certificación halal en un lugar destacado. Un comprador consciente de la salud que busca “yogur” debería ver opciones probióticas resaltadas.</p><h3>Cohortes como políticas, no como etiquetas de productos</h3><p>Los productos ya llevan sus atributos normales, incluidos campos como <code>dietary_restrictions: ["vegan"]</code> o <code>dietary_restrictions: ["halal"]</code>. La pregunta es dónde reside la lógica que conecta la cohorte de un comprador con esos atributos de producto.</p><p>El enfoque ingenuo sería codificar ese mapping en la capa de aplicación o en la plantilla de búsqueda: si el usuario es vegano, agrega un impulso a <code>dietary_restrictions: "vegan"</code>. Pero este es el mismo código espagueti de la <a href="https://www.elastic.co/search-labs/blog/ecommerce-search-governance-improve-retrieval">parte 1</a>, y crea la misma fricción operativa: agregar una nueva cohorte o cambiar lo que significa una cohorte requiere un cambio de código.</p><p>En cambio, el plano de control gestionado mantiene la lógica de cohortes en el motor de políticas. Una política de cohorte combina dos cosas: la membresía de cohorte de un comprador (por ejemplo, “vegana”) y un atributo de producto (por ejemplo, <code>dietary_restrictions: “vegan”</code>). La política define la conexión: cuando un comprador en la cohorte vegana realiza una búsqueda, impulsa los productos donde <code>dietary_restrictions</code> incluye “vegano”.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte15937af719dff39/6a17e95925daab370608a274/2b6fe359774bbea059aaf93f3fa4a03eb31233ea-544x290.jpg" alt="" /><p>Como la lógica de cohortes reside en el motor de políticas y no en el código de aplicación, esto significa lo siguiente:</p><ul><li><p>Para añadir una nueva cohorte, basta con crear una nueva política; no es necesario volver a indexar el producto.</p></li><li><p>Las políticas de cohorte utilizan el motor de reglas completo: pueden agregar filtros, aplicar impulsos suaves, expandir sinónimos, cambiar la estrategia de recuperación o realizar cualquier otra acción que una política pueda tomar.</p></li><li><p>El comportamiento de la cohorte se gestiona a través de la misma interfaz de administración que todas las demás políticas: un comerciante puede crear, probar y promover políticas de cohorte a través del flujo de trabajo Autor → Prueba → Promoción descrito en la <a href="https://www.elastic.co/search-labs/blog/ecommerce-search-governance-zero-deploy">parte 2</a>.</p></li></ul><h3>Ejemplo de política de cohorte vegana</h3><p>Un merchandiser crea una política de cohorte con las siguientes características:</p><ul><li><p><strong>Cohortes:</strong> <code>["vegan"]</code>.</p></li><li><p><strong>Criterio de coincidencia:</strong> coincide con cualquier búsqueda (o una categoría específica de producto).</p></li></ul><p><strong>Acción:</strong> refuerzo leve en <code>dietary_restrictions: "vegan"</code> con una ponderación de refuerzo de 2.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt835034b54f6790b8/6a17e95b7b54f980408b391e/fc58bbd97c0dd1fa3ce757394ca117d0789c52f6-1080x1018.png" alt="Una interfaz web titulada “Editar política de reescritura” muestra campos para ID de política, título, descripción, selección de cohorte, opciones de consulta de regla, tipo de regla, ajustes de filtro y más, con un enfoque en la cohorte que contiene “vegano” y uno en el valor “vegano”." /><h3>Cómo funciona la activación de cohortes</h3><p>Cada documento de política tiene un campo <code>cohorts</code>. Las políticas universales que se aplican a todos los compradores independientemente de la cohorte pueden dejar este campo en blanco, e internamente se les asignará un valor de <code>"_all"</code> por el plano de control. Las políticas específicas de cohorte almacenan los nombres de sus cohortes objetivo, como <code>["vegan", "kosher", “sweet_tooth”]</code>.</p><p>Cuando una solicitud de búsqueda incluye un perfil de usuario, el plano de control construye un filtro <code>terms</code> simple para la consulta del percolador:</p>{ "terms": { "cohorts": ["_all", "vegan", "health_conscious"] } }<p>Este filtro único incluye todas las políticas universales, además de las políticas específicas de la cohorte del usuario. El <code>_all</code> centinela hace que este sea un filtro de inclusión limpio: no se necesitan búsquedas<code>must_not</code> o <code>exists</code> para manejar el caso en el que una política no tiene restricción de cohorte.</p><p>A continuación, el percolador evalúa las coincidencias de políticas como de costumbre. La única diferencia es que el conjunto de políticas candidatas se redujo a aquellas relevantes para las cohortes de este comprador. Todo el flujo descendente (transformaciones en cascada, resolución de conflictos por campo, seguimiento de frases consumidas) funciona de manera idéntica al flujo no personalizado descrito en las partes 3 y 4.</p><h3>Resultados de usuarios no veganos (estándar) al buscar “chocolate”</h3><p>Cuando un usuario no vegano realiza una búsqueda de chocolate, no se aplica ningún aumento de cohorte vegano a sus resultados. A menudo veía chocolates no veganos entre los resultados más populares, como por ejemplo:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc5244b19c2162f5b/6a17e95d3e03d727f74f2cb6/5bade79944ef294e2cb835cfd6e3231392e8fbd0-1159x1104.png" alt="Una página web muestra los resultados de búsqueda para “chocolate”, con filtros de categoría y marca a la izquierda y tres listados de productos de chocolate con descripciones, precios y especificaciones." /><h3>Resultados de la política de cohorte vegana al buscar “chocolate”</h3><p>Cuando un comprador de cohorte vegana realiza una búsqueda de “chocolate”, esta política se incluye en el conjunto de candidatos del percolador. Coincide, y el plano de control aplica un impulso suave a los chocolates certificados como veganos. El aumento es multiplicativo: los chocolates veganos tienen un rango más alto, pero los chocolates no veganos no están completamente excluidos porque el filtro anterior se define como un <em>impulso suave</em>, que describimos en detalle en la parte 3 de esta serie.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf73ce626bcd3d66d/6a17e95f2f4a5c5341fa8934/fc6f7ec6a9de30f3a6d8f32bb9ee7ec457dea458-1138x1255.png" alt="Una página web muestra resultados de búsqueda para “chocolate”, con filtros de categoría y marca a la izquierda y tres listados de productos de chocolate con descripciones, precios y especificaciones, con un enfoque en las etiquetas veganas circuladas." /><p>Sin embargo, si el comprador busca explícitamente “chocolate con leche Hershey”, la preferencia vegana sigue siendo aplicable, pero puede verse superada por la mayor relevancia textual de los productos de chocolate con leche Hershey.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0e7487727387e524/6a17e9617b54f965ab8b3922/f47bb8bfa58106f897c4c6c143494f4367355528-1136x1142.png" alt="Una página web muestra resultados de búsqueda para “chocolate con leche Hershey”, con filtros de categoría y marca a la izquierda y tres listados de productos de chocolate Hershey’s, con descripciones detalladas, precios e información nutricional." /><p>Un comprador fuera de la cohorte vegana que busca la misma consulta nunca ve la política de la “cohorte vegana”; no está en su conjunto de candidatos. La capa de gobernanza es idéntica; solo el conjunto de políticas activas difiere.</p><h3>Cohortes con historial de compra</h3><p>Un comprador vegano con un historial de compra extenso obtiene la activación de políticas específicas para la cohorte vegana, así como impulsos en el historial de compra. Para compradores nuevos o anónimos, la membresía implícita en la cohorte por sí sola proporciona una personalización significativa sin requerir datos de comportamiento (por ejemplo, quizás un usuario anónimo solo buscó productos veganos, por lo que lo clasificamos como afiliado a la cohorte vegana). Un comprador que se autoidentifica como seguidor de las normas de halal durante la creación de la cuenta recibe inmediatamente resultados adaptados a halal en su primera búsqueda.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt89044f002807c2e4/6a17e962af47b64034cddfd3/81af35a533a567d99324860c8e69cf9752533c8f-545x301.jpg" alt="Un diagrama de flujo muestra cómo una búsqueda de “naranjas” se mueve a través de un servidor de aplicaciones, un plano de control, búsquedas de historial y políticas, y luego un índice de productos para devolver productos de naranja." /><h2>Cómo se componen las capas de personalización</h2><p>El orden de anidación de <code>function_score</code> capas importa. De lo más interno a lo más externo:</p><ol><li><p><strong>Búsqueda base:</strong> la palabra clave o coincidencia semántica con consultas nombradas (<code>fulltext_match</code>, <code>title_phrase_match</code>).</p></li><li><p><strong>Capa de política de gobernanza:</strong> filtros duros como cláusulas <code>bool.filter</code>, impulsos suaves como funciones <code>function_score</code> (Partes 3 y 4).</p></li><li><p><strong>Impulsos de señales de negocio:</strong> aumento de margen y popularidad (que exploraremos en la parte 7).</p></li><li><p><strong>Impulsos del historial de compra:</strong> La capa <code>function_score</code> más externa.</p></li></ol><p>Este orden garantiza que la gobernanza controle el conjunto de resultados (lo que aparece), que las señales de negocio ajusten la clasificación dentro de ese conjunto (lo que aparece primero desde la perspectiva del minorista) y que el historial de compras ajuste aún más la clasificación según el comportamiento individual (lo que aparece primero desde la perspectiva del comprador). Cada capa envuelve a la anterior de manera multiplicativa, por lo que los efectos se acumulan en lugar de entrar en conflicto.</p><h2>Qué significa esto a nivel operativo</h2><p>La personalización a través del plano de control gobernado preserva todas las propiedades operativas descritas en las Partes 1 y 2:</p><ul><li><p><strong>Cambios sin necesidad de despliegue.</strong> Las políticas de cohorte se crean, prueban y promueven a través de la IU de administración. Agregar una nueva cohorte dietética o ajustar un peso de refuerzo no requiere cambios en el código ni participación de ingeniería.</p></li><li><p><strong>Auditabilidad.</strong> Cada política de cohorte es un documento independiente y versionado. Cuando un comercializador pregunta: “¿Por qué los productos veganos aparecen mejor posicionados para este usuario?”, la respuesta es una política específica con una prioridad determinada, visible en el panel de depuración junto con todas las demás políticas que se activaron para esa consulta.</p></li><li><p><strong>Resolución de conflictos.</strong> Las políticas de cohorte participan en la misma resolución de conflictos por campo descrita en la Parte 3. Si el aumento de categoría de una política de cohorte entra en conflicto con la anulación de categoría de una política de campaña, el conflicto se resuelve de forma determinista mediante el mismo marco de trabajo de prioridades y estrategia, sin necesidad de una gestión especial.</p></li><li><p><strong>Mensurabilidad.</strong> Debido a que las políticas de cohorte son discretas y se pueden activar individualmente, su impacto en las tasas de conversión, clics y agregados al carrito puede medirse de forma independiente, al igual que cualquier otra política en el sistema.</p></li></ul><h2>Lo que se viene</h2><p>En la próxima publicación se explora otra dimensión del plano de control gestionado: cómo el margen y el impulso de la popularidad pueden ajustarse por consulta a través de políticas, lo que convierte la optimización económica en una decisión de gobernanza en lugar de una configuración estática.</p><p>Consulta la parte 7: optimización económica gobernada por consultas: margen por búsqueda y aumento de popularidad</p><h2>Pon en práctica la búsqueda gobernada de comercio electrónico</h2><p>Los patrones de personalización descritos en esta publicación (aumento del historial de compras individuales y activación de políticas consciente de la cohorte) fueron diseñados y desarrollados por Elastic Services Engineering como parte de nuestro acelerador de búsqueda de comercio electrónico repetible. Ambos mecanismos se integran con la arquitectura del plano de control gobernado descrita a lo largo de esta serie. Ponte en contacto con <a href="https://www.elastic.co/consulting">Elastic Professional Services</a>.</p><h2>Únete a la discusión</h2><p>¿Tienes preguntas sobre la gestión de búsquedas, las estrategias de recuperación o la arquitectura de búsqueda en el comercio electrónico? Únete a la <a href="https://discuss.elastic.co/">conversación general de la comunidad de Elastic</a>.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-personalized-search-governed-ecommerce</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-personalized-search-governed-ecommerce</guid>
    <category><![CDATA[Operaciones]]></category>
    <dc:creator><![CDATA[Alexander Marquardt,Honza Král,Taylor Roy]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte3979255ddfc7f45/6a17e25ffaa913812f93c7cb/92c517a2e7b36122a18feee317a0215981b62b6b-720x420.jpg" length="0" type="image/jpeg"/>
    <pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Percolador de Elasticsearch para la gobernanza de búsquedas en comercio electrónico: traducir búsquedas ambiguas en estrategias de recuperación controladas]]></title>
    <description><![CDATA[Aprende a usar el percolador de Elasticsearch para implementar la gobernanza de búsquedas. En este blog, describimos los patrones necesarios para crear un motor de políticas regulado en producción y establecer una estrategia de recuperación controlada.]]></description>
    <content:encoded><![CDATA[<p>Esta publicación es un análisis técnico detallado de la implementación en Elasticsearch de la arquitectura del plano de control descrita en la <a href="http://elastic.co/search-labs/blog/ecommerce-search-governance-control-plane-architecture">Parte 3</a>, y muestra cómo crearla utilizando el percolador de Elasticsearch. Describe los patrones utilizados para implementar un motor de políticas determinista y regulado en producción.</p><h2><strong>De la arquitectura a la implementación</strong></h2><p>La <a href="http://elastic.co/search-labs/blog/ecommerce-search-governance-control-plane-architecture">Parte 3</a> describió la arquitectura del plano de control: coincidencia inversa como primitiva de búsqueda, documentos de políticas que separan la coincidencia de la acción y transformaciones en cascada que componen varias políticas en un solo plan de ejecución. Esta publicación pone en práctica la <a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-percolate-query">búsqueda del percolador</a> de Elasticsearch, la función que permite la búsqueda de políticas.</p><p>El percolador se adapta naturalmente a la gobernanza porque invierte la dirección de búsqueda exactamente de la forma que necesita un plano de control. Esta publicación analiza la implementación paso a paso, comenzando con una explicación clara de la función del percolador y por qué es importante, pasando luego por el diseño del índice, el almacenamiento de políticas, la evaluación del tiempo de búsqueda y la composición de políticas múltiples.</p><h2><strong>Cómo funciona la búsqueda normal</strong></h2><p>En un sistema de comercio electrónico, puedes tener cientos de miles o millones de documentos de productos que contienen campos como <code>title</code>, <code>category</code>, y <code>price</code>. Cuando un usuario busca documentos coincidentes, le estás pidiendo a Elasticsearch que compare el texto de búsqueda del usuario con uno o más campos almacenados en estos documentos de producto. El analizador predeterminado de Elasticsearch, <a href="https://www.elastic.co/docs/reference/text-analysis/analysis-standard-analyzer">el analizador estándar</a>, convierte el texto a minúsculas y lo divide en tokens. Una búsqueda de “naranjas” coincide con “Naranjas” debido a las minúsculas. Con un analizador sensible al idioma que incluye derivación, también coincide con “naranja” porque ambas formas se reducen a la misma raíz. Por ejemplo, la siguiente <a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-match-query">consulta de coincidencia</a> devuelve documentos que tienen “naranja” o “naranjas” en su campo <code>“title”</code>.</p>POST products/_search
{
  "query": {
    "match": {
      "title": "oranges"
    }
  }
}<p>Entonces, para la búsqueda anterior, Elasticsearch devuelve los documentos del producto cuyo campo <code>title</code> coincide con “naranjas”, que podrían incluir resultados como “Mermelada de naranja”, “Jugo de naranja”, “Naranjas jugosas”, “Mermelada de naranja”, etc. El punto clave a recordar es que Elasticsearch se usa comúnmente para comparar un texto de búsqueda con documentos y para devolver los documentos que coinciden con el texto de búsqueda.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt806e1c8c115bc9b6/6a170dba67045b634645c266/ba758f25616f2106d245ce0d47926c174766e028-642x318.png" alt="Un diagrama que compara una cadena de búsqueda entrante con títulos de productos almacenados y que muestra coincidencias para tres títulos que contienen “naranja” y ninguna coincidencia para dos títulos que no lo contienen." /><h2><strong>El problema de la gobernanza: encontrar políticas relevantes antes de buscar productos</strong></h2><p>Como se ha explicado en las <a href="https://www.elastic.co/search-labs/blog/series/governed-search-patterns">Partes 1 a 3</a>, un sistema de búsqueda gestionado no envía el texto de búsqueda del usuario directamente al catálogo de productos. Primero, comprueba si alguna política se aplica a ese texto de búsqueda.</p><p>Un vendedor decidió que cuando alguien busca exactamente "naranjas", los resultados deben restringirse a la categoría Naranjas y eliminar el jugo de naranja, la mermelada de naranja y el refresco de naranja. Esa decisión empresarial se almacena como una política. Cuando un usuario escriba "naranjas", el plano de control necesita encontrar esa política, leer sus instrucciones y modificar la búsqueda en el catálogo de productos en consecuencia. Para ello, el plano de control tiene que determinar qué políticas almacenadas son relevantes para esta cadena de búsqueda.</p><p>Un despliegue empresarial podría tener cientos o miles de políticas de este tipo. Comprobarlas una por una con lógica condicional (si/entonces) es el antipatrón de la capa de aplicación descrito en la <a href="http://elastic.co/search-labs/blog/ecommerce-search-governance-zero-deploy">Parte 2</a>. Lo que necesitamos es una forma de almacenar todas esas políticas en un índice y encontrar instantáneamente las que coincidan con un texto de búsqueda determinado. Aquí es donde entra en juego el percolador.</p><h2><strong>Cambiando la dirección: el percolador</strong></h2><p>Como mencionamos anteriormente, en una búsqueda normal, Elasticsearch se usa comúnmente para comparar un texto de búsqueda con documentos y devolver los documentos que contienen ese texto de búsqueda.</p><p>El percolador hace justo lo contrario. Con un percolador, tienes un índice donde cada documento almacena un patrón de búsqueda, y luego se comprueba un texto de búsqueda entrante contra estas búsquedas almacenadas para determinar cuál de estos patrones de búsqueda almacenados se activó.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1e7e2966bf46474d/6a170dbba929cf500aae0a57/1e6348531d1c0be57b385f51d248488cf58489ff-642x279.png" alt="Un diagrama que muestra varios patrones de consulta almacenados probados independientemente contra un texto de búsqueda entrante, con “naranjas” produciendo una coincidencia y todos los demás patrones no devolviendo ninguna coincidencia." /><p>En materia de gobernanza, los "patrones de búsqueda almacenados" son políticas. Cada política contiene un patrón que describe el tipo de texto de búsqueda con el que debe coincidir. Por ejemplo, ¿el texto de búsqueda coincide exactamente con “naranjas” o el texto de búsqueda contiene “aceite de oliva”? La cadena entrante es el texto de búsqueda del usuario, que llega en el momento de la búsqueda y debe comprobarse con todos los patrones de políticas almacenados. Esto se cubre en un <a href="https://youtu.be/Ap5K2Y00Xjc?t=246">video relacionado con PRISM a las 4:09</a>.</p><h2>Paso a paso: cómo una búsqueda de "naranjas" encuentra su política</h2><h3>La política</h3><p>Un vendedor ha creado una política que produce una coincidencia si un usuario busca exactamente "naranjas" sin ninguna otra palabra. Una vez que el percolador genera una coincidencia, el resto del documento incluye las reglas que el plano de control usará para crear la búsqueda del producto; en este ejemplo, una de las reglas es restringir (filtrar) los resultados a la categoría Frutas.</p>{
  "percolator": {
    "match_phrase": { "query": "START oranges END" }
  },
  "rule_type": "filter",
  "rule_args": {
    "filters": [
      {
        "field": "categories",
        "values": ["Fruits"],
        "mode": "hard_filter",
        "on_conflict": "soft_boost",
        "on_conflict_boost_weight": 1.0
      }
    ]
  },
  "priority": 0,
  "enabled": true
}<p>El campo <code>percolator</code> contiene el patrón que define cuándo debe ejecutarse esta política. En este caso, coincide con la expresión <code>"START oranges END"</code>. Los campos <code>rule_type</code> y <code>rule_args</code> definen lo que debe hacer la política cuando se activa. Los tokens <code>START</code> y <code>END</code> son marcadores de límites, que explicaremos en breve.</p><p>Puedes ver cómo se crea una política en la UI de PRISM Studio en el <a href="https://youtu.be/Ap5K2Y00Xjc?t=172">minuto 2:52 del video relacionado de PRISM</a>.</p><h3>El usuario busca</h3><p>Un comprador escribe "naranjas" en la barra de búsqueda.</p><h3>El plano de control verifica las políticas de coincidencia</h3><p>Antes de buscar en el catálogo de productos, el plano de control intercepta la cadena de búsqueda del usuario, la contiene entre marcadores de límite y la envía al percolador:</p>POST policies/_search
{
  "query": {
    "percolate": {
      "field": "percolator",
      "document": {
        "query": "START oranges END"
      }
    }
  }
}<p>El texto <code>"START oranges END"</code> se comprueba con todos los patrones de políticas almacenados. Internamente, Elasticsearch ejecuta los patrones de políticas almacenados relacionados con este texto y devuelve los que coinciden. Ese es el percolador. La cadena de búsqueda del usuario se comprobó según todos los patrones de políticas almacenados, y se devolvieron los que coincidían. No se permiten cadenas si/entonces. Sin evaluación secuencial. El índice maneja la coincidencia.</p><h3>El plano de control aplica la política</h3><p>El plano de control lee las acciones de las políticas coincidentes. La política anterior indica al plano de control que limite los resultados a la categoría Frutas. El plano de control crea la búsqueda final de Elasticsearch sobre el catálogo de productos de la siguiente manera:</p>POST products/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "oranges" } }
      ],
      "filter": [
        { "terms": { "categories": ["Fruits"] } }
      ]
    }
  }
}<p>El usuario buscó "naranjas". El catálogo de productos recibe una búsqueda para "naranjas" restringida a la categoría Frutas. Debido a esta restricción, se excluyen el jugo de naranja, la mermelada de naranja y el refresco de naranja.</p><h3>¿Por qué la "mermelada de naranja" no activa la política de naranjas?</h3><p>Supongamos que otro usuario busca "mermelada de naranja". El plano de control envuelve el texto y se filtra: <code>"START orange marmalade END"</code>. El patrón de la política de naranjas es <code>match_phrase: "START oranges END"</code>. La política de naranjas no coincide y, por lo tanto, la política no se aplica, y los resultados no están limitados a la categoría Frutas.</p><p>Este es el propósito de los marcadores de límite <code>START</code> y <code>END</code>. Sin ellos, una política que coincida con la palabra "naranjas" podría activarse accidentalmente en una búsqueda como "mermelada de naranja". Al envolver el texto de búsqueda del usuario con <code>START</code> y <code>END</code> e incluir esos marcadores en el patrón de la política, nos aseguramos de que la política solo se activa cuando “naranjas” sea el texto de búsqueda completo, sin otras palabras. Esto coincide con la intención tanto de los compradores como de los comerciantes.</p><h2>Una segunda política: "aceite de oliva" en el campo derivado.</h2><p>No todas las políticas necesitan una coincidencia exacta de texto. La política de “aceite de oliva” coincide con un campo derivado, por lo que se aplica independientemente de variaciones menores en la forma de las palabras:</p>{
  "percolator": {
    "bool": {
      "should": [
        { "match_phrase": { "query.stemmed": "START olive oil END" } }
      ]
    }
  },
  "rule_type": "filter",
  "rule_args": {
    "filters": [
      {
        "field": "categories",
        "values": ["Olive oils"],
        "mode": "hard_filter",
        "on_conflict": "soft_boost",
        "on_conflict_boost_weight": 1.0
      }
    ]
  },
  "priority": 300,
  "enabled": true
}<p>El patrón de esta política coincide con <code>query.stemmed</code> en lugar de <code>query</code>. Cuando llega la cadena de búsqueda del usuario, se almacena tanto en un campo <code>query</code> (el texto exacto) como en un campo <code>query.stemmed</code> (analizado con un analizador de derivación que reduce las palabras a sus derivaciones, por lo que "aceitunas" y "aceituna" se reducen a la misma derivación, al igual que "aceites" y "aceite"). El patrón de la política se comprueba con la versión derivada del texto, por lo que se activa independientemente de las variaciones menores en la forma de la palabra.</p><p>Los marcadores de límites <code>START</code> y <code>END</code> también funcionan en el campo derivado, lo que garantiza que esta política solo se activa cuando "aceite de oliva" es el texto de búsqueda completo, no cuando aparece como parte de un texto más largo.</p><p>El resto de esta publicación cubre los detalles de implementación que hacen que esto esté listo para producción: la asignación de índices que admite ambos modos de coincidencia, cómo los resaltados impulsan la eliminación de frases y el seguimiento de las frases procesadas, y cómo múltiples políticas conflictivas se combinan en un único plan de ejecución.</p><h2><strong>El mapping del índice de políticas</strong></h2><p>El índice de políticas necesita un campo percolador para almacenar patrones de búsqueda y un campo de texto que refleje la estructura de la cadena de búsqueda entrante con la que el percolador coincidirá. El mapping a continuación se simplifica para mayor claridad. Un despliegue en producción es más complejo, ya que utiliza analizadores personalizados para manejar marcadores de límite, la coincidencia de patrones variables (por ejemplo, reconocer que "menos de $4" contiene un valor de moneda) y otros tipos de análisis.</p>PUT policies
{
  "mappings": {
    "properties": {
      "percolator": {
        "type": "percolator"
      },
      "query": {
        "type": "text",
        "fields": {
          "stemmed": {
            "type": "text",
            "analyzer": "stemming"
          }
        }
      },
      "rule_type": { "type": "keyword" },
      "rule_args": { "type": "object", "enabled": false },
      "priority": { "type": "integer" },
      "enabled": { "type": "boolean" }
    }
  }
}<p>El índice se llama <code>policies</code> porque cada documento representa una política regida completa como se define en la <a href="http://elastic.co/search-labs/blog/ecommerce-search-governance-zero-deploy">Parte 2</a>. Esto incluye criterios de coincidencia, acción, prioridad y metadato. Los campos <code>rule_type</code> y <code>rule_args</code> contienen el componente de acción de la política, que incluyen las instrucciones que utilizará el plano de control para crear la búsqueda para su ejecución en el catálogo de productos.</p><p>El campo <code>query</code> es el texto con el que coincide el percolador. Tiene dos variantes: una versión exacta y una versión derivada. Cuando llega el texto de búsqueda del usuario, se coloca en este campo del índice temporal en memoria. Las políticas que coinciden en <code>query</code> ven el texto exacto; las políticas que coinciden en <code>query.stemmed</code> ven la versión derivada.</p><h2><strong>Filtrar con resaltados, análisis y clasificación</strong></h2><p>Los ejemplos simples anteriores mostraron solicitudes mínimas de percolación. En la práctica, el plano de control añade resaltado, filtra políticas deshabilitadas y clasifica por prioridad:</p>POST policies/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "percolate": {
            "field": "percolator",
            "document": {
              "query": "START olive oil END"
            }
          }
        },
        {
          "term": { "enabled": true }
        }
      ]
    }
  },
  "highlight": {
    "fields": {
      "query": {
        "matched_fields": ["query.stemmed"]
      }
    }
  },
  "sort": [
    { "priority": { "order": "desc" } }
  ]
}<p>La configuración de resaltado usa <code>"query"</code> como clave de campo con <code>"query.stemmed"</code> en <code>matched_fields</code>. Esto le indica al <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/highlighting">resaltador</a> unificado de Elasticsearch que devuelva resaltados en el campo original <code>query</code>, pero que también considere las coincidencias del subcampo <code>query.stemmed</code> al determinar qué tokens resaltar. Esto es lo que permite que una política que coincide en el campo derivado siga produciendo resaltados precisos en el texto original, que el plano de control necesita para la eliminación de frases y el seguimiento de frases procesadas.</p><p>El filtro <code>enabled: true</code> garantiza que se omitan las políticas deshabilitadas. La <code>sort</code> como prioridad asegura que las políticas de mayor prioridad se devuelvan primero, para que el plano de control pueda procesarlas en el orden correcto para las transformaciones en cascada. El campo <code>highlight</code> es la adición más importante; nos indica exactamente qué palabras en el texto de búsqueda del usuario activaron cada coincidencia.</p><p>La respuesta a una búsqueda de "aceite de oliva" podría ser la siguiente:</p>{
  "hits": {
    "hits": [
      {
        "_id": "en_2c3021c8",
        "_source": {
          "rule_type": "filter",
          "rule_args": {
            "filters": [
              {
                "field": "categories",
                "values": ["Olive oils"],
                "mode": "hard_filter",
                "on_conflict": "soft_boost",
                "on_conflict_boost_weight": 1.0
              }
            ]
          },
          "priority": 300
        },
        "highlight": {
          "query": ["&lt;em&gt;START olive oil END&lt;/em&gt;"]
        }
      }
    ]
  }
}<h2><strong>Por qué los resaltados son importantes</strong></h2><p>Observen el punto destacado en la respuesta: <code>"&lt;em&gt;START olive oil END&lt;/em&gt;"</code>. Elasticsearch nos dice exactamente qué palabras en el texto de búsqueda del usuario hicieron que la política coincidiera. Esto no es solo superficial. El metadato destacado impulsa dos comportamientos posteriores críticos:</p><p><strong>Eliminación de frases.</strong> Algunas políticas necesitan eliminar el texto coincidente de la cadena de búsqueda antes de crear la búsqueda del catálogo de productos. Por ejemplo, una política que coincide con "barato" elimina esa palabra y la convierte en un filtro de precio en su lugar. El resaltado identifica exactamente con qué tramo del texto de búsqueda coincidía la política, para que el sistema sepa qué eliminar.</p><p><strong>Seguimiento de frases procesadas.</strong> Como se describe en la <a href="http://elastic.co/search-labs/blog/ecommerce-search-governance-control-plane-architecture">Parte 3</a>, cuando varias políticas coinciden con el mismo texto de búsqueda, una política de mayor prioridad podría eliminar palabras con las que también coincidía una política de menor prioridad. Al comparar el resaltado de cada política con el texto de búsqueda actual (en evolución), el sistema puede detectar que se ha procesado una frase y omitir la política de menor prioridad. Esto evita el doble procesamiento y asegura un comportamiento determinista.</p><p>Puedes obtener más información sobre cómo funciona el resaltado en <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/how-es-highlighters-work-internally">este artículo</a>.</p><h2><strong>De la percolación al plan de ejecución</strong></h2><p>El percolador devuelve un conjunto de políticas coincidentes. Pero tal como se describió en la <a href="http://elastic.co/search-labs/blog/ecommerce-search-governance-control-plane-architecture">Parte 3</a>, la búsqueda es solo la mitad de la historia. La otra mitad consiste en integrar esas coincidencias en un plan de ejecución coherente. Así es como se ve para una búsqueda concreta.</p><h3><strong>Ejemplo trabajado: "chocolate barato" durante una campaña de Navidad</strong></h3><p>Imaginemos que el sistema tiene dos políticas activas: la política de "Chocolate barato" (prioridad 210) y la política de "Chocolates navideños" (prioridad 300), ambas descritas en detalle en la <a href="http://elastic.co/search-labs/blog/ecommerce-search-governance-control-plane-architecture">Parte 3</a>.</p><p><strong>Paso 1: Filtra.</strong> El usuario busca "chocolate barato". El plano de control envuelve el texto de búsqueda como <code>"START cheap chocolate END"</code> y lo envía al percolador. Dos políticas coinciden: El patrón de la política de "Chocolate barato" coincide con la frase "chocolate barato"; y el patrón de la política de "Chocolates navideños" coincide con "chocolate" a través del campo derivado.</p><p><strong>Paso 2: ordena por prioridad.</strong> El percolador devuelve ambas políticas, ordenadas por prioridad en orden descendente. La política de “chocolates de Navidad” (300) se procesa primero, seguida de la política de “chocolate barato” (210).</p><p><strong>Paso 3: aplica la transformación en cascada.</strong> Este es el modelo <code>initial state → [Policy A] → state' → [Policy B] → state'' → execution plan</code> de la <a href="http://elastic.co/search-labs/blog/ecommerce-search-governance-control-plane-architecture">Parte 3</a>.</p><p>La política de “chocolates de Navidad” (prioridad 300) se aplica primero:</p><ul><li><p>Agrega un filtro de categoría estricto: "comidas y bebidas de Navidad", "dulces de Navidad".</p></li><li><p>Agrega un filtro de precio: menos de $7.</p></li><li><p>Añade un impulso suave de categoría: "calendarios de Adviento" (3x).</p></li></ul><p>La política de “chocolate barato” (prioridad 210) se aplica a continuación contra el estado modificado:</p><ul><li><p>Se intenta agregar un filtro de categoría estricto: "Chocolates", "Chocolates con leche"; pero la política navideña ya estableció este campo con <code>on_conflict: override</code>, por lo que se eliminan las categorías de chocolate barato.</p></li><li><p>Se intenta agregar un filtro de precio: $2, la política de Navidad estableció <code>on_conflict: restrict</code> para el precio, y $2 es más restrictivo que $7, por lo que $2 gana.</p></li><li><p>Elimina "barato" del texto de búsqueda.</p></li></ul><p><strong>Paso 4: crea la búsqueda en Elasticsearch.</strong> El plano de control organiza el plan de ejecución en una sola búsqueda de Elasticsearch sobre el catálogo de productos:</p>POST products/_search
{
  "query": {
    "function_score": {
      "query": {
        "bool": {
          "must": [
            { "match": { "title": "chocolate" } }
          ],
          "filter": [
            { "terms": { "categories": ["Christmas foods and drinks", "Christmas sweets"] } },
            { "range": { "price": { "lt": 2 } } }
          ]
        }
      },
      "functions": [
        {
          "weight": 1
        },
        {
          "filter": { "terms": { "categories": ["Advent calendars"] } },
          "weight": 3
        }
      ],
      "score_mode": "sum",
      "boost_mode": "multiply"
    }
  }
}<p>El texto de búsqueda original era "chocolate barato". La búsqueda que llega al catálogo de productos es un plan de recuperación regulado y consciente de la intención: la palabra "barato" ha sido procesada y convertida en una restricción de precio, los resultados están restringidos a categorías estacionales de Navidad, los productos de calendario de Adviento reciben un impulso en el ranking y el techo de precio refleja el valor más restrictivo de la política de menor prioridad. Cada transformación es determinista, rastreable y explicable.</p><p>Para una visión general de cómo estos multiplicadores interactúan con el puntaje base de BM25, ver <a href="https://youtu.be/Ap5K2Y00Xjc?t=525">el punto 8:45 en el video relacionado de PRISM</a>, donde hablamos brevemente de los aumentos multiplicativos.</p><h2><strong>¿Por qué esto funciona a escala?</strong></h2><p>El percolador es eficiente para este caso de uso debido a la asimetría: un sistema de comercio electrónico empresarial puede tener millones de productos, pero solo cientos o miles de políticas de gobernanza. El percolador está comprobando un texto de búsqueda entrante contra ese conjunto de patrones de políticas almacenados, no escaneando el catálogo completo de productos. El costo es proporcional a la cantidad de políticas y Elasticsearch aplica optimizaciones internas (indexación de términos a partir de patrones de búsqueda almacenados, con evaluación de cortocircuito de la lógica booleana) para mantener la coincidencia rápida.</p><p>Agregar una nueva política es simplemente indexar un nuevo documento. Deshabilitar una es una actualización de campo. Sin cambios de código, sin despliegues, sin reinicios.</p><h2><strong>De búsqueda a recuperación regulada</strong></h2><p>El percolador ofrece la primitiva de retrocompatibilidad rápida que hace que la arquitectura del plano de control de la <a href="http://elastic.co/search-labs/blog/ecommerce-search-governance-control-plane-architecture">Parte 3</a> sea práctica a gran escala. Las políticas son datos que se almacenan e indexan, y se comparan eficientemente con los textos de búsqueda entrantes. El plano de control compone políticas coincidentes en un plan de ejecución regulado a través de la transformación en cascada y la resolución de conflictos por campo descrita en la Parte 3. Y el motor de recuperación ejecuta el plan de ejecución definido sobre el catálogo de productos.</p><p>El resultado es un sistema en el que un vendedor puede crear una nueva política sin modificar el código de la aplicación, probarla con búsqueda representativas, implementarla en producción y observar el efecto de inmediato. El percolador agiliza la búsqueda de políticas; el plano de control hace que la composición de políticas sea determinista; y el flujo de trabajo regulado asegura la seguridad de todo el proceso.</p><h2><strong>Lo que se viene</strong></h2><p>La próxima publicación en esta serie extiende el plano de control gestionado a un nuevo territorio. Introduce una <strong>arquitectura de búsqueda de varios niveles</strong>, que explica cómo organizar una recuperación estricta, flexible y semántica mientras se mantiene la paginación y las facetas estables.</p><h2><strong>Pon en práctica la búsqueda gobernada de comercio electrónico</strong></h2><p>El plano de control basado en percolador descrito en esta publicación, desde los mapeos de índices y marcadores de límite hasta el seguimiento de frases basado en resaltados y la composición de políticas en cascada, fue desarrollado por Elastic Services Engineering como parte de nuestros aceleradores de búsqueda de comercio electrónico repetibles. Cada ejemplo de búsqueda y estructura de políticas que aparece aquí proviene de un sistema funcional validado en relación con catálogos de productos a escala empresarial.</p><p>Si quieres implementar un plano de control regulado y basado en políticas en Elasticsearch, Elastic Services puede acercarte a tu objetivo más rápido. Ponte en contacto con <a href="https://www.elastic.co/consulting">Elastic Professional Services</a>.</p><h2>Únete a la discusión</h2><p>¿Tienes preguntas sobre la gestión de búsquedas, las estrategias de recuperación o la arquitectura de búsqueda en el comercio electrónico? Únete a la <a href="https://discuss.elastic.co/">conversación general de la comunidad de Elastic</a>.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-percolator-search-governance</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-percolator-search-governance</guid>
    <category><![CDATA[Operaciones]]></category>
    <dc:creator><![CDATA[Alexander Marquardt,Honza Král,Taylor Roy]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt19fcc31ad093ad30/6a170dbd7d8d67301070e799/5e485cdd52d78419ff0ac30a4192b953f6d70c61-1280x720.png" length="0" type="image/png"/>
    <pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Creación de un plano de control para gestionar las búsquedas en el comercio electrónico]]></title>
    <description><![CDATA[Cómo construir un plano de control gobernado para el comercio electrónico que integre políticas de búsqueda conflictivas en un solo plan de ejecución (sin cambios de código).]]></description>
    <content:encoded><![CDATA[<p>La <a href="https://www.elastic.co/search-labs/blog/ecommerce-search-governance-improve-retrieval">parte 1</a> y la <a href="https://www.elastic.co/search-labs/blog/ecommerce-search-governance-zero-deploy">parte 2</a> de esta serie establecieron por qué la búsqueda de comercio electrónico necesita una <em>capa de gobernanza</em>, una capa de decisión entre la consulta del usuario y el motor de recuperación que clasifica la intención, impone restricciones y enruta a la estrategia de recuperación correcta (p. ej., BM25, semántica, híbrida). Esta publicación muestra cómo construir esa capa utilizando una primitiva arquitectónica simple, en la cual las políticas de interpretación de consultas se almacenan como documentos y se recuperan en tiempo de consulta mediante coincidencia inversa rápida. Debido a que las nuevas políticas de recuperación (p. ej., “reforzar la marca X” o “mostrar solo la categoría Y”) no requieren cambios en el código, el resultado es una capa de enrutamiento que se mantiene estable mientras las políticas evolucionan y que mantiene los motores de recuperación seguros en entornos de alto riesgo. Si quieres ver el resultado final de esta arquitectura antes de seguir leyendo, mira este video: <a href="https://www.youtube.com/watch?v=e1GuL9CYWAk">Mejorar la relevancia de búsqueda en segundos: presentamos PRISM</a>.</p><h2>Por qué interpretar consultas suele ser complicado</h2><p>Almacenar políticas como código (bloques if/else en la capa de aplicación) produce decenas de miles de líneas de lógica frágil que carece de cualquier indexación para una recuperación eficiente de políticas en tiempo de consulta. La iteración es lenta (un simple cambio en el comportamiento de una consulta puede requerir un ciclo de despliegue de seis semanas), la responsabilidad no está clara (¿por qué cambiaron los resultados?) y los usuarios de negocio no pueden modificar el comportamiento de búsqueda sin la intervención del equipo de ingeniería. Esto se muestra en el lado izquierdo de la siguiente imagen:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb84f89f4d9029df7/6a170f806234e077cddb1ab6/4e2cd5244ef8b9a05af6337a4825252f321a9a43-1377x768.png" alt="Imagen con dos encabezados, “Políticas como código” a la izquierda y “Políticas como datos” a la derecha. En el lado izquierdo se muestran bloques de código condicional que definen reglas para el manejo de consultas, junto con notas sobre el despliegue, los ciclos de cambio y la evaluación secuencial. En el lado derecho se muestran los objetos de política JSON con títulos, términos de coincidencia, acciones, filtros y prioridades, junto con notas sobre el almacenamiento en un índice de Elasticsearch, el comportamiento de actualización y la coincidencia indexada." /><p>En la parte derecha de la imagen de arriba se muestra cómo almacenar políticas como datos en un índice de Elasticsearch. Este enfoque resuelve todos los problemas asociados con la lógica de resolución de consultas codificada de forma rígida. Sin embargo, para que esto funcione, necesitas una manera de determinar rápidamente qué políticas coinciden con la consulta del usuario y cómo se deben resolver los conflictos. Aquí es donde entra en juego el plano de control gobernado.</p><h2>El patrón del plano de control</h2><p>Entre la consulta original del usuario y la recuperación de Elasticsearch se interpone un plano de control gestionado. Recibe texto del usuario como entrada, y su salida es un plan de ejecución que incluye filtros, refuerzos y decisiones de enrutamiento de recuperación.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0585c90830d63d02/6a170f82964cea7a5908bc8b/5562da5de521f3c83ed55a13e9be87ca7fa70109-546x489.png" alt="Diagrama que ilustra dos flujos de búsqueda a través de un plano de control gobernado: uno en el que una consulta de texto para “naranjas” se reescribe con una restricción de categoría antes de la búsqueda del producto, y otro donde una consulta semántica para “regalo para el abuelo” se reescribe y se enruta para recuperar productos coincidentes de un catálogo de productos." /><p>Un pipeline del plano de control consiste en:</p><ol><li><p><strong>Consulta del usuario: </strong>un usuario ingresa un texto de lo que está buscando, como “naranjas” o “regalo para el abuelo”.</p></li><li><p><strong>Búsqueda de políticas: </strong>hacer coincidir la consulta del usuario con el índice de políticas.</p></li><li><p><strong>Arrojar políticas coincidentes:</strong> las políticas que coinciden con la consulta del usuario se recuperan del índice de políticas.</p></li><li><p><strong>Aplicación de políticas: </strong>la capa de control analiza las políticas arrojadas y combina las políticas coincidentes en un único plan de ejecución coherente que incluye filtros, refuerzos, anulaciones y barreras de seguridad, y aplica el método de recuperación adecuado (por ejemplo, recuperación léxica, recuperación semántica o híbrida).</p></li><li><p><strong>Ejecutar:</strong> la consulta <em>consciente de la intención</em> modificada de Elasticsearch se pasa a la aplicación para ejecutarse contra un índice de catálogo de productos.</p></li><li><p><strong>Explicar (opcional):</strong> además de crear una consulta que proporciona resultados alineados con el negocio y la intención, el plano de control ofrece una carga útil opcional de explicabilidad para mostrar qué políticas se activaron y cómo se combinaron.</p></li></ol><p>Encontrar qué políticas deben aplicarse para el texto de búsqueda de un usuario requiere una primitiva de coincidencia inversa rápida, que resolvemos con la <a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-percolate-query">búsqueda percolator</a>. Después de recuperar las políticas relevantes, es necesario un marco de trabajo de juicio para combinar múltiples políticas emparejadas en un plan de ejecución unificado: prioridades, estrategias de conflicto, seguimiento de frases consumidas y transformaciones en cascada que aplican las políticas en secuencia en vez de forma independiente. Además, se debe seleccionar la tecnología de recuperación más adecuada (por ejemplo, <a href="https://www.elastic.co/elasticon/conf/2016/sf/improved-text-scoring-with-bm25">BM25</a> para “naranjas” frente a la <a href="https://www.elastic.co/docs/solutions/search/semantic-search">búsqueda semántica</a> de “regalo para el abuelo”).</p><h2>Consulta de políticas: verificación de la consulta antes de buscar productos</h2><p>Cuando un comprador escribe una consulta, un sistema de búsqueda con un plano de control regulado no envía esa consulta directamente para que se ejecute en el catálogo de productos. Primero, la consulta se compara con un conjunto de políticas almacenadas y se modifica para reflejar la intención de la consulta y las prioridades del negocio.</p><h3>Estructura de la política</h3><p>Cada póliza es un documento simple que define dos cosas:</p><ul><li><p><strong>Criterio de coincidencia:</strong> Qué texto de búsqueda debería activar esta política. Esto puede ser una frase exacta, una sola palabra, un patrón o una combinación.</p></li><li><p><strong>Acción:</strong> qué hacer cuando se activa la política. Esto podría consistir en aplicar un filtro de categoría, excluir productos, establecer un límite de precio o cambiar la estrategia de búsqueda.</p></li></ul><p>El sistema busca todas las políticas que coinciden, las integra en un plan de ejecución y solo entonces ejecuta la búsqueda de productos. Tomadas en conjunto, las políticas actúan como un asociado conocedor de la tienda que entiende lo que estás buscando y te guía hacia el pasillo correcto.</p><h3>El patrón de política</h3><p>Los primeros artículos de esta serie introdujeron ejemplos de políticas en acción: restringir "naranjas" a la categoría de productos, tratar "sin maní" como una exclusión y dirigir "regalo para el abuelo" a la recuperación semántica. El punto arquitectónico clave es que, en cada caso, la consulta se verifica con las políticas almacenadas antes de que comience la búsqueda del producto. Las políticas determinan qué restricciones aplicar, qué texto modificar y qué estrategia de recuperación utilizar. La consulta al catálogo de productos se realiza después de que se hayan aplicado las políticas y se haya creado una nueva consulta reescrita.</p><h3>Por qué es rápido</h3><p>Un sistema de comercio electrónico empresarial puede tener millones de productos, pero solo cientos o miles de políticas. El paso de búsqueda de políticas implica buscar en un índice pequeño y curado, no en el catálogo completo de productos, y por lo tanto es rápido. Y como las políticas se almacenan como datos en su propio índice, un comerciante que agregue una nueva política no tiene que tocar el código de la aplicación, y un ingeniero que optimice la búsqueda de productos no tiene que tocar el índice de políticas. Las dos preocupaciones evolucionan por su cuenta.</p><p>Los ejemplos anteriores describen qué sucede a nivel conceptual. Detrás de escena, la búsqueda de políticas se implementa usando el tipo de <a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-percolate-query">consulta percolator</a> de Elasticsearch, que está diseñado específicamente para este tipo de patrón: hacer coincidir el texto entrante con un conjunto de consultas almacenadas. La <a href="https://www.elastic.co/search-labs/blog/elasticsearch-percolator-search-governance">Parte 4</a> de esta serie proporciona una inmersión práctica y profunda en la implementación de percolator, incluyendo mapeos de índices, marcadores de límite y seguimiento de frases impulsado por resaltado. Ya que la Parte 4 cubre la totalidad del mecanismo de búsqueda, pasemos a lo que realmente contiene un documento de política y cómo el plano de control compone múltiples políticas en un solo plan de ejecución.</p><h2>Ejemplos de políticas</h2><p>Ahora que ya sabemos qué hacen las políticas en teoría, veamos qué contienen en realidad. Las dos políticas que aparecen a continuación se han diseñado para que entren en conflicto de forma intencionada, lo que servirá para demostrar el sistema de resolución de conflictos que se describe en las secciones siguientes.</p><h3>Chocolate barato</h3><p>La política que se muestra a continuación detecta si un usuario ha enviado una búsqueda que contiene la frase “chocolate barato”. Si es así, los resultados se restringen a las categorías de “chocolates” y “chocolates con leche”. Esta política también aplica un filtro de precio de $2. Además, observa que esta política tiene una prioridad de 210; retomaremos esto cuando veamos la resolución de conflictos con más detalle.</p><p>La configuración del modo de filtro y la estrategia de conflicto que se muestran aquí (hard_filter, soft_boost, restrict, override) se explican en detalle en la sección de resolución de conflictos a continuación.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltada4d46e2ab26208/6a170f836f7f04f91f914924/bbcd66b20fc3aa861b5880ca67daf8e809698717-1002x890.png" alt="Interfaz que muestra una configuración de regla con una frase de coincidencia para “chocolate barato”, filtros de categoría y precio, un campo de eliminación de frase y ajustes de prioridad." /><p>Cuando se activa la política anterior, una búsqueda de “chocolate barato” respeta el filtro de precio de $2 y restringe los resultados a las categorías de “chocolates” y “chocolates de leche”. A continuación se muestran los resultados de ejemplo:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt368bdfbb9a6e5a5e/6a170f8566c4f975a1f8c10f/3f373af9a985864315d7639440a416e45a882a1b-1133x1146.png" alt="Interfaz que muestra una configuración de regla con una frase de coincidencia para “chocolate barato”, filtros de categoría y precio, un campo de eliminación de frase y ajustes de prioridad." /><h3>Chocolate de Navidad</h3><p>La política que se muestra a continuación es un ejemplo de una política que uno podría imaginar aplicando en Navidad. Este ejemplo restringe los resultados a “comidas y bebidas navideñas” y “dulces navideños”, refuerza cualquier producto que también esté en la categoría “calendarios de Adviento” y aplica un filtro de precio de menos de $7 para enfocarse en artículos de temporada asequibles. Además, ten en cuenta que esta política tiene una prioridad de 300. Lo retomaremos cuando veamos la resolución de conflictos con más detalle.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta3428d211f2d8304/6a170f86839dfa0049dcffb3/8f1179342d0e05cf78266d142b046021a3694368-1007x941.png" alt="Captura de pantalla de una interfaz de consulta de reglas de Elasticsearch que muestra una consulta match_phrase para “chocolate”, reglas de filtro basadas en categorías y precio, opciones de manejo de conflictos y configuraciones de prioridad de reglas." /><p>Cuando la política anterior se activa sin ninguna política conflictiva, una búsqueda de “chocolate” respeta el filtro de precio de $7, y restringe los resultados a las categorías de “comida y bebidas navideñas” y “dulces navideños”, y refuerza cualquier producto etiquetado como “calendarios de Adviento”. A continuación se muestran los resultados de ejemplo:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0e7f1fe91b2cadcd/6a170f8866c4f90b0af8c113/662b0e40cb3a9291c17816c33169e9ff5b68f98d-1129x1085.png" alt="Página de resultados de búsqueda que muestra una consulta para “chocolate” con filtros de categoría y marca a la izquierda y una lista de productos del calendario de Adviento de chocolate con imágenes, precios, categorías y descripciones a la derecha." /><h2>Combinación de políticas coincidentes</h2><p>La consulta de políticas que acabamos de describir es solo la mitad de la cuestión. La otra mitad es lo que sucede cuando varias políticas coinciden con la misma búsqueda.</p><p>En cualquier despliegue no trivial, una sola consulta activará de forma rutinaria varias políticas a la vez. "Chocolate barato" coincidirá con ambas políticas que ya demostramos. Cada política es correcta de forma aislada. La parte difícil consiste en combinarlas en un único plan de ejecución coherente, sin contradicciones, sin contar dos veces lo mismo y sin que una política anule en silencio el trabajo de otra.</p><p>Esto no es un problema de búsqueda; es un problema de juicio. El sistema debe decidir:</p><ul><li><p><strong>Orden de solicitud:</strong> si una política de negación elimina "sin maní" de la consulta, ¿la política de precios sigue viendo el texto original o el texto modificado?</p></li><li><p><strong>Filtrar conflictos:</strong> si dos políticas establecen diferentes límites de precio, ¿cuál gana? ¿El perdedor se elimina en silencio o se degrada poco a poco en un refuerzo leve?</p></li><li><p><strong>Propiedad de frase:</strong> si dos políticas coincidieron en la misma palabra y la primera ya la consumió, ¿debería activarse la segunda?</p></li></ul><p>Una implementación ingenua (aplicar todas las políticas coincidentes de forma independiente, combinar los resultados) falla apenas interactúan las políticas. La arquitectura necesita un modelo explícito de cómo se componen las políticas. Las siguientes dos secciones describen ese modelo: un marco de trabajo de prioridad y resolución de conflictos; y un modelo de transformación en cascada que hace que la interacción de políticas sea determinista.</p><p>La idea clave es que la aplicación de políticas no es un conjunto de operaciones independientes, sino una transformación en cascada. Cada política recibe el estado de reescritura producido por todas las políticas de mayor prioridad y lo transforma aún más:</p><p>estado inicial → [Política A] → estado' → [Política B] → estado'' →... → plan de ejecución</p><p>El estado lleva el texto de la consulta reescrito, los filtros acumulados, la intención actual y cualquier expansión de sinónimos. Una política de alta prioridad puede eliminar texto de la consulta, y cada política subsiguiente ve la consulta modificada, no la original. El contexto se acumula. El orden importa.</p><h2>Precedencia y resolución de conflictos: el determinismo importa</h2><p>Las estrategias específicas de conflicto son una elección de diseño. Cada organización puede resolver los conflictos de manera diferente, según sus necesidades empresariales. El siguiente enfoque ilustra el tipo de marco de trabajo que necesita un plano de control. Lo importante no son estas estrategias concretas, sino que el sistema cuente con estrategias explícitas y deterministas, en lugar de dejar que los conflictos se resuelvan mediante interacciones impredecibles.</p><h3>Orden de prioridad</h3><p>Las políticas se ordenan por prioridad (la más alta primero). Cuando varias políticas coinciden con la misma consulta, se aplican en orden de prioridad. Si dos políticas intentan establecer el mismo campo de filtro, la estrategia declarada por la política de mayor prioridad para ese campo tiene prioridad. Si hay varias políticas activadas que tienen la misma prioridad, entonces se da preferencia a la política con el ID más alto (como si se le hubiera asignado una prioridad más alta); esta elección asegura un comportamiento determinista cuando surgen conflictos.</p><h3>Resolución por campo, no por política</h3><p>Un principio fundamental de diseño: la resolución de conflictos opera por campo (por ejemplo, marca, categoría o descripción), no por política. Cuando dos políticas producen filtros que se superponen en campos específicos, solo esos campos específicos se ven afectados por la estrategia de resolución de conflictos, y la estrategia de resolución la define la política de coincidencia de mayor prioridad. Los campos no conflictivos de ambas políticas permanecen intactos.</p><p>Esto importa porque la alternativa de un enfoque por política obligaría al sistema a aceptar o rechazar una política completa cuando solo uno de sus campos entra en conflicto.</p><p>La resolución por campo conserva la mayor cantidad posible de información útil sobre restricciones.</p><h3>Tres configuraciones por campo del filtro</h3><p>Cada campo de filtro de una política tiene tres configuraciones independientes:</p><p><strong>Modo de filtro:</strong> cómo se aplica el filtro cuando no hay conflicto.</p><ul><li><p><code>hard_filter</code> (predeterminado): se aplica como una cláusula <a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-bool-query#score-bool-filter">Elasticsearch </a><a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-bool-query#score-bool-filter"><code>bool.filter</code></a>. Esto es útil para excluir por completo productos no relacionados. Por ejemplo, restringir la búsqueda de "naranjas" a la categoría de productos elimina resultados como jugo de naranja y mermelada de naranja. Los documentos que no coinciden se excluyen por completo de los resultados.</p></li><li><p><code>soft_boost</code>: aplicado como un peso <a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-function-score-query">de Elasticsearch </a><a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-function-score-query"><code>function_score</code></a> con un <code>boost_weight</code> configurable. Los documentos que coinciden obtienen un refuerzo en la clasificación, pero los documentos que no coinciden no se excluyen. Esto es útil, por ejemplo, para reforzar una marca sin dejar de lado a las demás.</p></li></ul><h3>Estrategia de conflicto</h3><p>Qué ocurre cuando una política de menor prioridad establece el mismo campo:</p><ul><li><p><code>override</code>: El valor de esta política de alta prioridad gana; el valor de menor prioridad se descarta por completo. Válido para todos los tipos de campos.</p></li><li><p><code>restrict</code>: Tomemos el valor numérico más restrictivo (por ejemplo, el techo inferior para el precio__max, the higher floor for price__min). Válido solo para campos numéricos de rango.</p></li><li><p><code>merge</code>: Combina ambos valores en una unión. Válido solo para campos no numéricos.</p></li><li><p><code>soft_boost</code>: Convierte el filtro en conflicto a un peso <code>function_score</code> con un <code>boost_weight</code> configurable en lugar de un filtro estricto. Para más detalles sobre el aumento de function_score, consulta <a href="https://www.elastic.co/search-labs/blog/bm25-ranking-multiplicative-boosting-elasticsearch">Cómo influir en el ranking de BM25 con aumento multiplicativo en Elasticsearch</a>. Esto solo es válido para campos no negativos.</p></li></ul><p><strong>Valor:</strong> el valor real del filtro (por ejemplo, una lista de categorías, un umbral de precio).</p><p><strong>Estrategias por tipo de campo: </strong>no todas las estrategias tienen sentido para todos los tipos de campo. Por ejemplo, una exclusión es inherentemente binaria, por lo que no se puede reforzar de forma leve. La siguiente tabla muestra qué estrategias están disponibles para cada tipo de campo:</p><p>Tipo de campo</p><p>Estrategias disponibles</p><p>Predeterminado</p><p>Campos de negación (__not, __match__not)</p><p>anular, fusionar</p><p>anular</p><p>Campos de rango numérico (__max, __mín, __gt, __lt)</p><p>restringir, anular, soft_boost</p><p>restringir</p><p>Todos los demás campos (palabra clave, texto)</p><p>soft_boost, anular, fusionar</p><p>soft_boost</p><p>Los campos de negación no se pueden reforzar de forma leve porque las exclusiones son binarias. Convertir "nunca mostrar alimentos enlatados" a "leve preferencia por alimentos no enlatados" cambia fundamentalmente la semántica; un producto de "alimentos enlatados" aún aparecería, solo clasificado ligeramente más abajo, lo que anula el propósito de la exclusión.</p><h2>Un ejemplo concreto: buscar "chocolate barato" durante una campaña de Navidad</h2><p>Suponga que un comerciante ha creado las dos políticas para el chocolate que demostramos previamente, una de menor prioridad para el chocolate barato y otra política relacionada con el chocolate de mayor prioridad que se habilitará durante Navidad. Si ambas de estas políticas están habilitadas, entonces cómo se combinan depende del modo de filtro y la estrategia de conflicto de la política de mayor precedencia. Si ambas de las políticas previamente discutidas están habilitadas, se combinarán de la siguiente manera:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf930b42611a6126c/6a170f8aacf088ae28be9c1b/0405e193522172bde283180df96ed3651178fafc-529x447.png" alt="Captura de pantalla que muestra un pipeline donde una consulta inicial “chocolate barato” se modifica mediante múltiples reglas, incluidos filtros de categoría y precio agregados, comportamiento de resolución de conflictos, prioridades de reglas y una consulta final transformada de “chocolate”." /><p>Esto muestra dos conflictos, uno en categorías y uno en precio. Vale la pena señalar que la consulta que se ejecutará después de esta transformación tiene las siguientes características:</p><ul><li><p>Solo se mostrarán productos de las categorías “Comidas y bebidas navideñas” y “Dulces navideños”.</p></li><li><p>Dentro de esas categorías, si los productos también están etiquetados como pertenecientes a la categoría “Calendarios de Adviento”, recibirán un impulso de 3x.</p></li><li><p>Se aplica un filtro de precio por $2, que proviene de la política de menor prioridad (porque la política de mayor prioridad especificada es “Restringir” en caso de conflicto).</p></li><li><p>La palabra “barato” se elimina, así que se arrojan solo los productos que coinciden con “chocolate”.</p></li></ul><p>Con ambas políticas habilitadas, “chocolate barato” devuelve resultados similares a la imagen que se muestra a continuación:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7e3c2ee36f963e8c/6a170f8ccdacbf5be17d2ac2/01bbab1c5bd3d0fd37e39c25973d60141f9796e9-1126x1123.png" alt="Página de resultados de búsqueda que muestra una consulta para “chocolate barato”, con filtros de categoría y marca a la izquierda y una lista de productos del calendario de Adviento de chocolate con imágenes, precios y detalles del producto a la derecha." /><h3>Relajación de restricciones</h3><p>Tal vez el minorista no quiere excluir productos en las categorías de “chocolates” y “chocolates de leche” durante Navidad. La configuración de la política de Navidad podría haber excedido los límites y eliminado inadvertidamente las categorías aplicadas por la política de "chocolate barato". Este es un ejemplo que muestra por qué podría ser más deseable combinar políticas de menor prioridad con políticas en conflicto de mayor prioridad. Por ejemplo, podríamos modificar la promoción de chocolates de Navidad para que, en lugar de "anular" en caso de conflicto, hagamos un refuerzo leve. El cambio a esa política sería el siguiente:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbb7393566aeab705/6a170f8db0367d5b6472bde2/45e88311014d67933ca8cf8381d8f91de090e2b4-1090x103.png" alt="UI que muestra una regla de política de búsqueda con el campo establecido en Categorías, operador establecido en Iguales, valores “Alimentos y bebidas navideñas” y “Dulces navideños”, manejo de conflictos configurado en Leve con prioridad 1 y modo de filtro configurado en Filtro duro." /><p>Después de esta modificación, la ejecución de la pipeline de transformación del reescritor de consultas para “chocolate barato” tiene el siguiente aspecto:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6b4453b35b5f8ef0/6a170f8fb339d5ba9b76a09a/396b360e48327421c2c38bcf4a039fb1a6d5a8e0-519x445.png" alt="Captura de pantalla de una pipeline de transformación que muestra cómo la consulta inicial “chocolate barato” se modifica mediante múltiples reglas, incluidos filtros de categoría, límites de precio, modos de refuerzo leve y filtro duro, resultados de manejo de conflictos, prioridades de reglas y una consulta final de “chocolate”." /><p>Con el refuerzo leve en caso de conflicto, los filtros conflictivos se convierten en refuerzos leves en vez de ser descartados. La consulta que se ejecutará en el catálogo de productos luego de esta transformación tiene las siguientes características:</p><ul><li><p>Debido a que “En conflicto” se especifica como “Refuerzo leve” en la política de mayor prioridad, los conflictos se convertirán en impulsos de la siguiente manera:</p><ul><li><p>Los productos de las categorías “comidas y bebidas de Navidad” y “dulces de Navidad” tendrán un refuerzo de 1 vez aplicado.</p></li><li><p>A los productos de las categorías “chocolates” y “chocolates con leche” se les aplicará un refuerzo de 3 veces.</p></li></ul></li><li><p>Como en el ejemplo anterior, si los productos también están etiquetados como en la categoría “calendarios de Adviento”, se reforzará tres veces.</p></li><li><p>Como en el ejemplo anterior, se aplica un filtro de precio de $2.</p></li><li><p>La palabra “barato” se elimina, así que se arrojan solo los productos que coinciden con “chocolate”.</p></li></ul><p>Con filtrado relajado, los resultados se ven así:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0288336675c509ef/6a170f917d8d6723bc70e808/7a68c54d878dadfe8b1821dd3860b7b60f9ce45f-1126x1123.png" alt="Página de resultados de búsqueda para la consulta “chocolate barato”, que muestra filtros de categoría y marca a la izquierda y una lista de productos a la derecha, con varios artículos de chocolate, precios, categorías y un total de 6895 resultados indicados en la parte superior." /><h3>Anulando precio desde una política de alta prioridad</h3><p>O tal vez el minorista quiere permitir que se muestren chocolates un poco más caros durante Navidad aumentando el precio máximo a $7. Para asegurarnos de que el precio máximo de la política de chocolates navideños no se invalide si alguien hace una "búsqueda de chocolates baratos", podemos establecer el modo de conflicto en el precio en "anular" en lugar de "restringir", de la siguiente manera:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltae1b40d312cf59e6/6a170f92cdacbfa1277d2ac6/c2621e6513281f545b84eb77362f2b93e1c46a1f-996x70.png" alt="UI que muestra una regla de política de búsqueda con el campo establecido en Precio, operador establecido en Menos que, valor establecido en 7, manejo de conflictos configurado en Anular y modo de filtro configurado en Filtro duro." /><p>Con esta anulación, la consulta para “chocolate barato” ignora el precio máximo que se define en la “política de chocolate barato” y solo aplica el precio especificado en la “política de chocolates de Navidad”, de la siguiente manera:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4a47aa71c925b4a3/6a170f94ab7f0863d3db9f6d/d50da7900beb3c08439e9fd79cbe2ddd98196441-511x389.png" alt="Captura de pantalla de un pipeline de transformación que detalla cómo la consulta inicial &quot;chocolate barato&quot; es procesada por dos reglas de filtrado, mostrando los filtros de categoría y precio agregados, los modos de filtrado estricto y de refuerzo leve, los resultados del manejo de conflictos, las prioridades de las reglas y la eliminación de un filtro de precio debido a un conflicto." /><p>Esto es similar al ejemplo anterior, con la diferencia de que el precio máximo se establece en el valor de $7 de la política de mayor prioridad porque esa política especificó “Anular” en caso de conflicto. Con el filtro de precios de Navidad como prioridad, los resultados se ven así:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2b9ac1a62437c967/6a170f96839dfa3f58dcffb9/635ee6353ba84727486e7e053764788fb26b6f44-1134x1079.png" alt="Página de resultados de búsqueda para la consulta &quot;chocolate barato&quot;, que muestra filtros de categoría y marca a la izquierda y una lista de productos de chocolate a la derecha, incluyendo varios calendarios de Adviento con imágenes, precios, categorías y un total de 10 000 resultados mostrados." /><p>Estas tres variantes (override, soft_boost y override on price) demuestran una propiedad clave del sistema: un comerciante puede cambiar cómo interactúan dos políticas modificando una configuración en un solo campo dentro de una sola política, sin necesidad de desplegar ningún código. La estrategia de conflicto es el interruptor que controla el comportamiento empresarial.</p><h2>Seguimiento de frases consumidas</h2><p>Hay un tipo de conflicto más sutil: dos políticas que coinciden en la misma frase. Si una política de mayor prioridad elimina "sin maní" de la consulta, una política de menor prioridad que también coincidió con "sin" no tiene nada sobre lo que actuar. El sistema detecta si la frase coincidente ya no está presente en la consulta reescrita y omite la política de menor prioridad.</p><p>Las políticas de intención están exentas del seguimiento de frases consumidas: establecen la estrategia de recuperación basada en la coincidencia de la consulta original, independientemente del texto que se haya eliminado por políticas de mayor prioridad.</p><p>El orden de prioridad, la resolución de conflictos por campo y el seguimiento de frases consumidas juntos otorgan al plano de control un modelo de composición determinista. Con esa base establecida, el sistema puede tomar una decisión de enrutamiento que sería arriesgada sin ella.</p><h2>La gobernanza hace que la estrategia de recuperación sea segura</h2><p>Una información importante sobre el enrutamiento al método de recuperación correcto (texto, semántico o híbrido) es que se ejecuta luego de la gobernanza. Si tus políticas ya han aplicado la categoría de "producto", entonces la recuperación semántica se vuelve mucho menos riesgosa porque el conjunto de candidatos está restringido. Una búsqueda semántica sobre 500 productos es una propuesta muy diferente a una búsqueda semántica sobre 500 000 SKU. La gobernanza reduce el radio del impacto antes de que comience la recuperación.</p><p>Por ejemplo, sin gobernanza, una consulta semántica para “fruta con alto contenido de vitamina C por menos de $4”, además de frutas, podría devolver botellas de vitaminas, zanahorias y pimientos verdes. El plano de control se encarga de que esos resultados no deseados ni siquiera se tengan en cuenta como parte de la expansión semántica.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdaa3ff1bb3afaa36/6a170f97acf088954bbe9c1f/6dccd5b8a94bfa81f68e3d1c4ad8929ce8cc4e5e-990x378.png" alt="Diagrama que muestra una consulta de búsqueda que fluye desde un usuario a través de un servidor de aplicaciones y un plano de control, donde se buscan reglas de coincidencia, la consulta se reescribe con intención semántica, incluyendo restricciones de categoría y precio, y los resultados se recuperan de un catálogo de productos, excluyendo los productos que no coinciden." /><p>Con esa restricción en vigor, el plano de control aplica una lógica de enrutamiento práctica:</p><ul><li><p><strong>Léxico</strong> para consultas de navegación y principales donde la precisión determinista es importante.</p></li><li><p><strong>Semántico</strong> para consultas de descubrimiento descriptivo donde la coincidencia de conceptos ayuda.</p></li><li><p><strong>Híbrido</strong> selectivamente, cuando las restricciones ya han sido aplicadas y el negocio acepta una recuperación más amplia.</p></li></ul><h2>De la arquitectura a la implementación</h2><p>El plano de control gestionado traduce la intención comercial en planes de ejecución deterministas y componibles, sin incorporar esa lógica en el código de la aplicación. Las políticas son datos: se emparejan en el momento de la consulta, se resuelven mediante estrategias explícitas de conflicto por campo y se aplican como transformaciones en cascada que producen resultados explicables. Elastic Services Engineering ha construido y desplegado esta arquitectura para equipos de comercio electrónico empresarial, utilizando patrones repetibles y aceleradores que abarcan el camino desde el concepto hasta la producción. Puedes ver una demostración de nuestra implementación de un plano de control en YouTube en: <a href="https://www.youtube.com/watch?v=e1GuL9CYWAk">Mejorar la relevancia de búsqueda en segundos: presentamos PRISM</a>.</p><h3><strong>Lo que se viene</strong></h3><p>La siguiente publicación aborda la implementación de forma práctica: cómo el percolator de Elasticsearch impulsa la consulta de políticas, incluso los mapeos de índices, los marcadores de límites, el seguimiento de frases basado en resaltados y los ejemplos concretos de consultas.</p><h2>Pon en práctica la búsqueda gobernada de comercio electrónico</h2><p>La arquitectura del plano de control descrita en esta publicación (resolución de conflictos por campo, transformaciones en cascada de políticas y enrutamiento de recuperación con restricciones de gobernanza) fue diseñada y construida por Elastic Services Engineering. Todos los patrones, capturas de pantalla y pipeline de transformación que se muestran en esta serie provienen de un sistema operativo creado por Elastic Services Engineering y validado con catálogos de productos a escala empresarial.</p><p>Si quieres implementar un plano de control regulado y basado en políticas en Elasticsearch, <a href="https://www.elastic.co/consulting">Elastic Services</a> te ayuda a lograrlo más rápido.</p><h2>Únete a la discusión</h2><p>¿Tienes preguntas sobre la gestión de búsquedas, las estrategias de recuperación o la arquitectura de búsqueda en el comercio electrónico? Únete a la <a href="https://discuss.elastic.co/">conversación general de la comunidad de Elastic</a>.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/ecommerce-search-governance-control-plane-architecture</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/ecommerce-search-governance-control-plane-architecture</guid>
    <category><![CDATA[Operaciones]]></category>
    <dc:creator><![CDATA[Alexander Marquardt,Honza Král,Taylor Roy]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb84f89f4d9029df7/6a170f806234e077cddb1ab6/4e2cd5244ef8b9a05af6337a4825252f321a9a43-1377x768.png" length="0" type="image/png"/>
    <pubDate>Fri, 01 May 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Reindexación de flujos de datos debido a conflictos de mapping]]></title>
    <description><![CDATA[Descubre cómo solucionar los conflictos de mapeo de Elasticsearch reindexando los flujos de datos. Este blog explica el proceso de reindexación y la verificación del mapeo correcto.]]></description>
    <content:encoded><![CDATA[<p>Cuando surgen conflictos de mapping en los campos, ya sean del estándar Elastic Common Schema (ECS) o específicos de la fuente de datos, es necesario reindexar tus datos con Herramientas de desarrollo. Estos conflictos pueden afectar negativamente cualquier función posterior tras la ingestión, lo que provoca resultados inexactos o impide el uso del conjunto de datos completo en características como visualizaciones, dashboards, la app de Security y agregaciones. Esta publicación de blog detalla los pasos para este proceso de reindexación.</p><p>El contenido de este blog se ha elaborado y verificado utilizando las versiones 9.2.8 y 8.19.14 de Elastic, junto con las versiones 2.3.0 y 1.2.0 de Filestream Integration.</p><p><strong>Nota importante:</strong> Dependiendo de tu entorno, algunos pasos pueden requerir modificaciones específicas. Además, ten en cuenta que las plantillas dinámicas se eliminaron de la plantilla del componente <code>@package</code> a partir de la versión 2.3.3 de Filestream Integration.</p><p>Antes de comenzar el proceso de reindexación, es importante considerar la asignación actual de almacenamiento en tu entorno. Los pasos descritos a continuación implican crear una copia del índice de respaldo existente, que residirá temporalmente en el <a href="https://www.elastic.co/docs/manage-data/lifecycle/data-tiers">nivel de datos caliente</a>.</p><p><u><strong>Niveles de datos de Elasticsearch</strong></u></p><ul><li><p><strong>Caliente: </strong>el nivel caliente es el punto de entrada de Elasticsearch para los datos temporales, donde se almacenan los datos más recientes y buscados con frecuencia. Los nodos de nivel caliente requieren lecturas y escrituras rápidas, lo que necesita más recursos y almacenamiento más rápido (SSD). Este nivel es obligatorio y los nuevos índices de flujos de datos se asignan automáticamente aquí.</p></li><li><p><strong>Tibio: </strong>los Datos temporales pueden pasar al nivel tibio una vez que se consultan con menos frecuencia que los datos indexados recientemente en el nivel caliente. El nivel tibio suele contener datos de las últimas semanas. Las actualizaciones siguen estando permitidas, pero probablemente sean poco frecuentes. Los nodos en el nivel tibio generalmente no necesitan ser tan rápidos como los del nivel caliente. Para la resiliencia, los índices en el nivel tibio deben configurarse para usar una o más réplicas.</p></li><li><p><strong>Frío: </strong>los datos que son de búsqueda poco frecuente pueden pasar del nivel tibio al frío. El nivel frío, aunque sigue permitiendo realizar búsquedas, prioriza los costos de almacenamiento más bajos frente a la velocidad de búsqueda. Alternativamente, el nivel frío puede almacenar índices regulares con réplicas en lugar de snapshots buscables, lo que permite el uso de hardware menos costoso para datos antiguos sin reducir los requisitos de espacio en disco en comparación con el nivel tibio.</p></li><li><p><strong>Congelado: </strong>los datos que se consultan con poca frecuencia o que ya no se consultan se mueven del nivel frío al congelado para su ciclo de vida restante. Este nivel utiliza un repositorio de snapshot e índices parcialmente montados para almacenar y cargar datos, lo que reduce el almacenamiento local y los costos al tiempo que permite la búsqueda. Las búsquedas en el nivel congelado suelen ser más lentas que en el nivel frío, ya que es posible que Elasticsearch tenga que recuperar los datos congelados del repositorio de snapshot. Recomendamos nodos de nivel congelado dedicados.</p></li></ul><h2>Requisitos previos: determinar qué campos presentan conflictos</h2><p>Para determinar qué campos tienen conflictos de mapping, navega a <strong>Stack Management -&gt; Data Views -&gt; logs-*</strong> (usar la vista de datos logs-* es la jerarquía más alta de datos presente con el prefijo <em>logs-</em>). Si hay algún conflicto, habrá un cuadro amarillo que lo indique. Puedes hacer clic en <strong>Ver conflictos</strong> o, en el cuadro <strong>de tipo de campo</strong> junto al cuadro de <strong>búsqueda </strong>, seleccionar <strong>conflicto</strong>.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7aa17311023e1ae3/6a170feaa929cf24fbae0aa9/7d41594682b601a30a9544b8db678f118b0146ab-2048x720.png" alt="Interfaz que muestra un patrón de índice de logs con una advertencia de conflicto de mapeo y una lista de tipos de campos. El enfoque está en los conflictos en la vista y en el conflicto de tipo de campo." /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb4106cf39e1be69b/6a170feb6f7f047b74914932/41ad800daa6fc244a1123ba7538820bff5de6788-747x182.png" alt="Fila de la tabla que muestra el nombre del campo log.offset con los tipos keyword y long marcados como un conflicto." /><p>Al hacer clic en el botón amarillo <strong>Conflicto</strong>, se mostrará qué índices están asociados con qué tipos de mapping.</p><p>Esta situación (donde el campo se mapea como un <code>keyword</code> y un <code>long</code>) generalmente ocurre porque los datos se ingirieron antes de que se definiera un tipo de mapping específico en la <a href="https://www.elastic.co/docs/manage-data/data-store/templates#component-templates">plantilla de componente</a> para el <a href="https://www.elastic.co/docs/manage-data/data-store/data-streams">flujo de datos</a> relevante. En esos casos, Elasticsearch intenta configurar el mapping basándose en sus plantillas dinámicas.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdcec2cd42e2e858a/6a170feda929cff2e4ae0aad/9973c1935aa52292c1ace09a8e9c0b31ad99e7a2-2048x1085.png" alt="Pantalla que muestra el campo log.offset con una advertencia sobre la discrepancia de tipos y una tabla que enumera los índices de cada tipo." /><p>Para determinar qué mapeo es apropiado para el campo y si el campo es un campo ECS, se necesita verificación con <a href="https://www.elastic.co/docs/reference/ecs/ecs-field-reference">referencia de campo ECS</a>. Si el campo en cuestión no es un campo ECS, hay que revisar su valor para determinar el mapeo correcto.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc22eb597f97cbb24/6a170feed7c02291c5de657c/3c77d0a1520bd1ad17e7ffa1480ecf5e224953e1-418x360.png" alt="" /><p>Si un campo, como <code>log.offset</code> en este ejemplo, no está documentado en el ECS, los siguientes pasos son investigar el valor del campo, determinar qué tipo de mapping conflictivo tiene más índices de respaldo y examinar las plantillas componentes de los otros índices.</p><p>Por lo general, el tipo de mapeo asociado al mayor número de índices es el correcto, pero te recomendamos que compruebes el valor del campo en cuestión para asegurarte de ello. Para confirmar la validez de un tipo de mapeo (por ejemplo, <code>long</code>), también debes verificar que el valor del campo sea apropiado para ese tipo. Esta verificación se puede realizar empleando <strong>Discover </strong>para buscar el campo en cuestión. Revisar otros flujos de datos que contengan el mismo campo también puede servir como confirmación adicional.</p><p>Para revisar los valores presentes en el campo con el problema de mapping, vuelve al botón amarillo <strong>Conflicto</strong>mencionado anteriormente, haz clic en el botón <strong>Conflicto</strong>, selecciona uno de los índices de respaldo y péguelo en una sesión de <strong>Discover </strong>. Tu declaración del lenguaje de búsqueda de Kibana (KQL) debería verse como la siguiente captura de pantalla, para incluir el delimitador de campo <strong><code>_index</code></strong><strong>:</strong>.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4b1966dbd35b7264/6a170ff00c4857919a01ab52/781f63b34a9abd427ceb896484da29af446e3326-2048x1063.png" alt="Pantalla que muestra el campo log.offset con una advertencia sobre un conflicto de tipo, además de una tabla que enumera los índices para cada tipo." /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdf3bb65faeb1e94b/6a170ff214b2701bfbe3c6c3/b7b0cb847c1694ab605c61a538722f5be004ec86-2048x909.png" alt="Pantalla que muestra un histograma basado en el tiempo y una tabla de entradas de log con marcas de tiempo y valores de log.offset." /><h2>Prepara la nueva plantilla de componente personalizado del índice de respaldo</h2><p>Para abordar el conflicto de mapping en el flujo de datos, primero examina la plantilla de componentes correspondiente <code>@package</code>. Puedes encontrar esto en <strong>Stack Management -&gt; Gestión de indexación&gt; Plantilla de componentes</strong>. Busca el flujo de datos y selecciona el enlace <code>@package</code> correspondiente. Esta plantilla contiene mapping para el campo listos para usar y, aunque no es común tener una falta de coincidencia de mapping, es posible que se pase por alto el tipo más apropiado.</p><p>Revisa la plantilla para asegurarte de que contiene el anidamiento y el mapeo de campos necesarios para el campo en cuestión. Por ejemplo, si la plantilla indica incorrectamente <code>log.offset</code> como <code>keyword</code>, esta es la fuente del problema.</p><p><strong>Importante:</strong> Debido a que no se recomienda modificar las plantillas <code>@package</code>/administradas, debes usar o crear una plantilla de componente <code>@custom</code> para corregir el tipo de mapeo (por ejemplo, para <code>log.offset</code>) para todos los datos futuros.</p><ul><li><p>No recomendamos modificar las plantillas <code>@package</code>/administradas, ya que cuando actualices la integración a una versión más reciente, cualquier cambio que realices en la plantilla <code>@package</code> se sobrescribirá. Por eso recomendamos usar las plantillas de <code>@custom</code> .</p></li><li><p>Si un flujo de datos experimenta conflictos de mapeo, debes agregar cualquier anidamiento o mapeo de campos faltantes (ECS y no ECS) a la plantilla de componente <code>@custom</code> del flujo de datos. Crea esta plantilla si aún no existe y asegúrate de especificar el tipo de mapeo correcto para el campo.</p></li><li><p>Si tienes varios conflictos en tu data view, aplica todos los mapping faltantes necesarios para el flujo de datos en simultáneo para que la reindexación se realice una vez en lugar de varias veces. Contar con entradas para el ingreso de datos correcto en la plantilla de componentes <code>@custom</code> plantilla de componentes garantizará que cualquier futura ingesta de datos siga la misma pauta de mapping.</p></li></ul><p>Para crear la plantilla de componente <code>@custom</code> (o verificar que está en uso y rellenada), navega a <strong>Plantillas de Índice</strong>, escribe el nombre del flujo de datos en cuestión y haz clic en la plantilla de <code>@custom</code> correspondiente que esté usando el flujo de datos. Si la plantilla aún no está creada, aparecerá un cuadro amarillo que te permitirá crear la plantilla a través de la UI.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt17b6cb8aa8f905c2/6a170ff4964cea702708bc97/bea7cb172227bebc28146e3f2f016e112f34cba5-2048x720.png" alt=" Pantalla que muestra una plantilla de índice con su resumen, patrón de índice, valor de prioridad, configuración de flujo de datos y una lista de plantillas de componentes, con el foco en la entrada logs‑filestream.generic@custom ." /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf5b67199089093f4/6a170ff5d7c0220575de6580/e8f63a2e396efbe7f1e62dc08a137a22700be484-2048x296.png" alt=" Pantalla que muestra la interfaz de administración de índices con la pestaña &quot;Plantillas de componentes&quot; seleccionada y una nota de que la plantilla personalizada no existe. El enfoque se centra en &quot;Crear plantilla de componente.&quot;" /><p>La captura de pantalla a continuación muestra la página siguiente una vez que se selecciona <strong>Crear plantilla de componente</strong>. Deja los valores predeterminados tal como están en la primera página y haz clic en <strong>Mappings</strong> o <strong>Siguiente</strong> hasta que llegues a la página <strong>Mappings</strong>.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltca2924bc41cac541/6a170ff7dc55decfd6e00ec5/822f1d864302aa4be438c13756b8372f43fa1b0d-2048x1275.png" alt="" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltee1067cb282ae0af/6a170ff82b835f55bff4b2e5/affa2f1214af516a5a6b571ab813628ed7649275-2048x1235.png" alt="Los mappings de plantillas" /><p>Para establecer explícitamente el mapeo de un nuevo campo que entra o para actualizar un campo que tenga un conflicto de mapeo, cuando el flujo de datos se revierte debido a la configuración establecida en la política de ciclo de vida del índice, se necesita una entrada para el campo en el que existe el conflicto.</p><p>Lo siguiente establecerá el mapeo para el campo <code>log.offset</code> en la plantilla de componente <code>@custom</code> para el flujo de datos filestream. Repite los pasos para agregar cualquier campo personalizado o actualizar los campos necesarios del <code>@package</code> con los mapeos adecuados, si es necesario, para este set de datos. En este ejemplo, al establecer el desplazamiento en <code>Long</code>, el tipo de campo será <code>Numeric</code> y el tipo numérico será <code>Long</code>. Haz clic en <strong>Agregar campo</strong> y luego fuera del área para continuar.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltee1067cb282ae0af/6a170ff82b835f55bff4b2e5/affa2f1214af516a5a6b571ab813628ed7649275-2048x1235.png" alt="Pantalla que muestra la interfaz de creación de plantillas de componentes con el paso &quot;Mappings&quot; seleccionado en el flujo de trabajo." /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt611a10bd7567d211/6a170ffa964cea257008bc9d/ea2975ee4e40ac0e10c4170d2a23125101f7f8da-2048x1136.png" alt=": pantalla que muestra la interfaz de creación de plantillas de componentes con el paso &quot;Mappings&quot; seleccionado en el flujo de trabajo" /><p>Una vez que se hayan agregado todos los campos necesarios, haz clic para revisar y selecciona <strong>Crear plantilla de componente</strong> cuando esté listo. Todos los nuevos datos que se ingesten a partir de este paso tendrán <code>log.offset</code> configurado en <code>long</code>.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3a0c86021cc53e0e/6a170ffcc1e8a57703f8839f/bdf8b8290b0c064c9d88990194b15232ffe85709-2048x1027.png" alt=" Revisión de la plantilla Elasticsearch" /><h2>Creación de la nueva estructura de índice de respaldo</h2><p>El nuevo índice de respaldo debe tener los mappings existentes de la plantilla de componentes del flujo de datos, así como la plantilla de componentes ECS <code>ecs@mappings</code>. La <code>ecs@mappings</code> plantilla de componente se aplica después del componente del flujo de datos como un recurso general para mappings adicionales que potencialmente no se capturaron en las plantillas de componentes anteriores.</p><p>Ve a la pestaña del navegador para ver el mapeo <code>@package</code> del flujo de datos. (Go to <strong>Stack Management -&gt; Gestión de índices -&gt; Plantilla de componentes -&gt; </strong><strong><code>logs-filestream.generic@package</code></strong><strong> -&gt; Gestionar -&gt; Editar</strong>.) Una vez allí, haz clic en la sección <strong>Revisión</strong>, luego en <strong>Solicitar</strong> y finalmente en el botón <strong>Copiar</strong> a la derecha. El contenido JSON de la plantilla de componentes copiada garantizará que se conserven los mapeos y configuraciones de campo restantes mientras actualizamos el mapeo del campo <code>log.offset</code>. El JSON formará la estructura de respaldo para el índice de respaldo recién reindexado.</p><p><strong>Importante: </strong>si no se copiara el JSON de la plantilla y se continuara trabajando con la reindexación, el <code>log.offset</code> conflicto se resolvería, pero habría nuevos conflictos con la integración, ya que no se mantendría la integridad de las asignaciones actuales, lo que crearía un doble trabajo para resolver el problema original.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1de7b9b0e375867e/6a170ffd8b73cb61f318a0f7/402b0431b0e19374e9b28a4374ed51dfa5fa44ba-2048x897.png" alt="Pantalla que muestra la interfaz de creación de plantillas de componentes con el paso de revisión seleccionado en el flujo de trabajo. " /><p>Abre una segunda pestaña del navegador, navega a Herramientas de desarrollo y pega el contenido copiado. Ahora, para limpiar lo que se pegó:</p><p><strong>Modificaciones a la solicitud</strong></p><p><strong>1. Nombre del índice:</strong> Reemplaza <code>_component_template/logs-filestream.generic@package</code> con el nombre del índice de respaldo que pretendes reindexar, añadiendo <code>-1</code> al final. Por ejemplo, usa <code>PUT &lt;backing index to reindex&gt;-1</code>.</p><ul><li><p>El adjunto <code>-1</code> indica una reindexación y no entrará en conflicto con la configuración predeterminada de rollover de ILM, que se basa en la fecha de creación del índice.</p></li></ul><p><strong>2. Configuración:</strong> Elimina la línea <code>"template"</code> (línea 3), así como la última llave de cierre para toda la carga útil JSON; la línea 3 debería comenzar con <code>"settings": {</code>.</p><ul><li><p>Sustituye el contenido interior de la sección de ajustes por <code>"index.codec": "best_compression"</code>. Esta acción aplicará la mejor compresión de Elastic al índice al momento de la creación.</p></li><li><p>Agrega <code>"index.lifecycle.name": "logs"</code>, así como una línea para <code>"index.lifecycle.rollover_alias": ""</code>.</p><ol><li><p>La <code>"index.lifecycle.name": "logs"</code> entrada aplicará la política de ILM de logs al nuevo índice de respaldo. Modifica el nombre de la política de ILM si no usas logs.</p></li><li><p>El <code>"index.lifecycle.rollover_alias": ""</code> está en blanco, ya que este índice de respaldo no se rotará, pero la configuración es necesaria para evitar errores de rotación de ILM en la siguiente fase de ILM después de hot.</p></li></ol></li></ul><p><strong>3. Estructura:</strong> la solicitud ahora debería incluir tanto una sección <code>Settings</code> como una sección <code>Mappings</code>. Dentro de <code>"mappings": {</code>deberías encontrar <code>"dynamic_templates"</code> y una sección de <code>"properties"</code> que contiene campos codificados y sus mappings.</p><p><strong>4. Modificación de plantillas dinámicas: </strong>La sección actual de plantillas dinámicas contiene entradas para campos que pueden sobrescribirse cuando se agregan las <code>ecs@mappings </code>plantillas dinámicas a continuación, lo que provoca redundancia y líneas adicionales que no son necesarias.</p><ul><li><p>Elimina todas las secciones de <code>"dynamic_templates"</code> excepto la segunda sección llamada <code>"_embedded_ecs-data_stream_to_constant": {</code>.</p></li><li><p>Repite el mismo proceso descrito anteriormente, ya que reúne los mappings dinámicos para la plantilla del componente <code>@package</code> , pero esta vez los mappings dinámicos para la plantilla del componente <code>ecs@mappings</code>.</p><ul><li><p>Puede ser más fácil copiar todo el contenido de los mapeos de la interfaz de usuario para la plantilla del componente <code>ecs@mappings</code>, pegarlo en la sección Herramientas de desarrollo <code>dynamic_templates</code> que funcione y eliminar las líneas duplicadas e innecesarias cuando sea apropiado. Incluye estos contenidos de configuración de plantilla dinámica después de la entrada<code>"_embedded_ecs-data_stream_to_constant": {</code>. La sección <code>dynamic_templates</code> debería tener un aspecto muy similar al contenido de muestra a continuación en Dev Tools.</p></li></ul></li><li><p><strong>Si </strong><strong><code>dynamic_templates</code></strong><strong> no se incluyen o eliminan por completo</strong>, otros campos (revisa la captura de pantalla abajo) tendrán doble mapeo: <code>text</code> y <code>keyword</code> frente a los mapeos adecuados, si la sección de <code>dynamic_templates</code> se dejó incluida. Lo que queda debería ser la sección <code>"properties"</code> debajo de <code>"mappings"</code>. Esto también creará problemas en la Data view, ya que los campos se mapearán dos veces (si no se mapearon ya de esta manera) y provocará conflictos de mapeo adicionales.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfb7494f882d7e358/6a170fffa6c2b93e46e797d2/24e972cd0fc8eadf943b21cfdd80a5d435e705aa-2048x994.png" alt="Editor de código con pantalla dividida que muestra los comandos de Elasticsearch a la izquierda y los mapeos del índice a la derecha. Una flecha apunta al tipo de campo de texto en el mapeo, y otra flecha apunta al tipo de subcampo de palabra clave." /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltcaca899f8d92e72b/6a1710010c485745e901ab5a/aac13fbe882516e5ed5b5b1b5271c0ae34e80b04-1890x2048.png" alt=": pantalla que muestra la página del patrón de índice para logs-* con una advertencia sobre conflictos de mapping, con enfoque en los listados de tipo “palabra clave, texto” para agent.ephemeral_id y agent.id en la tabla de campos." /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2c692786ab74f1ca/6a171002964ceaa53c08bca1/c43d6f61c8ece4de2d51657f239a0c34ced07cdb-1928x1452.png" alt="Pantalla que muestra la página del patrón de índice para los logs-* con una advertencia sobre conflictos de mapping. Una flecha apunta al tipo que indica “ip, texto” para el campo host.ip." /><p><strong>5. Eliminación de metadatos:</strong> elimina la última sección etiquetada <code>"_meta"</code>, así como la sección etiquetada <code>"version"</code>, si está presente.</p><p><strong>6. Formato:</strong> indentación automática de las secciones restantes y ajuste o eliminación de cualquier corchete innecesario que impida una ejecución exitosa.
</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0906ffe338df1a9d/6a1710046f7f042aac914936/ebe1573647500de75315e7655256a0db9604c40d-2048x1402.png" alt="Editor de código que muestra la configuración y los mapeos de los índices de Elasticsearch. Un menú desplegable está abierto a la derecha y una flecha apunta a la opción “Indentación automática” en el menú." /><p><strong>7. Cambio de mapeo:</strong> Navega hasta la sección <code>"properties"</code> , encuentra <code>"log"</code>y luego localiza <code>"offset"</code> anidado debajo. Cambia el tipo de <code>keyword</code> a <code>long</code>, y elimina la entrada de línea (incluida la coma) etiquetada <code>"ignore_above": 1024,</code>. Si se agregaste más de una entrada a la plantilla de componente <code>@custom</code> creada anteriormente, inclúyela aquí.</p><p>Tu vista de consola de herramientas de desarrollo ahora debería ser similar al ejemplo que se proporciona a continuación.</p>PUT .ds-logs-filestream.generic-default-2026.04.14-000001-1
{
  "settings": {
    "index.codec": "best_compression",
    "index.lifecycle.name": "logs",
    "index.lifecycle.rollover_alias": ""
  },
  "mappings": {
    "dynamic_templates": [
      {
        "_embedded_ecs-data_stream_to_constant": {
          "path_match": "data_stream.*",
          "mapping": {
            "type": "constant_keyword"
          }
        }
      },
      {
        "ecs_timestamp": {
          "mapping": {
            "ignore_malformed": false,
            "type": "date"
          },
          "match": "@timestamp"
        }
      },
      {
        "ecs_message_match_only_text": {
          "path_match": [
            "message",
            "*.message"
          ],
          "mapping": {
            "type": "match_only_text"
          },
          "unmatch_mapping_type": "object"
        }
      },
      {
        "ecs_non_indexed_keyword": {
          "path_match": [
            "*event.original"
          ],
          "mapping": {
            "index": false,
            "type": "keyword",
            "doc_values": false
          }
        }
      },
      {
        "ecs_non_indexed_long": {
          "path_match": [
            "*.x509.public_key_exponent"
          ],
          "mapping": {
            "index": false,
            "type": "long",
            "doc_values": false
          }
        }
      },
      {
        "ecs_ip": {
          "path_match": [
            "ip",
            "*.ip",
            "*_ip"
          ],
          "mapping": {
            "type": "ip"
          },
          "match_mapping_type": "string"
        }
      },
      {
        "ecs_wildcard": {
          "path_match": [
            "*.io.text",
            "*.message_id",
            "*registry.data.strings",
            "*url.path"
          ],
          "mapping": {
            "type": "wildcard"
          },
          "unmatch_mapping_type": "object"
        }
      },
      {
        "ecs_path_match_wildcard_and_match_only_text": {
          "path_match": [
            "*.body.content",
            "*url.full",
            "*url.original"
          ],
          "mapping": {
            "fields": {
              "text": {
                "type": "match_only_text"
              }
            },
            "type": "wildcard"
          },
          "unmatch_mapping_type": "object"
        }
      },
      {
        "ecs_match_wildcard_and_match_only_text": {
          "mapping": {
            "fields": {
              "text": {
                "type": "match_only_text"
              }
            },
            "type": "wildcard"
          },
          "unmatch_mapping_type": "object",
          "match": [
            "*command_line",
            "*stack_trace"
          ]
        }
      },
      {
        "ecs_path_match_keyword_and_match_only_text": {
          "path_match": [
            "*.title",
            "*.executable",
            "*.name",
            "*.working_directory",
            "*.full_name",
            "*file.path",
            "*file.target_path",
            "*os.full",
            "*email.subject",
            "*vulnerability.description",
            "*user_agent.original"
          ],
          "mapping": {
            "fields": {
              "text": {
                "type": "match_only_text"
              }
            },
            "type": "keyword"
          },
          "unmatch_mapping_type": "object"
        }
      },
      {
        "ecs_date": {
          "path_match": [
            "*.timestamp",
            "*_timestamp",
            "*.not_after",
            "*.not_before",
            "*.accessed",
            "created",
            "*.created",
            "*.installed",
            "*.creation_date",
            "*.ctime",
            "*.mtime",
            "ingested",
            "*.ingested",
            "*.start",
            "*.end",
            "*.indicator.first_seen",
            "*.indicator.last_seen",
            "*.indicator.modified_at",
            "*threat.enrichments.matched.occurred"
          ],
          "mapping": {
            "type": "date"
          },
          "unmatch_mapping_type": "object"
        }
      },
      {
        "ecs_path_match_float": {
          "path_match": [
            "*.score.*",
            "*_score*"
          ],
          "mapping": {
            "type": "float"
          },
          "path_unmatch": "*.version",
          "unmatch_mapping_type": "object"
        }
      },
      {
        "ecs_usage_double_scaled_float": {
          "path_match": "*.usage",
          "mapping": {
            "scaling_factor": 1000,
            "type": "scaled_float"
          },
          "match_mapping_type": [
            "double",
            "long",
            "string"
          ]
        }
      },
      {
        "ecs_geo_point": {
          "path_match": [
            "*.geo.location"
          ],
          "mapping": {
            "type": "geo_point"
          }
        }
      },
      {
        "ecs_flattened": {
          "path_match": [
            "*structured_data",
            "*exports",
            "*imports"
          ],
          "mapping": {
            "type": "flattened"
          },
          "match_mapping_type": "object"
        }
      },
      {
        "all_strings_to_keywords": {
          "mapping": {
            "ignore_above": 1024,
            "type": "keyword"
          },
          "match_mapping_type": "string"
        }
      }
    ],
    "properties": {
      "input": {
        "properties": {
          "type": {
            "ignore_above": 1024,
            "type": "keyword"
          }
        }
      },
      "@timestamp": {
        "ignore_malformed": false,
        "type": "date"
      },
      "ecs": {
        "properties": {
          "version": {
            "ignore_above": 1024,
            "type": "keyword"
          }
        }
      },
      "log": {
        "properties": {
          "file": {
            "properties": {
              "inode": {
                "ignore_above": 1024,
                "type": "keyword"
              },
              "path": {
                "ignore_above": 1024,
                "type": "keyword"
              },
              "device_id": {
                "ignore_above": 1024,
                "type": "keyword"
              },
              "fingerprint": {
                "index": false,
                "type": "keyword"
              }
            }
          },
          "offset": {
            "type": "long"
          },
          "level": {
            "ignore_above": 1024,
            "type": "keyword"
          }
        }
      },
      "data_stream": {
        "properties": {
          "namespace": {
            "type": "constant_keyword"
          },
          "type": {
            "type": "constant_keyword"
          },
          "dataset": {
            "type": "constant_keyword"
          }
        }
      },
      "event": {
        "properties": {
          "original": {
            "index": false,
            "type": "keyword",
            "doc_values": false
          },
          "module": {
            "type": "constant_keyword",
            "value": "filestream"
          },
          "dataset": {
            "type": "constant_keyword",
            "value": "filestream.generic"
          }
        }
      },
      "message": {
        "type": "match_only_text"
      },
      "tags": {
        "ignore_above": 1024,
        "type": "keyword"
      }
    }
  }
}<p>Una vez que su consola se parezca al ejemplo (incluyendo cualquier campo personalizado adicional y valores personalizados específicos de su entorno), ejecute el comando para crear la estructura básica del nuevo índice de respaldo, haciendo una pausa para resolver cualquier error que surja.</p><h2>Comenzar el proceso de reindexación</h2><p>Con el shell del nuevo índice de respaldo creado correctamente, el siguiente paso es reindexar y resolver los conflictos de mapping.</p><p><strong>Importante:</strong> si el índice de respaldo que presenta el conflicto de mapping es el índice más reciente y es el índice de escritura actual (por ejemplo, el número final del índice de respaldo es -000001), el flujo de datos debe reiniciarse. Es necesario reiniciar el flujo de datos, ya que el índice de escritura actual, al que se le están introduciendo documentos, es un índice de respaldo activo y no se puede modificar.</p><p>Con el mapping de campo correcto ahora aplicado al índice de escritura más nuevo a través de la plantilla de componente <code>@custom</code> creada anteriormente, todos los documentos nuevos reflejarán este cambio.</p><p>Esto se realiza ejecutando lo siguiente: </p>POST &lt;full data stream name&gt;/_rollover<p>Por ejemplo: </p>POST logs-filestream.generic-default/_rollover<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0e0ae084fe6ade43/6a171006a6c2b91078e797d6/22abc1a2f6de0420aa0d56ac498894111df7f4fd-2048x330.png" alt="Resultado del rollover" /><p>La reindexación implica copiar los datos de un índice de respaldo existente a uno nuevo dentro de la misma convención de nomenclatura, generalmente para aplicar los cambios necesarios. Estas modificaciones podrían incluir actualizaciones de una plantilla de componente o la incorporación de un nuevo pipeline de ingesta para procesar los datos.</p><p>A continuación, los datos se copiarán desde el índice de respaldo que tiene los mappings incorrectos a un nuevo índice de respaldo. El índice de respaldo original se ha desplazado, lo que significa que no se pueden agregar nuevos documentos. El nuevo índice de respaldo seguirá la misma convención de nombres, que preserva la visibilidad e integridad de los datos al aplicar la política ILM correcta, pero incluirá un sufijo <code>-1</code> para indicar que fue reindexado.</p><p>Ajusta los nombres de los índices según sea necesario y pega el siguiente código en la consola. Al incluir <code>wait_for_completion=false</code>, puedes seguir el progreso de la copia de documentos, lo que ayuda a estimar el tiempo restante de reindexación. Sin esta configuración, no puedes rastrear el estado con el comando <code>GET _tasks</code> a continuación y solo podrás verificar el recuento de documentos en el índice de respaldo más nuevo con <code>GET &lt;backing index name&gt;-1/_count</code>.</p><p><strong>Importante: </strong>si surgen problemas durante el proceso de reindexación, no vuelvas a ejecutar el comando reindex; hacerlo reiniciará el proceso y creará registros duplicados en el índice que terminan en <code>-1</code>. Si es necesario reiniciar, primero elimina el índice que termina en <code>-1</code>, y luego ejecuta el comando <code>PUT</code> anterior para recrear la nueva shell de índice de respaldo.</p>POST _reindex?wait_for_completion=false
{
  "source": {
    "index": "&lt;source backing index&gt;"
  },
  "dest": {
    "index": "&lt;new backing index&gt;-1"
  }
}

i.e.
POST _reindex?wait_for_completion=false
{
  "source": {
    "index": ".ds-logs-filestream.generic-default-2026.04.13-000001"
  },
  "dest": {
    "index": ".ds-logs-filestream.generic-default-2026.04.13-000001-1"
  }
}<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb30fd97a045b6008/6a171007cf4f2566d6b2d22b/22f9b1f762802ecd20faa7c7c1f76c9d1444aba5-2048x530.png" alt=" Salida de la tarea" /><p>Tras la ejecución, la respuesta incluirá un ID de tarea. Puedes monitorear el progreso de la reindexación usando este ID con el comando: <code>GET _tasks/&lt;task ID&gt;</code>.</p><p>La duración de la reindexación depende del volumen de datos del índice original. La finalización se puede rastrear si se busca <code>"completed": true</code> al ejecutar el comando <code>GET</code>, lo que debería producir una salida similar.</p><p><code>GET _tasks/&lt;task ID&gt;</code></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4d40766e48cc0813/6a17100960084ba9043c4642/dbf0fb0a560a78236440b8c3de68cdf5c83e6d7a-2048x824.png" alt="Resumen de la tarea" /><p>Con el proceso de reindexación ya finalizado para el recuento de documentos, el siguiente paso es verificar que los mapeos para el nuevo índice de respaldo y el campo específico en cuestión sean correctas.</p>GET &lt;backing index&gt;-1/_mapping<p>Por ejemplo:</p>GET .ds-logs-filestream.generic-default-2026.04.13-000001-1/_mapping<p>Puedes verificar que el mapeo para <code>log.offset</code> es como se muestra a continuación. Para confirmar que otros campos tienen solo una entrada de mapeo (no ambas <code>text</code> y <code>keyword</code>), compáralos con un campo que no formaba parte de la sección de plantilla dinámica en el comando <code>PUT</code> anterior.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc156907e9635e4a9/6a17100b60084b59673c464e/db5c12c0a651e804a916d517e6e260e49a8b835a-2048x1121.png" alt=" Enfoque de mapping" /><p>Si el índice de respaldo que se está reindexando tiene una gran cantidad de documentos, es útil verificar el estado de esos documentos que se están copiando al nuevo índice de respaldo; esto se puede hacer con los siguientes dos comandos de Herramientas de desarrollo para comparar los recuentos.</p><p><code>GET .ds-logs-filestream.generic-default-2026.04.14-000001/_count</code></p><p><code>GET .ds-logs-filestream.generic-default-2026.04.14-000001-1/_count</code></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbc27c4da42ddc33d/6a17100c7d8d67e0ad70e816/a0e49ac79edb0abf9fe99d0e6fd35e96d0e3e0e5-2048x880.png" alt="" /><p>Una vez que se verifique que los recuentos coinciden y que los mapeos correctos están presentes, actualiza el flujo de datos para incluir el nuevo índice de respaldo, para prevenir un índice de respaldo huérfano en la administración de índices, donde la política de ILM nunca se ejecutará en el índice de respaldo.</p><ul><li><p>El retorno debería ser un reconocimiento de verdadero, si tiene éxito.</p></li></ul>POST _data_stream/_modify
{
  "actions": [
    {
      "add_backing_index": {
        "data_stream": "logs-filestream.generic-default",
        "index": ".ds-logs-filestream.generic-default-2026.04.14-000001-1"
      }
    }
  ]
}<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1bb6db6c761628fb/6a17100e7d8d67533770e81a/0aa3233377c0175258d37eaa661d56cf9f310d5e-2048x1288.png" alt="" /><p>Verifica que el nuevo índice de respaldo se haya agregado con el siguiente comando, cerciorándote de que la <code>ilm_policy</code> sea correcta:</p>GET _data_stream/logs-filestream.generic-default<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7f4208ae6d7bf331/6a171010961e696241c4cfeb/af8b75cf260f6f088c28a78da86ad31527e0bfd5-2048x839.png" alt="" /><p>Verifique el estado de ILM del índice de respaldo a continuación con el siguiente comando:</p><ul><li><p>Es normal ver que el índice esté en caliente, ya que fue creado muy recientemente (revisa la línea 8 o 10).</p></li></ul>GET .ds-logs-filestream.generic-default-2026.04.14-000001-1/_ilm/explain<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt953e1a062a040311/6a171012acf0885905be9c29/cd181a31001c7a3ee2b0599a7388909ce5b50baf-2048x972.png" alt="" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd398451578d070c9/6a1710140e2e492dc041a204/20f6e7632804f173533e655f0292c3c540f26597-2048x894.png" alt="" /><p>Ejecuta lo siguiente para hacer la transición del índice de respaldo del nivel activo al siguiente nivel apropiado después de la fase caliente de la política de ILM para este flujo de datos. Los valores específicos para <code>phase</code>, <code>action</code>, y <code>name</code> en el <code>current_step</code> siguiente pueden referenciarse a partir de las líneas 11, 13 y 15, respectivamente, en la captura de pantalla proporcionada arriba.</p><p>El valor <code>next_step</code> indica la fase de ILM o el nivel de datos posterior al que el índice hará la transición.</p><p>Por ejemplo:</p>POST _ilm/move/.ds-logs-filestream.generic-default-2026.04.14-000001-1
{
  "current_step": {
    "phase": "hot",
    "action": "rollover", 
    "name": "check-rollover-ready"
  },
  "next_step": {
    "phase": "warm" 
  }
}<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt246a6538585234f1/6a1710160c4857ddc001ab60/7ae60b900ce1d0b46ce26ec301901bc8a9ef750c-2048x1249.png" alt="" /><ul><li><p>No es necesario, pero como medida de seguridad, puedes ejecutar el comando <code>_ilm/explain</code> de nuevo para cerciorarte de que el índice de respaldo pasó a la siguiente fase y ya no está en caliente.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf77bba4d9b495048/6a17101867045b3b7d45c2c1/58a460cf2ec443223ea68ba7e7166a7cf9d8c97a-2048x915.png" alt="" /><p>Una vez que se cumplan las siguientes condiciones, puedes eliminar de forma segura el índice de respaldo original que tenía conflictos de mapeo:</p><ol><li><p>Se ha creado correctamente un nuevo índice de respaldo.</p></li><li><p>Los documentos se han trasladado al nuevo índice y la cantidad de documentos coincide.</p></li><li><p>Los mapeos se han corregido (tanto específicos del flujo de datos como ECS).</p></li><li><p>El flujo de datos incorpora el nuevo índice de respaldo.</p></li><li><p>La política de ILM se ha aplicado y ha movido el índice fuera de la fase caliente.</p></li></ol><p><strong>Importante:</strong> Como alternativa, antes de eliminar el índice original, puedes consultar la página <strong>Data Views</strong>. Selecciona <code>logs-*</code> y verifica que el índice de respaldo reindexado (que termina en <code>-1</code>) ahora aparece en la sección <strong><code>long</code></strong>. El índice de respaldo original debería seguir presente en <strong><code>keyword</code></strong>. Si el índice de respaldo reindexado no está en la sección <strong><code>long</code></strong>, vuelve atrás y revisa los pasos anteriores y realiza las correcciones necesarias.</p><p>Por ejemplo:</p>DELETE .ds-logs-filestream.generic-default-2026.04.14-000001<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt835a79be274513a3/6a17101aa929cf43c6ae0ab1/09d661b20a44929b4736a43eaa3df84180b25f30-2048x1295.png" alt="" /><p>Luego de resolver los conflictos, vuelve a la página <strong>Data Views</strong> y selecciona <code>logs-*</code>. Si el conflicto estuviera relacionado únicamente con <code>log.offset</code>, ya no debería ver ningún conflicto listado. Si hubiera otros conflictos, el índice de respaldo original ya no debería aparecer en la lista de conflictos; en cambio, el nuevo índice de respaldo debería aparecer ahora en la sección <code>long</code>.</p><p>También puedes verificar en <strong>Discover</strong> que el campo <code>log.offset</code> ahora muestra los iconos correspondientes.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt127cb539b70acada/6a17101ba929cfbc66ae0ab5/1c3bb7029c99aa4bc6b0931f39f5648654b35ccd-2048x1204.png" alt="" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltaa1eb678773c23d9/6a17101d4a531b00a636aa3b/0af1b1aa3a031c207aa5eb083696dd081d941e67-2048x1001.png" alt="" /><p>Continúe este proceso, repitiendo los pasos anteriores para cada índice de respaldo que tenga un conflicto de mapeo hasta que todos se resuelvan con éxito.</p><p>Referencias:</p><ul><li><p><a href="https://www.elastic.co/docs/reference/ecs/ecs-field-reference">Referencia de campo de ECS</a></p></li><li><p><a href="https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-reindex">Reindexar documentos</a></p></li></ul><h2>Reflexiones finales</h2><p>Si sigues los pasos de este blog, resolverás los conflictos de mapping y te asegurarás de que todos los datos nuevos estén correctamente mapeados. Esto se consigue vinculando las plantillas de componentes necesarias a tu fuente de datos. Este flujo de trabajo no solo resuelve los problemas inmediatos, sino que también establece un proceso seguro y repetible para gestionar los cambios en el esquema a medida que tus datos y requisitos evolucionan.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-mapping-conflicts-reindex-data-streams</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-mapping-conflicts-reindex-data-streams</guid>
    <category><![CDATA[Operaciones]]></category>
    <dc:creator><![CDATA[Lisa Larribas]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9654eb32edb4a44a/6a17101fcdacbf0ac17d2ad8/2f2573aa3d29b3a628e4fce606c803add2641501-720x420.jpg" length="0" type="image/jpeg"/>
    <pubDate>Fri, 24 Apr 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Por qué la búsqueda en el comercio electrónico necesita gobernanza]]></title>
    <description><![CDATA[Conoce por qué la búsqueda de ecommerce queda corta sin gobernanza, y cómo una capa de control garantiza resultados predecibles e impulsados por la intención, a la vez que mejora la recuperación.]]></description>
    <content:encoded><![CDATA[<p>Los minoristas de comercio electrónico deben gestionar distintos tipos de consultas muy diferentes dentro del mismo sistema. Un comprador que busca “naranjas” espera la fruta, no productos que contengan la palabra “naranja”, como el jugo de naranja o la mermelada de naranja, y no productos cítricos semánticamente relacionados. Un comprador que busca un “regalo para el abuelo al que le gusta lo dulce” necesita descubrimiento semántico, no coincidencia literal de palabras clave.</p><p>La <em>recuperación léxica</em> (coincidencia de texto), la <em>recuperación semántica</em> (coincidencia de conceptos) ni la <em>recuperación híbrida</em> (combinación de señales léxicas y semánticas) resuelven estos problemas por sí solas. La recuperación léxica puede arrojar cualquier resultado que contenga la palabra “naranjas”, mientras que la recuperación semántica pura en una consulta de alta intención como “naranjas” puede ampliarse hacia elementos relacionados como limones o toronjas. La recuperación híbrida combina estas señales léxicas y semánticas, pero aún no determina si esta consulta debe considerarse navegacional, qué restricciones deben aplicarse o qué políticas comerciales deben implementarse. La brecha no es la tecnología de recuperación en sí; es la ausencia de una capa de gobernanza que entienda de qué tipo de consulta se trata y qué restricciones deben implementarse antes de que comience la recuperación.</p><p>En este blog, abordamos la gobernanza de la búsqueda en el comercio electrónico, su relevancia y cómo garantizar una recuperación predecible y precisa con una capa de control.</p><h2>Qué significa la gobernanza en la búsqueda en el comercio electrónico</h2><p><em>Gobernanza</em>, en este contexto, significa introducir una capa de decisión entre la consulta del usuario y el motor de recuperación. Esta capa realiza las siguientes funciones:</p><ul><li><p>Clasifica la intención de la consulta: ¿se trata de navegación ("naranjas") o descubrimiento ("regalo para el abuelo")?</p></li><li><p>Aplica restricciones comerciales: ¿qué límites de categoría, reglas de elegibilidad, restricciones de disponibilidad o políticas de comercialización se aplican?</p></li><li><p>Apunta hacia la estrategia adecuada: ¿debería usar recuperación léxica, recuperación semántica o híbrida?</p></li></ul><p>Una capa de gobernanza determina qué método de recuperación debe emplearse para cada consulta, qué restricciones deben aplicarse y qué políticas empresariales deben implementarse antes de que comience la recuperación. Es importante no confundir la gobernanza con la recuperación híbrida: la recuperación híbrida es una estrategia que combina señales léxicas y semánticas, mientras que la gobernanza es la capa de decisión previa que determina si deben usarse señales léxicas, semánticas o híbridas.</p><h2>Situación actual: la implementación "espagueti" de la capa de aplicación</h2><p>Hoy en día, muchos minoristas intentan resolver esto agregando lógica directamente en la capa de aplicación. A menudo resulta en <em>código espagueti</em>, es decir, miles de líneas de afirmaciones “si-entonces” codificadas de forma rígida, regex y plantillas de búsqueda complejas.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdd7b33454d925cfd/6a1710f1e8fbce25ee39fd4d/f532b099ee103458e15563a711dae92952f8df02-1024x765.png" alt="Comparación de la lógica de aplicación codificada de forma fija y Elasticsearch: cómo Elasticsearch simplifica la clasificación y la recuperación sin reglas “si-entonces” complejas." /><p>Este enfoque puede proporcionar los resultados de búsqueda deseados como se muestra arriba; sin embargo, crea una fricción operativa significativa:</p><ul><li><p><strong>Dependencia de ingeniería:</strong> los usuarios empresariales y los comercializadores no pueden modificar el comportamiento de búsqueda sin tickets de ingeniería y largos ciclos de despliegue que a menudo abarcan varias semanas.</p></li><li><p><strong>Fragmentación:</strong> la lógica de búsqueda queda dispersa entre el código de la aplicación y las plantillas de búsqueda, y es difícil de explicar o auditar, lo que vuelve su evolución arriesgada.</p></li></ul><p>Incluso cuando los equipos reconocen la necesidad de enrutamiento, el debate a menudo se centra en la pregunta equivocada: qué método de recuperación elegir.</p><h2>La falsa elección: léxico vs. semántico vs. híbrido</h2><p>Los equipos de búsqueda suelen enmarcar el desafío como una elección estratégica de recuperación: léxico/BM25 frente a semántico/vectores frente a híbrido. Ese encuadre es comprensible (los métodos de recuperación importan), pero pasa por alto el modo de fallo más común en despliegues reales: usar un único enfoque de recuperación para todas las consultas dará resultados subóptimos.</p><p>La búsqueda comercial es una mezcla de intenciones fundamentalmente diferentes:</p><ul><li><p><strong>Navegación determinista y de alta intención</strong> ("naranjas", "leche", "chocolate sin maní", "aceite de oliva barato").</p></li><li><p><strong>Descubrimiento exploratorio</strong> ("chaqueta para hacer senderismo en las montañas", "regalo para una niña o niño de 12 años a quien le gusta la robótica").</p></li><li><p><strong>Restricciones operativas</strong> (disponibilidad, tamaño, precio, color).</p></li><li><p><strong>Merchandising y campañas</strong> (impulsar, relegar, campañas estacionales).</p></li></ul><p>Cuando el sistema enruta todo esto a través de la misma estrategia de recuperación, los resultados a menudo son sistemáticamente incorrectos de manera predecible porque el modelo operativo carece de gobernanza. Cuando los equipos no se dan cuenta de que esto es una falla en la gobernanza, responden con la única herramienta que tienen: ajustar más el sistema.</p><h2>Por qué “afinar la relevancia” puede volverse algo cíclico</h2><p>Sin una capa de enrutamiento, la "relevancia" suele convertirse en una lista de pendientes interminable:</p><ul><li><p>¿Por qué esta búsqueda muestra accesorios por encima del producto núcleo?</p></li><li><p>¿Por qué esta búsqueda principal de repente comenzó a mostrar elementos relacionados?</p></li><li><p>¿Por qué cambiaron los resultados después de que agregamos sinónimos, ajustamos los analizadores o habilitamos el híbrido?</p></li><li><p>¿Por qué el equipo de negocios necesita un lanzamiento de ingeniería para arreglar una consulta única?</p></li></ul><p>Los equipos responden con más ajustes: más sinónimos, más mejoras, más experimentos de reordenamiento, más excepciones en el código de la aplicación. Esto puede funcionar por un tiempo, pero a menudo produce un comportamiento frágil porque el sistema aún carece de una capa de decisión explícita para determinar el tipo de consulta y aplicar las restricciones adecuadas antes de la recuperación.</p><h2>La anatomía de la intención del comercio electrónico: cabeza y cola</h2><p>En esta sección, usamos “cabeza” y “cola” como una notación práctica para patrones comunes de búsqueda navegacional y exploratoria en el comercio electrónico. En el mundo real, muchas búsquedas contienen aspectos de ambos:</p><h3>Consultas de cabeza (intención determinista)</h3><p>Estas son consultas directas y de navegación en las que el usuario sabe exactamente lo que quiere:</p><ul><li><p>Intención de un solo artículo ("naranjas", "leche", "pan").</p></li><li><p>Marcas exactas o familias de productos ("iPhone 15 Pro", "Coca Light").</p></li><li><p>Referencias, números de modelo, tallas ("ABC123", "air max 270").</p></li></ul><p>Para estas consultas, la recuperación léxica puede ocuparse de la correspondencia de tokens (palabras coincidentes), pero la empresa también espera respetar las restricciones, arrojar clasificaciones predecibles y tener resultados controlables. Un comerciante necesita asegurarse de que una consulta se resuelva dentro de los límites correctos de la categoría, respete la elegibilidad y muestre prioridades específicas del negocio.</p><p>Se necesita una estructura de gobernanza para garantizar el cumplimiento de la resolución prevista. Por ejemplo, las “naranjas” deben mapearse a la categoría de productos, no a jugo de naranja, mermelada de naranja o soda de naranja.</p><h3>Consultas de cola (descubrimiento exploratorio)</h3><p>Estas son búsquedas descriptivas y ricas en intención donde los compradores están explorando:</p><ul><li><p>"Regalo para el abuelo que tiene debilidad por lo dulce"</p></li><li><p>"Chaqueta para senderismo en la montaña"</p></li><li><p>"Zapatos para estar de pie todo el día"</p></li></ul><p>La recuperación léxica a menudo tiene dificultades en este punto. La búsqueda semántica destaca porque puede conectar el concepto de la consulta con el producto, incluso cuando las palabras no coinciden. Pero la recuperación semántica por sí sola no suele ser suficiente. Las consultas reales a menudo requieren que se apliquen restricciones, independientemente del método de recuperación que se utilice.</p><h2>Las restricciones son ortogonales al método de recuperación</h2><p>Aplicar restricciones a la recuperación semántica no significa que sea una <em>búsqueda híbrida</em>. Son conceptos ortogonales. Las restricciones, como los filtros y las mejoras (boosts) en Elasticsearch, se pueden aplicar a cualquier recuperación léxica, semántica o híbrida. El desafío es decidir cómo interpretar la consulta, qué restricciones se deben aplicar y qué estrategia de recuperación se debe usar.</p><p>A continuación se muestran algunos ejemplos de consultas que combinan la recuperación con restricciones rígidas:</p><ul><li><p><strong>Naranjas:</strong> recuperación léxica para “naranjas” más una restricción de categoría, como “frutas” o “productos”, eliminando mermelada de naranja, jugo de naranja y soda de naranja.</p></li><li><p><strong>Frutas ricas en vitamina C por menos de $4:</strong> búsqueda semántica basada en la intención nutricional, además de filtros que limitan los resultados a la categoría de frutas y a productos por menos de $4.</p></li><li><p><strong>Zapatos cómodos para el trabajo:</strong> búsqueda semántica basada en la intención contextual, además de una restricción de categoría que limita los resultados a los zapatos.</p></li></ul><p>Estas consultas no se pueden manejar con un solo enfoque:</p><ul><li><p>La <strong>recuperación léxica pura</strong> a menudo es insuficiente en este caso porque frases como “alto contenido de vitamina C” o “cómodo” pueden no existir como atributos limpios y estructurados. Puede que sea necesario inferirlos a partir de descripciones de productos, reseñas o especificaciones.</p></li><li><p><strong>La recuperación semántica pura</strong> tampoco es suficiente porque, sin restricciones explícitas, una consulta como “frutas con alto contenido de vitamina C” podría ampliarse hacia suplementos vitamínicos, bebidas con sabor a fruta o vegetales con alto contenido de vitaminas fuera de la categoría y el rango de precios previstos.</p></li></ul><p>Una capa de gobernanza determina si una consulta necesita recuperación léxica, comprensión semántica, aplicación de restricciones o alguna combinación de estas. Sin esta capa, los equipos de comercio electrónico pueden caer en lo siguiente:</p><ul><li><p><strong>Restricción excesiva:</strong> uso de recuperación léxica para solicitudes semánticas (por ejemplo, "regalo para el abuelo").</p></li><li><p><strong>Restricción insuficiente: </strong>emplear consultas semánticas para consultas de cabeza con alta intención (por ejemplo, "naranjas").</p></li></ul><p>El desafío de la gobernanza es construir un sistema que pueda tomar la decisión correcta para cada clase de consulta.</p><h2>Qué sucede sin gobernanza</h2><p>El modo de falla más común es sencillo: los equipos toman la consulta del usuario sin procesar y la pasan directamente a una única estrategia de recuperación (léxica, semántica o híbrida), sin una capa de gobernanza intermedia.</p><h3>La búsqueda léxica no da el resultado esperado</h3><p>Cuando un usuario busca “naranjas”, una estrategia de recuperación léxica puede devolver cualquier cosa que contenga ese token: jugo de naranja, mermelada de naranja o soda de naranja. El sistema hizo coincidir el término correctamente, pero sin gobernanza es posible que no resuelva el contexto de compra previsto (la fruta).</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1b4595242ea6eb05/6a1710f35091684ba3e1bbd0/99abc7a46f9c56a26a68d0a089d7ab830b9b5568-1560x814.png" alt=" Ilustración que muestra cómo una sola consulta de &quot;naranjas&quot; devuelve diferentes resultados relacionados, como mermelada, naranjas frescas y refresco de naranja." /><h3>La recuperación semántica se amplía más allá de las limitaciones previstas</h3><p>Cuando un usuario busca “naranjas”, un sistema semántico puede recuperar elementos conceptualmente relacionados a través de conceptos de productos cercanos. El sistema puede comprender correctamente el dominio más amplio (fruta o productos), pero sin gobernanza explícita aún puede ampliarse más allá de la restricción intencionada del usuario (específicamente naranjas).</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltff1aba60c7b13fc8/6a1710f58b73cb3cef18a117/c9de86363ecbed499fe48259f47b3c5b2c26bc43-1568x796.png" alt="Diagrama que muestra cómo la búsqueda de “naranjas” se dirige a diferentes categorías de frutas, incluidas manzanas, naranjas y frutas mixtas." /><h3>La brecha es la gobernanza</h3><p>Lo que se requiere es una capa de decisión previa que determine la intención de la consulta y aplique las restricciones adecuadas antes de que comience la recuperación. Esto soluciona problemas como los siguientes:</p><ul><li><p>Elementos similares o relacionados que aparecen junto a lo que el usuario realmente quería.</p></li><li><p>Límites difusos de categorías ("bebidas" en vez de "frutas").</p></li><li><p>Incapacidad para implementar mejoras o campañas estacionales.</p></li><li><p>Resultados impredecibles e inexplicables.</p></li></ul><h2>Comprensión de intenciones y enrutamiento: el plano de control necesario</h2><p>Un sistema de búsqueda gestionada incorpora un plano de control ligero antes de la recuperación (antes de ejecutar una consulta en Elasticsearch). El control se explicará en detalle en las partes <a href="https://www.elastic.co/search-labs/blog/ecommerce-search-governance-control-plane-architecture">3</a> y <a href="https://www.elastic.co/search-labs/blog/elasticsearch-percolator-search-governance">4</a> de esta serie de blogs; por ahora, solo abarcaremos lo que puede hacer pero no cómo funciona:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt373bd838e1751998/6a1710f74a531b1e5436aa57/88c3d0f9731a128d73a765dcdffed897308110a6-2680x766.png" alt="Diagrama que muestra cómo se enrutan las diferentes consultas a través de un plano de control hacia los resultados de búsqueda de BM25 o de búsqueda semántica." /><p>Un plano de control puede detectar la intención, aplicar políticas comerciales y garantizar la estrategia de recuperación apropiada de la siguiente manera:</p><p><strong>1. Detectar señales de intención</strong></p><ul><li><p>¿Es probable que esta búsqueda sea de navegación en vez de descubrimiento?</p></li><li><p>¿Es una búsqueda principal conocida (leche, pan, bananas)?</p></li><li><p>Existe una interpretación conocida de producto, marca o categoría (por ejemplo, “naranjas” debería resolverse como fruta).</p></li><li><p>¿La consulta tiene un patrón tipo SKU?</p></li><li><p>¿La consulta se enmarca dentro de una campaña activa o una política estacional (por ejemplo, durante la Navidad, mejorar los resultados relacionados con el pavo)?</p></li><li><p>¿La consulta implica restricciones (categoría, atributos, exclusiones, precio, tamaño o color)?</p></li></ul><p><strong>2. Aplicar políticas empresariales y de gobernanza</strong></p><ul><li><p>Primero aplica restricciones deterministas (categoría, atributo, negación, disponibilidad).</p></li><li><p>Aplicar políticas activas de merchandising (mejorar/enterrar/fijar/anular).</p></li><li><p>Resuelve los conflictos con reglas de precedencia (por ejemplo, anulaciones de campaña frente a políticas globales).</p></li></ul><p><strong>3. Dirige a la estrategia de recuperación adecuada</strong></p><ul><li><p>Léxico (rápido, determinista) para consultas de navegación o de alta intención.</p></li><li><p>Recuperación semántica para búsquedas de descubrimiento real.</p></li><li><p>Híbrido en el que la combinación de señales léxicas y semánticas aporta valor añadido dentro de unos límites empresariales explícitos.</p></li></ul><p>En la práctica, la salida del plano de control no es simplemente “usar híbrido” o “usar semántico”. Es un plan de recuperación regulado: una interpretación de la intención del comprador, las restricciones y políticas que deben aplicar, y la estrategia de recuperación que debe ejecutar. Unos pocos ejemplos sencillos lo demuestran:</p><p>Consulta de comprador</p><p>Interpretación regulada</p><p>Ejemplo de plan de recuperación</p><p>“chocolate sin maní”</p><p>Consulta orientada al producto con una restricción de exclusión estricta</p><p>Recuperación léxica para chocolate más un filtro de exclusión para productos que contienen maní</p><p>“aceite de oliva barato”</p><p>Búsqueda de producto o categoría con restricción de precio</p><p>Recuperación léxica para aceite de oliva más un filtro de precio limitado al umbral del minorista para ser económico</p><p>“Fruta con alto contenido de vitamina C por menos de $4”</p><p>Consulta de descubrimiento que requiere comprensión semántica y restricciones estrictas</p><p>Búsqueda semántica basada en la intención nutricional, limitada a la categoría de frutas y filtrada a productos con un precio inferior a 4 dólares</p><p>Un plano de control selecciona la política y la estrategia de recuperación correctas para cada búsqueda de forma consistente, predecible y a escala. Esto hace que los métodos de recuperación avanzados sean más predecibles en producción porque las restricciones alineadas con la intención se aplican primero y las decisiones de enrutamiento son explícitas en lugar de implícitas.</p><h2>Cómo esto se relaciona con otros enfoques</h2><p>Algunos equipos usan modelos de incrustación mejorados para captar mejor la semántica de los productos, lo que puede mejorar de forma considerable la calidad de la búsqueda semántica. Otros utilizan enfoques de reclasificación, como <a href="https://www.elastic.co/docs/solutions/search/ranking/learning-to-rank-ltr">Learning To Rank (LTR)</a>, para optimizar el orden de los resultados basado en la participación o señales de negocio después de la recuperación. Ambos son valiosos y a menudo complementarios. Las incrustaciones superiores mejoran la coincidencia de similitudes. La reclasificación mejora el ordenamiento entre los candidatos recuperados.</p><p>La gobernanza aborda un aspecto diferente del problema: se sitúa en una etapa previa a la recuperación. Decide qué estrategia de recuperación utilizar (por ejemplo, léxica, semántica o híbrida), qué restricciones deterministas se requieren y qué consultas deben combinar varias políticas de negocio.</p><h2>Qué aporta un plano de control gestionado</h2><p>Una vez que se establece una capa de gobernanza, el modelo operativo cambia de forma rotunda. Las consultas críticas para los ingresos se vuelven predecibles. Los equipos de negocio pueden actualizar el comportamiento de búsqueda sin esperar los ciclos de lanzamiento de ingeniería. Y los métodos de recuperación avanzados (como los semánticos y los híbridos) pueden adoptarse de forma gradual, con mecanismos de enrutamiento y controles de seguridad, en vez de como un interruptor global de encendido o apagado.</p><p>La <a href="https://www.elastic.co/search-labs/blog/ecommerce-search-governance-zero-deploy">siguiente publicación</a> de esta serie explora cómo se ve ese modelo operativo en la práctica y por qué puede ser tan importante como la tecnología de recuperación subyacente.</p><p>Si un comerciante tiene que abrir un ticket de Jira y esperar un despliegue para corregir una búsqueda crítica para los ingresos, el cuello de botella no es el motor; es el modelo operativo. La búsqueda moderna de comercio electrónico necesita una manera de traducir la intención comercial en un comportamiento de búsqueda controlado y auditable de manera rápida y segura, sin dejar de usar recuperación avanzada cuando aporta un valor medible.</p><h2>Lo que se viene</h2><p>Los patrones explorados en esta serie operan río arriba de la recuperación: traduciendo la intención del negocio en la estrategia de búsqueda correcta antes de que comience la generación de la búsqueda. En la <a href="https://www.elastic.co/search-labs/blog/ecommerce-search-governance-zero-deploy">siguiente publicación</a>, pasamos del problema técnico al operativo: qué ocurre cuando los equipos de negocio pueden cambiar el comportamiento de búsqueda sin un despliegue de ingeniería, y por qué la gobernanza hace que eso sea seguro.</p><h2>Pon en práctica la búsqueda gobernada de comercio electrónico</h2><p>Los cuellos de botella de ingeniería, la lógica frágil de la capa de aplicación y los resultados de búsqueda impredecibles son problemas que Elastic Services puede ayudarte a resolver en los proyectos de servicios de comercio electrónico empresarial. La arquitectura del plano de control gobernado que se describe en esta serie fue desarrollada por Elastic Services Engineering.</p><p>Si tu equipo está dedicando recursos de ingeniería a convertir las solicitudes de merchandising en cambios de código, o si la lista de tareas pendientes relacionadas con la relevancia de las búsquedas parece no reducirse nunca, podemos ayudarte a evaluar tu arquitectura actual y a trazar un plan para lograr un sistema de búsqueda controlado y editable por el equipo de negocios. Ponte en contacto con <a href="https://www.elastic.co/consulting">Elastic Services</a>.  </p><h2>Únete a la discusión</h2><p>¿Tienes preguntas sobre la gestión de búsquedas, las estrategias de recuperación o la arquitectura de búsqueda en el comercio electrónico? Únete a la <a href="https://discuss.elastic.co/">conversación general de la comunidad de Elastic</a>.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/ecommerce-search-governance-improve-retrieval</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/ecommerce-search-governance-improve-retrieval</guid>
    <category><![CDATA[Operaciones]]></category>
    <dc:creator><![CDATA[Alexander Marquardt,Honza Král,Taylor Roy]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt840c7a0a5b92080f/6a1710f967045b3e5445c2cd/3793259b01a5653a7520393a2f006610de0d21e7-1280x720.png" length="0" type="image/png"/>
    <pubDate>Thu, 09 Apr 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Mayor rendimiento y menor latencia: Elastic Cloud Serverless en AWS recibe un aumento significativo del rendimiento]]></title>
    <description><![CDATA[Hemos actualizado la infraestructura de AWS para Elasticsearch Serverless con hardware más nuevo y rápido. Descubre cómo este aumento masivo del rendimiento ofrece consultas más rápidas, mejor escalado y menores costos.]]></description>
    <content:encoded><![CDATA[<p>Elastic Cloud Serverless ya es la solución definitiva para los desarrolladores que desean crear aplicaciones eficientes de búsqueda e inteligencia artificial sin la carga operativa que supone la gestión de la infraestructura. Ahora, estamos llevando el rendimiento de tus proyectos sin servidor a un nivel completamente nuevo.</p><p>Completamos una importante actualización de infraestructura para todos los proyectos de <a href="https://www.elastic.co/cloud/serverless">Elastic Cloud Serverless</a> que funcionan en AWS, al migrar a hardware más nuevo y rápido. Este cambio se ha implementado automáticamente en todos los proyectos sin servidor. Ofrece <strong>mayor rendimiento y menor latencia</strong> para proyectos serverless de Elasticsearch, Elastic Observability y Elastic Security en AWS.</p><h2><strong>Beneficios clave de rendimiento para desarrolladores</strong></h2><p>La nueva infraestructura de hardware de AWS sustenta todo lo que haces con Elastic Cloud Serverless, lo que se traduce en beneficios tangibles para la velocidad y la capacidad de respuesta de tus aplicaciones.</p><h3><strong>Latencia de consulta reducida… rendimiento aumentado.</strong></h3><p>El hardware mejorado aumenta drásticamente la velocidad de los recursos informáticos, lo que significa que tus consultas de búsqueda se procesan más rápido que nunca.</p><ul><li><p><strong>Búsqueda y búsqueda vectorial:</strong> ya sea que estés ejecutando búsquedas de texto tradicionales o empleando una búsqueda vectorial de vanguardia para tus <a href="https://www.elastic.co/generative-ai">aplicaciones de inteligencia artificial generativa y RAG</a>, verás una marcada disminución en la latencia. La evaluación interna mostró una disminución promedio del 35% en la latencia de búsqueda.</p></li><li><p><strong>Indexación más rápida:</strong> Las tasas de ingesta de datos están optimizadas, lo que te permite indexar volúmenes masivos de datos y documentos complejos con mayor rendimiento. Esto es crucial para las aplicaciones que requieren visibilidad de datos casi en tiempo real. La evaluación comparativa interna mostró un aumento promedio del 26% en el rendimiento al indexar.</p></li></ul><h3><strong>Rendimiento constante bajo carga</strong></h3><p>Elastic Cloud Serverless está diseñado para escalar dinámicamente en tiempo real y satisfacer la demanda, lo que minimiza la latencia, independientemente de tu carga de trabajo. Gracias a esta actualización de hardware, ahora el escalado es más eficaz y ofrece una mayor capacidad de respuesta.</p><ul><li><p><strong>Manejar los picos con facilidad:</strong> ya sea que te enfrentes a un aumento repentino en el tráfico de usuarios o a una ingesta masiva de datos batch, la nueva infraestructura garantiza que tus recursos de búsqueda e indexación se escalen de manera más eficiente para mantener una latencia constantemente baja.</p></li><li><p><strong>Desacoplamiento optimizado de computación y almacenamiento:</strong> La arquitectura serverless separa computación y almacenamiento, lo que permite que las cargas de trabajo escalen de forma independiente para lograr un rendimiento óptimo y eficiencia de costos. El hardware más rápido mejora la capa de cómputo, lo que maximiza la eficiencia de este diseño desacoplado.</p></li></ul><h2><strong>Por dentro: Resultados de evaluación comparativa interna</strong></h2><p>Para cuantificar el impacto de la actualización de nuestra infraestructura de AWS, el equipo de ingeniería de Elastic llevó a cabo una exhaustiva evaluación comparativa interna con una serie de cargas de trabajo sin servidor. Estas cargas de trabajo proporcionaron evidencia empírica de mejoras de rendimiento que puedes esperar en todas tus aplicaciones, independientemente de tu caso de uso.</p><h3><strong>El enfoque comparativo</strong></h3><p>Centramos nuestras pruebas en las métricas clave que afectan directamente a la experiencia de los desarrolladores y a la capacidad de respuesta de las aplicaciones: el tiempo de respuesta (es decir, la latencia) y el rendimiento en las operaciones de búsqueda e indexación.</p><ul><li><p><strong>Cargas de trabajo probadas:</strong> Las pruebas incluyeron operaciones de búsqueda de alta concurrencia típicas de las aplicaciones orientadas al usuario, consultas de búsqueda vectorial complejas y la ingesta/indexación de grandes volúmenes de datos para casos de uso de observabilidad y seguridad. En concreto, nuestra metodología de pruebas utilizó <a href="https://github.com/elastic/rally-tracks/tree/master">sets de datos disponibles</a> <a href="https://github.com/elastic/rally-tracks/tree/master">públicamente para Rally</a>, la herramienta de evaluación comparativa de Elastic.</p><ul><li><p><a href="https://github.com/elastic/rally-tracks/tree/3bedd51/wikipedia"><code>wikipedia</code></a>: Un conjunto de datos derivado de un snapshot del contenido textual de Wikipedia, para medir el rendimiento de la búsqueda de texto de propósito general.</p></li><li><p><a href="https://github.com/elastic/rally-tracks/tree/3bedd51/msmarco-passage-ranking"><code>MSMARCO-Passage-Ranking</code></a>: Un conjunto de datos derivado de la comprensión de lectura automática de Microsoft (MS MARCO), para medir el rendimiento de búsqueda en campos vectoriales dispersos.</p></li><li><p><a href="https://github.com/elastic/rally-tracks/tree/3bedd51/openai_vector"><code>OpenAI_Vector</code></a>: Un set de datos derivado del NQ de BEIR y enriquecido con incrustaciones generadas por el modelo <code>text-embedding-ada-002</code> de OpenAI, para medir el rendimiento de búsqueda en campos vectoriales densos.</p></li></ul></li><li><p><strong>Medición:</strong> Comparamos el rendimiento en la infraestructura antigua y nueva, al medir la latencia en el percentil 99 (P99) para capturar el peor de los casos, el rendimiento de latencia en la cola y las operaciones por segundo. Cada pista se ejecutó cinco veces para cada perfil de hardware para garantizar la consistencia en los resultados.</p></li><li><p><strong>El objetivo:</strong> nuestro objetivo era validar la capacidad de la infraestructura para ofrecer <strong>un rendimiento más rápido y predecible</strong> de forma constante en todos los ámbitos, incluso durante los periodos de autoescalado rápido.</p></li></ul><h3><strong>Resumen de datos de rendimiento</strong></h3><p>Los resultados confirman un aumento significativo en la eficiencia y la velocidad. Estas ganancias se traducen directamente en tiempos de respuesta más bajos para tus usuarios y menores costos operativos como resultado de la capacidad de completar la misma cantidad de trabajo con menos recursos de cómputo.</p><p>Las siguientes tablas detallan las mejoras cuantitativas. Los valores más altos son mejores para el rendimiento; los valores más bajos son mejores para la latencia.</p><p><strong>Búsqueda de resultados del índice de referencia:</strong></p><p>Benchmark</p><p>Comparación</p><p>Infraestructura antigua</p><p>Nueva infraestructura</p><p>Diferencial</p><p>`wikipedia` (texto sin formato)</p><p>Rendimiento de operaciones de búsqueda (ops/s)</p><p>729</p><p>1107</p><p>+52 %</p><p>`wikipedia` (texto sin formato)</p><p>Latencia de la operación de búsqueda (p99, ms)</p><p>56</p><p>35</p><p>-37 %</p><p>`MSMARCO-Passage-Ranking` (vectores dispersos)</p><p>Rendimiento de operaciones de búsqueda (ops/s)</p><p>22</p><p>31</p><p>+40 %</p><p>`MSMARCO-Passage-Ranking` (vectores dispersos)</p><p>Latencia de la operación de búsqueda (p99, ms)</p><p>108</p><p>67</p><p>-38 %</p><p>`OpenAI_Vector` (vectores densos)</p><p>Rendimiento de operaciones de búsqueda (ops/s)</p><p>475</p><p>624</p><p>+31 %</p><p>`OpenAI_Vector` (vectores densos)</p><p>Latencia de la operación de búsqueda (p99, ms)</p><p>35</p><p>22</p><p>-37 %</p><p><strong>Resultados de referencia de indexación:</strong></p><p>Benchmark</p><p>Comparación</p><p>Infraestructura antigua</p><p>Nueva infraestructura</p><p>Diferencial</p><p>`wikipedia` (texto sin formato)</p><p>Rendimiento de operaciones de búsqueda (ops/s)</p><p>2845</p><p>3220</p><p>+13 %</p><p>`wikipedia` (texto sin formato)</p><p>Latencia de la operación de búsqueda (p99, ms)</p><p>1769</p><p>1120</p><p>-37 %</p><p>`MSMARCO-Passage-Ranking` (vectores dispersos)</p><p>Rendimiento de operaciones de búsqueda (ops/s)</p><p>7087</p><p>8900</p><p>+26 %</p><p>`MSMARCO-Passage-Ranking` (vectores dispersos)</p><p>Latencia de la operación de búsqueda (p99, ms)</p><p>824</p><p>677</p><p>-18 %</p><p>`OpenAI_Vector` (vectores densos)</p><p>Rendimiento de operaciones de búsqueda (ops/s)</p><p>2972</p><p>3187</p><p>+7 %</p><p>`OpenAI_Vector` (vectores densos)</p><p>Latencia de la operación de búsqueda (p99, ms)</p><p>2946</p><p>2944</p><p>0 %</p><h2><strong>La ventaja adicional: reducción de costos</strong></h2><p>Aunque nuestro objetivo es ofrecer un rendimiento de baja latencia, la eficiencia del nuevo hardware también tiene un impacto directo y positivo en los costos de los proyectos de Elasticsearch.</p><p><a href="https://www.elastic.co/pricing/serverless-search">El precio de Elasticsearch Serverless</a> se basa en el uso, lo que significa que solo pagas por los recursos de ingesta y búsqueda que consumes. Debido a que el hardware más nuevo y rápido es más eficiente, tus cargas de trabajo a menudo completarán tareas empleando menos recursos, lo que genera una reducción de costos inherente para la mayoría de los proyectos. Obtendrás un aumento de rendimiento superior sin un precio premium: la definición de eficiencia optimizada.</p><h2><strong>¿Qué significa esto para ti, el desarrollador?</strong></h2><p>Esta actualización de infraestructura está gestionada íntegramente por Elastic, así que no tienes que mover un dedo: no hay migraciones ni cambios de configuración. La mejora es inmediata y automática en todos tus proyectos serverless basados en AWS.</p><p>Esta actualización te permite:</p><ul><li><p><strong>Crea aplicaciones más rápidas:</strong> concéntrate en la velocidad de las características, sabiendo que tu plataforma de búsqueda subyacente ofrece la velocidad que exigen tus usuarios.</p></li><li><p><strong>Innova con confianza:</strong> despliega nuevas características de búsqueda, observabilidad y seguridad, incluidas capacidades complejas de IA, como búsqueda vectorial y clasificación de relevancia, con la seguridad de que la Platform puede manejar la carga al máximo rendimiento.</p></li><li><p><strong>Simplifica tu stack:</strong> Usa un servicio totalmente gestionado que gestione la infraestructura, la planificación de la capacidad y el escalado, para que puedas centrarte en tu código y datos.
</p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-serverless-aws-performance-boost</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-serverless-aws-performance-boost</guid>
    <category><![CDATA[Elastic Cloud Serverless]]></category>
    <category><![CDATA[Operaciones]]></category>
    <dc:creator><![CDATA[Pete Galeotti,Yuvraj Gupta,Rachel Forshee]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt399bcc5a2e55bfe0/6a1708b45091684557e1ba3c/3aa0b481994d2445ba979d3c79fff64c5ee6676a-720x420.jpg" length="0" type="image/jpeg"/>
    <pubDate>Wed, 14 Jan 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Mejora de la relevancia del modelo de incrustación multilingüe con reclasificación híbrida en búsquedas]]></title>
    <description><![CDATA[Aprende cómo mejorar la relevancia de los resultados de búsqueda del modelo de incrustación multilingüe E5 usando el reclasificador y la búsqueda híbrida de Cohere en Elasticsearch.]]></description>
    <content:encoded><![CDATA[<h2>Introducción</h2><p>En la <a href="https://www.elastic.co/search-labs/blog/multilingual-embedding-model-deployment-elasticsearch">última parte de este serial</a>, explicamos cómo desplegar el modelo E5 preentrenado de Elastic (así como otros modelos multilingües de incrustación de texto de Hugging Face) y nos adentramos en la generación de incrustaciones vectoriales densas a partir de tus datos textuales usando Elasticsearch y Kibana. En este blog, analizaremos los resultados de estas incrustaciones y destacaremos los beneficios significativos de aprovechar un modelo multilingüe.</p><p>Ahora que tenemos nuestro índice <code>coco_multilingual</code>, realizar la búsqueda nos dará documentos en varios idiomas, con el campo "en" para que podamos consultar:</p># GET coco_multilingual/_search
    {
       "_index": "coco_multilingual",
       "_id": "WAiXQJYBgf6odR9bLohZ",
       "_score": 1,
       "_source": {
         "description": "Ein Parkmeßgerät auf einer Straße mit Autos",
         "en": "A row of parked cars sitting next to parking meters.",
         "language": "de",
         "vector_description": {...}
       }
     },
     . . .<h2>Realizando una búsqueda en inglés</h2><p>Intentemos hacer la búsqueda en inglés y ver qué tal va:</p>GET coco_multi/_search
{
"size": 10,
"_source": [
  "description", "language", "en"
],
"knn": {
  "field": "vector_description.predicted_value",
  "k": 10,
  "num_candidates": 100,
  "query_vector_builder": {
    "text_embedding": {
      "model_id": ".multilingual-e5-small_linux-x86_64_search",
      "model_text": "query: kitty"
    }
  }
}
}{
       "_index": "coco_multi",
       "_id": "JQiXQJYBgf6odR9b6Yz0",
       "_score": 0.9334303,
       "_source": {
         "description": "Eine Katze, die in einem kleinen, gepackten Koffer sitzt.",
         "en": "A brown and white cat is in a suitcase.",
         "language": "de"
       }
     },
      {
       "_index": "coco_multi",
       "_id": "3AiXQJYBgf6odR9bFod6",
       "_score": 0.9281012,
       "_source": {
         "description": "Una bambina che tiene un gattino vicino a una recinzione blu.",
         "en": "A little girl holding a kitten next to a blue fence.",
         "language": "it"
       }
     },
     . . .<p>Aquí, aunque la consulta parezca engañosamente simple, estamos buscando las incrustaciones numéricas de la palabra 'kitty' en todos los documentos y todos los idiomas que aparecen debajo del capó. Y como realizamos búsqueda vectorial, podemos buscar semánticamente todas las palabras que puedan estar relacionadas con 'kitty': "cat", "kitten", "felino", "gatto" (italiano), "meo" (vietnamita), 고양이 (coreano), 猫 (chino), etc. Como resultado, aunque mi consulta esté en inglés, también podemos buscar contenido en todos los demás idiomas. Por ejemplo, buscar un gatito<code>ying on something</code> también devuelve documentos en italiano, neerlandés o vietnamita. ¡Eso sí que es eficiencia!</p><h2>Realizar una búsqueda de contenido en otros idiomas</h2>GET coco_multi/_search
{  
 "size": 100,
 "_source": [
   "description", "language", "en"
 ],
 "knn": {
   "field": "vector_description.predicted_value",
   "k": 50,
   "num_candidates": 1000,
   "query_vector_builder": {
     "text_embedding": {
       "model_id": ".multilingual-e5-small_linux-x86_64_search",
       "model_text": "query: kitty lying on something"
     }
   }
 }
}{
 "description": "A black kitten lays on her side beside remote controls.",
 "en": "A black kitten lays on her side beside remote controls.",
 "language": "en"
},
{
 "description": "un gattino sdraiato su un letto accanto ad alcuni telefoni ",
 "en": "A black kitten lays on her side beside remote controls.",
 "language": "it"
},
{
 "description": "eine Katze legt sich auf ein ausgestopftes Tier",
 "en": "a cat lays down on a stuffed animal",
 "language": "de"
},
{
 "description": "Một chú mèo con màu đen nằm nghiêng bên cạnh điều khiển từ xa.",
 "en": "A black kitten lays on her side beside remote controls.",
 "language": "vi"
}
. . .<p>De manera similar, realizar una búsqueda por palabra clave de "cat" en coreano ("고양이") también devolverá resultados significativos. Lo espectacular aquí es que ni siquiera tenemos documentos en coreano en este índice.</p>GET coco_multi/_search
{
 "size": 100,
 "_source": [
   "description", "language", "en"
 ],
 "knn": {
   "field": "vector_description.predicted_value",
   "k": 50,
   "num_candidates": 1000,
   "query_vector_builder": {
     "text_embedding": {
       "model_id": ".multilingual-e5-small_linux-x86_64_search",
       "model_text": "query: 고양이"
     }
   }
 }
} {
       {
         "description": "eine Katze legt sich auf ein ausgestopftes Tier",
         "en": "a cat lays down on a stuffed animal",
         "language": "de"
       }
     },
     {
       {
         "description": "Một con chó và con mèo đang ngủ với nhau trên một chiếc ghế dài màu cam.",
         "en": "A dog and cat lying  together on an orange couch. ",
         "language": "vi"
       }
     },<p>Esto funciona porque el modelo de incrustación representa el significado en un espacio semántico compartido, permitiendo la recuperación de imágenes relevantes incluso con una consulta en un idioma diferente al de los subtítulos indexados.</p><h2>Aumento de resultados de búsqueda relevantes con búsqueda híbrida y reposicionamiento</h2><p>Estamos contentos de que los resultados relevantes llegaron como se esperaba. Pero, en el mundo real, por ejemplo en comercio electrónico o en aplicaciones RAG que necesitan reducir a los 5-10 resultados más aplicables, podemos usar un modelo de reclasificación para priorizar los resultados más relevantes.</p><p>Aquí, realizar una consulta que pregunte "¿de qué color es el gato?" en vietnamita dará muchos resultados, pero el top 1 o 2 puede no ser el más relevante.</p>GET coco_multi/_search
{
 "size": 20,
 "_source": [
   "description",
   "language",
   "en"
 ],
 "knn": {
   "field": "vector_description.predicted_value",
   "k": 20,
   "num_candidates": 1000,
   "query_vector_builder": {
     "text_embedding": {
       "model_id": ".multilingual-e5-small_linux-x86_64_search",
       "model_text": "query: con mèo màu gì?"
     }
   }
 }
}<p>Todos los resultados mencionan gato, o algún tipo de color:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt979f5944b1708042/6a17ef76420229ff6829f6aa/33e1e887dbbdd1066cfedc7375f5e3b46538529e-859x847.png" alt="" /><p>¡Así que vamos a mejorar eso! Integremos el modelo multilingüe de reclasificación de <a href="https://cohere.com/blog/rerank-3pt5">Cohere</a>para mejorar el razonamiento correspondiente a nuestra pregunta.</p>PUT _inference/rerank/cohere_rerank
{
 "service": "cohere",
 "service_settings": {
   "api_key": "your_api_key",
   "model_id": "rerank-v3.5"
 },
 "task_settings": {
   "top_n": 10,
   "return_documents": true
 }
}


GET coco_multi/_search
{
"size": 10,
"_source": [
  "description",
  "language",
  "en"
],
"retriever": {
  "text_similarity_reranker": {
    "retriever": {
      "rrf": {
        "retrievers": [
          {
            "knn": {
              "field": "vector_description.predicted_value",
              "k": 50,
              "num_candidates": 100,
              "query_vector_builder": {
                "text_embedding": {
                  "model_id": ".multilingual-e5-small_linux-x86_64_search",
                  "model_text": "query: con mèo màu gì?" // English: What color is the cat?
                }
              }
            }
          }
        ],
        "rank_window_size": 100,
        "rank_constant": 0
      }
    },
    "field": "description",
    "inference_id": "cohere_rerank",
    "inference_text": "con mèo màu gì?"
  }
}
} {
       "_index": "coco_multi",
       "_id": "rQiYQJYBgf6odR9bBYyH",
       "_score": 1.5501487,
       "_source": {
         "description": "Hai cái điện thoại được đặt trên một cái chăn cạnh một con mèo con màu đen.",
         "en": "A black kitten lays on her side beside remote controls.",
         "language": "vi"
       }
     },
     {
       "_index": "coco_multi",
       "_id": "swiXQJYBgf6odR9b04uf",
       "_score": 1.5427427,
       "_source": {
         "description": "Một con mèo sọc nâu nhìn vào máy quay.", // Real translation: A brown striped cat looks at the camera 
         "en": "This cat is sitting on a porch near a tire.",
         "language": "vi"
       }
     },<p>Ahora, con los mejores resultados, nuestra solicitud puede responder con confianza que el color del gatito es negro o marrón con rayas. Lo que resulta aún más interesante aquí es que nuestra búsqueda vectorial detectó una omisión en el pie de foto en inglés del conjunto de datos original. Es capaz de encontrar al gato de rayas marrones aunque la traducción de referencia al inglés no mencionó ese detalle. Este es el poder de la búsqueda vectorial.</p><h2>Conclusión</h2><p>En este blog, explicamos la utilidad de un modelo de incrustación multilingüe y cómo aprovechar Elasticsearch para integrar los modelos y generar embeddings, y mejorar eficazmente la relevancia y la precisión mediante una búsqueda híbrida y un reclasificador. Puedes <a href="https://cloud.elastic.co/registration?onboarding_token=vectorsearch&amp;cta=cloud-registration&amp;tech=trial&amp;plcmt=article%20content&amp;pg=search-labs">crear tu propio clúster en la nube</a> para probar <a href="https://www.elastic.co/docs/explore-analyze/machine-learning/nlp/ml-nlp-e5">la búsqueda semántica multilingüe usando nuestro modelo E5 estándar</a> en el idioma y conjunto de datos que elijas.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/multilingual-embedding-model-hybrid-search-reranking</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/multilingual-embedding-model-hybrid-search-reranking</guid>
    <category><![CDATA[Base de datos vectorial]]></category>
    <category><![CDATA[Operaciones]]></category>
    <dc:creator><![CDATA[Quynh Nguyen]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf625e3f63fcd9f54/6a17ef7796142a61f8eb1bcd/d341b04acecc8eeec321f5404e1643447ecc8526-720x420.png" length="0" type="image/png"/>
    <pubDate>Mon, 03 Nov 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Despliegue de un modelo de incrustación multilingüe en Elasticsearch]]></title>
    <description><![CDATA[Aprende a desplegar un modelo de incrustación multilingüe e5 para búsqueda vectorial y recuperación cross-lingual en Elasticsearch.]]></description>
    <content:encoded><![CDATA[<h2>Introducción</h2><p>En un mundo de usuarios globales, la recuperación de información multilingüe (CLIR) es fundamental. En lugar de limitar las búsquedas a un solo idioma, CLIR te permite encontrar información en <em>cualquier</em> idioma, mejorando la experiencia del usuario y agilizando las operaciones. Imagina un mercado global donde los clientes de comercio electrónico puedan buscar artículos en su idioma, y los resultados adecuados aparezcan, sin necesidad de localizar los datos de antemano. O bien, donde los investigadores académicos pueden buscar artículos en su lengua materna, con matices y complejidad, incluso si la fuente está en otro idioma.</p><p>Los modelos de incrustación de texto multilingüe nos permiten hacer precisamente eso. Las incrustaciones son una forma de representar el significado del texto como vectores numéricos. Estos vectores están diseñados para que textos con significados similares estén situados cerca unos de otros en un espacio de alta dimensión. Los modelos de incrustación de texto multilingüe están diseñados específicamente para mapear palabras y frases con el mismo significado entre diferentes idiomas en un espacio vectorial similar.</p><p>Modelos como el Multilingüe E5 de código abierto se capacitan con enormes cantidades de datos textuales, a menudo empleando técnicas como el aprendizaje contrastivo. En este enfoque, el modelo aprende a distinguir entre pares de textos con significados similares (pares positivos) y aquellos con significados diferentes (pares negativos). El modelo se capacita para ajustar los vectores que produce de modo que se maximice la similitud entre pares positivos y se minimice la similitud entre pares negativos. Para modelos multilingües, estos datos de entrenamiento incluyen pares de texto en diferentes idiomas que son traducciones entre sí, permitiendo al modelo aprender un espacio de representación compartido para múltiples idiomas. Las incrustaciones resultantes pueden usar para diversas tareas de PLN, incluyendo la búsqueda cross-lingual, donde la similitud entre incrustaciones de texto se emplea para encontrar documentos relevantes independientemente del idioma de la consulta.</p><h2>Beneficios de la búsqueda vectorial multilingüe</h2><ul><li><p><strong>Matiz:</strong> La búsqueda vectorial destaca en captar el significado semántico, yendo más allá de la simple búsqueda de palabras clave. Esto es crucial para tareas que requieren comprender el contexto y las sutilezas del lenguaje.</p></li><li><p><strong>Comprensión interlingüe</strong>: Permite una recuperación efectiva de información entre idiomas, incluso cuando la consulta y los documentos emplean vocabulario diferente.</p></li><li><p><strong>Relevancia</strong>: Ofrece resultados más relevantes centrar en la similitud conceptual entre consultas y documentos.</p></li></ul><p>Por ejemplo, consideremos a un investigador académico que estudia el "impacto de las redes sociales en el discurso político" en diferentes países. Con la búsqueda vectorial, pueden introducir consultas como "l'impacto dei social media sul discorso politico" (italiano) o "ảnh hưởng của mạng xã hội đối với diễn ngôn chính trị" (vietnamita) y encontrar artículos relevantes en inglés, español o cualquier otro idioma indexado. Esto se debe a que la búsqueda vectorial identifica artículos que discuten el <em>concepto</em> de influencia de las redes sociales en la política, no solo aquellos que contienen las palabras clave exactas. Esto mejora enormemente la amplitud y profundidad de su investigación.</p><h2>Primeros pasos</h2><p>Así es como configurar CLIR usando Elasticsearch, con el modelo E5 que se proporciona de fábrica. Emplearemos el <a href="https://huggingface.co/datasets/romrawinjp/multilingual-coco">conjunto de datos multilingüe de código abierto COCO</a>, que contiene pies de foto en varios idiomas, para ayudarnos a visualizar dos tipos de búsquedas:</p><ol><li><p>Consultas y términos de búsqueda en otros idiomas en un conjunto de datos en inglés, y</p></li><li><p>Consultas en varios idiomas sobre un conjunto de datos que contiene documentos en varios idiomas.</p></li></ol><p>Luego, aprovecharemos el poder de la búsqueda híbrida y el reposicionamiento para mejorar aún más los resultados de búsqueda.</p><h2>Prerrequisitos</h2><ul><li><p>Python 3.6+</p></li><li><p>Elasticsearch 8+</p></li><li><p>Cliente Python de Elasticsearch: instalación de pip elasticsearch</p></li></ul><h2>Conjunto de datos</h2><p>El <a href="https://huggingface.co/datasets/romrawinjp/multilingual-coco">conjunto de datos COCO</a> es un conjunto de datos de subtitulado a gran escala. Cada imagen del conjunto de datos está subtitulada en varios idiomas diferentes, con varias traducciones disponibles por idioma. Para fines demostrativos, indexaremos cada traducción como un documento individual, junto con la primera traducción al inglés disponible para referencia.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfc7e508e9a7dffe8/6a17f3e2b1e113249579f394/d4f0632529c71a22fbdecf21c9f4f0bb64b8e69c-1600x567.png" alt="" /><h3>Paso 1: descargar el conjunto de datos multilingüe COCO</h3><p>Para simplificar el blog y facilitar el seguimiento, aquí estamos cargando las primeras 100 filas de Restval en un archivo JSON local con una llamada API sencilla. Alternativamente, puedes usar los conjuntos de datos de la biblioteca de HuggingFace para cargar el conjunto de datos completo o subconjuntos del conjunto.</p>import requests
import json
import os
### Download multilingual coco dataset into a json file (for easy viewing)
### Here we are retrieving first 100 rows for this example
### Alternatively, you can use `datasets` library from Hugging Face
url = "https://datasets-server.huggingface.co/rows?dataset=romrawinjp%2Fmultilingual-coco&amp;config=default&amp;split=restval&amp;offset=0&amp;length=100"
response = requests.get(url)


if response.status_code == 200:
   data = response.json()
   output_file = "multilingual_coco_sample.json" 
   ### Loading the downloaded content into a json file locally
   with open(output_file, "w", encoding="utf-8") as f:
       json.dump(data, f, indent=4, ensure_ascii=False)
   print(f"Data successfully downloaded and saved to {output_file}")
else:
   print(f"Failed to download data: {response.status_code}")
   print(response.text)<p>Si los datos se cargan correctamente en un archivo JSON, deberías ver algo similar a lo siguiente:</p><p><code>Data successfully downloaded and saved to multilingual_coco_sample.json</code></p><h3>Paso 2: (Iniciar Elasticsearch) e indexar los datos en Elasticsearch</h3><p>a) Inicia tu servidor local de Elasticsearch.</p><p>b) Iniciar el cliente Elasticsearch.</p>from elasticsearch import Elasticsearch
from getpass import getpass


# Initialize Elasticsearch client
es = Elasticsearch(getpass("Host: "), api_key=getpass("API Key: "))


index_name = "coco"


# Create the index if it doesn't exist
if not es.indices.exists(index=index_name):
   es.indices.create(index=index_name, body=mapping)<p>c) Datos de índice</p># Load the JSON data
with open('./multilingual_coco_sample.json', 'r') as f:
   data = json.load(f)


rows = data["rows"]
# List of languages to process
languages = ["en", "es", "de", "it", "vi", "th"]


# For each image, we will process each individual caption as its own document
bulk_data = []
for data in rows:
   row = data["row"]
   image = row.get("image")
   image_url = image["src"]


   # Process each language
   for lang in languages:
       # Skip if language not present in this row
       if lang not in row:
           continue


       # Get all descriptions for this language
 # along with first available English caption for reference
       descriptions = row[lang]
       first_eng_caption = row["en"][0]


       # Prepare bulk indexing data
       for description in descriptions:
           if description == "":
               continue
           # Add index operation
           bulk_data.append(
               {"index": {"_index": index_name}}
           )
           # Add document
           bulk_data.append({
               "language": lang,
               "description": description,
               "en": first_eng_caption,
               "image_url": image_url,
           })


# Perform bulk indexing
if bulk_data:
   try:
       response = es.bulk(operations=bulk_data)
       if response["errors"]:
           print("Some documents failed to index")
       else:
           print(f"Successfully bulk indexed {len(bulk_data)} documents")
   except Exception as e:
       print(f"Error during bulk indexing: {str(e)}")


print("Indexing complete!")<p>Una vez indexados los datos, deberías ver algo similar a lo siguiente:</p><p><code>Successfully bulk indexed 4840 documents</code></p><p><code>Indexing complete!</code></p><h3>Paso 3: Desplegar el modelo capacitado con E5</h3><p>En Kibana, accede a la página de Stack Management &gt; <strong>Trained Models</strong> y haz clic <strong>en Desplegar</strong> para el .multilingual-e5-small_linux-x86_64 opción. Este modelo E5 es un pequeño multilingüe optimizado para linux-x86_64, que podemos usar de fábrica. Al hacer clic en 'Desplegar' aparecerá una pantalla donde puedes ajustar la configuración de despliegue o las configuraciones de los vCPU. Para simplificar, optaremos por las opciones predeterminadas, con recursos adaptativos seleccionados, que escalarán automáticamente nuestro despliegue según el uso.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfbc09867063a8e6f/6a17f3e3148009a295b4889d/95cd8f352425d1db2d04b00c3c88d1e71d1ef19a-1600x440.png" alt="" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt264a2016341e9b6f/6a17f3f0e8fbce18de3a1aa7/1599d99949dda8267acc58f400a403a3af5373ef-1600x655.png" alt="" /><p>Opcionalmente, si quieres usar otros modelos de incrustación de texto, puedes hacerlo. Por ejemplo, para usar el BGE-M3, puedes usar <a href="https://www.elastic.co/docs/reference/elasticsearch/clients/eland/machine-learning#ml-nlp-pytorch">el cliente Eland Python de Elastic</a> para importar el modelo desde HuggingFace.</p>export MODEL_ID="bge-m3"
export HUB_MODEL_ID="BAAI/bge-m3"
export CLOUD_ID={{CLOUD_ID}}
export ES_API_KEY={{API_KEY}}
docker run -it --rm docker.elastic.co/eland/eland \
eland_import_hub_model --cloud-id $CLOUD_ID --es-api-key $ES_API_KEY --hub-model-id $HUB_MODEL_ID --es-model-id $MODEL_ID --task-type text_embedding --start<p>Luego, ve a la página de Modelos Capacitados para desplegar el modelo importado con las configuraciones deseadas.</p><h3>Paso 4: Vectorizar o crear incrustaciones para los datos originales con el modelo desplegado</h3><p>Para crear los embeddings, primero necesitamos crear un pipeline de ingesta que nos permita tomar el texto y pasarlo por el modelo de embedding de texto de inferencia. Puedes hacerlo en la interfaz de usuario de Kibana o a través de la API de Elasticsearch.</p><p><strong>Para hacerlo a través de la interfaz Kibana</strong>, tras desplegar el Modelo Capacitado, haz clic en el botón <strong>Test </strong>. Esto te dará la posibilidad de probar y previsualizar los embeddings generados. Crea una nueva vista de datos para elíndice de <code>coco</code>, configura la vista de datos en la vista de datos coco recién creada y pon el campo en <code>description</code> porque ese es el campo para el que queremos generar incrustaciones.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt24a2b9a9a5111bbc/6a17f3f13e9e452c7fba15d5/cfe189e13dc118d325e7fb90bdace0c912e29f51-1088x1600.png" alt="" /><p>¡Eso funciona genial! Ahora podemos proceder a crear la pipeline de ingest, reindexar nuestros documentos originales, pasarlos por la pipeline y crear un nuevo índice con los embeddings. Puedes conseguirlo haciendo clic <strong>en Crear pipeline</strong>, lo que te guiará durante el proceso de creación de pipeline, con procesadores auto-repoblados necesarios para ayudarte a crear los embeddings.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte39c5ad52702103d/6a17f3f3e9ea87dd05a9c734/1e043c1c3279b66fbdf19c06b41e76e613043998-1600x1126.png" alt="" /><p>El asistente también puede rellenar automáticamente los procesadores necesarios para gestionar fallos mientras se ingieren y procesan los datos.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt63e002a79d177cf4/6a17f3f596142a3e91eb1c48/8804d31b4f869078e3b2245040bbb0ab1720a94a-1600x1084.png" alt="" /><p>Ahora creemos la canalización de ingest. Voy a nombrar el oleoducto <code>coco_e5</code>. Una vez que la tubería se crea correctamente, puedes usarla inmediatamente para generar las incrustaciones reindexando los datos originales indexados a un nuevo índice en el asistente. Haz clic <strong>en Reindexar </strong>para iniciar el proceso.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt39243d9ad1779fdf/6a17f3f696142a13eaeb1c4c/e34b1b18f5b24420d4581fe4d657c569926c2023-1600x1126.png" alt="" /><h2>Para configuraciones más complejas, podemos usar la API de Elasticsearch.</h2><p>Para algunos modelos, debido a la forma en que se capacitaron, puede que necesitemos anteponer o agregar ciertos textos a la entrada real antes de generar los embeddings; de lo contrario, veremos una degradación del rendimiento.</p><p>Por ejemplo, con el e5, el modelo espera que el texto de entrada siga a "passage: {content of passage}". Empleemos los pipelines de ingest para lograrlo: crearemos un nuevo <strong>pipeline de ingest vectorize_descriptions</strong>. En esta canalización, crearemos un nuevo campo de <code>temp_desc</code> temporal, antepondremos "passage: " al texto <code>description</code> , pasaremos <code>temp_desc</code> por el modelo para generar incrustaciones de texto y luego eliminaremos el <code>temp_desc</code>.</p>PUT _ingest/pipeline/vectorize_descriptions
{
"description": "Pipeline to run the descriptions text_field through our inference text embedding model",
"processors": [
 {
   "set": {
     "field": "temp_desc",
     "value": "passage: {{description}}"
   }
 },
 {
   "inference": {     
"field_map": {
       "temp_desc": "text_field"
     },
     "model_id": ".multilingual-e5-small_linux-x86_64_search",
     "target_field": "vector_description"
   }
 },
 {
   "remove": {
     "field": "temp_desc"
   }
 }
]
}<p>Además, podríamos querer especificar qué <a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/dense-vector#dense-vector-quantization">tipo de cuantización</a> queremos usar para el vector generado. Por defecto, Elasticsearch usa <code>int8_hnsw</code>, pero aquí quiero <a href="https://www.elastic.co/search-labs/blog/better-binary-quantization-lucene-elasticsearch">Better Binary Quantization</a> (o <code>bqq_hnsw</code>), que reduce cada dimensión a una precisión de un solo bit. Esto reduce la huella de memoria en un 96% (o 32 veces) a un costo mayor en la precisión. Opto por este tipo de cuantización porque sé que usaré un reclasificador más adelante para mejorar la pérdida de precisión.</p><p>Para ello, crearemos un nuevo índice llamado <strong>coco_multi</strong> y especificaremos los mapeos. La magia aquí está en el campo vector_description, donde especificamos que el tipo del <strong>index_options</strong>debe <strong>ser bbq_hnsw</strong>.</p>PUT coco_multi
{
 "mappings": {
   "properties": {
     "description": {
       "type": "text"
     },
     "en": {
       "type": "text"
     },
     "image_url": {
       "type": "keyword"
     },
     "language": {
       "type": "keyword"
     },
     "vector_description.predicted_value": {
       "type": "dense_vector",
       "dims": 384,
       "index": "true",
       "similarity": "cosine",
       "index_options": {
         "type": "bbq_hnsw" 
       }
     }
   }
 }
}<p>Ahora, podemos reindexar los documentos originales a un nuevo índice, con nuestra pipeline de ingesta que "vectorizará" o creará incrustaciones para el campo de descripciones.</p>POST _reindex?wait_for_completion=false
{
 "source": {
   "index": "coco"
 },
 "dest": {
   "index": "coco_multilingual",
   "pipeline": "vectorize_descriptions"
 }
}<p>¡Y eso es todo! Desplegamos con éxito un modelo multilingüe con Elasticsearch y Kibana y aprendido paso a paso cómo crear las incrustaciones vectoriales con tus datos con Elastic, ya sea a través de la interfaz de usuario de Kibana o con la API de Elasticsearch. En la segunda parte de este serial, exploraremos los resultados y las particularidades del uso de un modelo multilingüe. Mientras tanto, puedes <a href="https://cloud.elastic.co/registration?onboarding_token=vectorsearch&amp;cta=cloud-registration&amp;tech=trial&amp;plcmt=article%20content&amp;pg=search-labs">crear tu propio clúster en la nube</a> para probar <a href="https://www.elastic.co/docs/explore-analyze/machine-learning/nlp/ml-nlp-e5">la búsqueda semántica multilingüe usando nuestro modelo E5 estándar</a> en el idioma y conjunto de datos que elijas.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/multilingual-embedding-model-deployment-elasticsearch</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/multilingual-embedding-model-deployment-elasticsearch</guid>
    <category><![CDATA[Base de datos vectorial]]></category>
    <category><![CDATA[Operaciones]]></category>
    <dc:creator><![CDATA[Quynh Nguyen]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt59254226694f93a6/6a17f3f81480098988b488a1/8f2aa7bebb6b2f701e274ba7282273f9ab4abed6-720x432.png" length="0" type="image/png"/>
    <pubDate>Wed, 22 Oct 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Rastreador Elástico de Sitio web Abierto como código]]></title>
    <description><![CDATA[Aprende a usar GitHub Actions para gestionar configuraciones de Elastic Open Crawler, de modo que cada vez que enviemos cambios al repositorio, los cambios se apliquen automáticamente a la instancia desplegada del rastreador.]]></description>
    <content:encoded><![CDATA[<p>Con <a href="https://github.com/elastic/crawler">Elastic Open Sitio web Crawler</a> y su arquitectura basada en CLI, tener configuraciones de rastreador versionado y una pipeline CI/CD con pruebas locales ahora es bastante sencillo de lograr.</p><p>Tradicionalmente, gestionar los rastreadores era un proceso manual y propenso a errores. Implicaba editar configuraciones directamente en la interfaz y luchar con clonar configuraciones de rastreo, retrocesos, versionear y más. Tratar las configuraciones de rastreadores como código resuelve esto al proporcionar los mismos beneficios que esperamos en el desarrollo de software: repetibilidad, trazabilidad y automatización.</p><p>Este flujo de trabajo facilita la incorporación del Open Sitio web Crawler a tu pipeline CI/CD para rollbacks, copias de seguridad y migraciones, tareas que eran mucho más complicadas con los Elastic Crawlers anteriores, como el Elastic Sitio web Crawler o el App Search Crawler.</p><p>En este artículo, vamos a aprender cómo:</p><ul><li><p>Gestiona nuestras configuraciones de rastreo usando GitHub</p></li><li><p>Tener una configuración local para probar pipelines antes de desplegar</p></li><li><p>Crea una configuración de producción para ejecutar el rastreador sitio web con nuevos ajustes cada vez que enviemos cambios a nuestra rama principal</p></li></ul><p>Puedes encontrar el repositorio de <a href="https://github.com/llermaly/elastic-open-crawler-as-code"><em><strong>proyectos aquí</strong></em></a><em><strong>. </strong></em><em>Según escribo, estoy usando Elasticsearch 9.1.3 y Open Sitio web Crawler 0.4.2.</em></p><h2>Prerrequisitos</h2><ul><li><p>Escritorio Docker</p></li><li><p>Instancia de Elasticsearch</p></li><li><p>Máquina virtual con acceso SSH (por ejemplo, AWS EC2) y Docker instalados</p></li></ul><h2>Pasos</h2><ol><li><p>Estructura de carpetas</p></li><li><p>Configuración del orugador</p></li><li><p>Docker-compose (entorno local)</p></li><li><p>Acciones en Github</p></li><li><p>Pruebas locales</p></li><li><p>Desplegando a la producción</p></li><li><p>Realización de cambios y re-despliegue</p></li></ol><h2>Estructura de carpetas</h2><p>Para este proyecto, tendremos la siguiente estructura de archivos:</p>├── docker-compose.yml # Local elasticsearch + crawler
├── config/crawler-config.yml # Crawler config
├── .github/workflows/deploy.yml # GH Action to deploy changes
├── local.sh # Script to run our local crawler<h2>Configuración del orugador</h2><p>Bajo <code>crawler-config.yml,</code> pondremos lo siguiente:</p>output_sink: elasticsearch
output_index: web-crawl-index
max_crawl_depth: 1

elasticsearch:
  host: ${ES_HOST}
  api_key: ${ES_API_KEY}
     
domains:
  - url: https://web-scraping.dev
    seed_urls:
      - https://web-scraping.dev/product/1
      - https://web-scraping.dev/product/2
      - https://web-scraping.dev/product/3<p>Esto se rastreará desde <a href="https://web-scraping.dev/products">https://sitio web-scraping.dev/products</a>, un sitio simulado de productos. Solo rastrearemos las tres primeras páginas del producto. La configuración <code>max_crawl_depth</code> evitará que el rastreador descubra más páginas de las definidas como <code>seed_urls</code> al no abrir los enlaces que contienen.</p><p>Elasticsearch <code>host</code> y <code>api_key</code> se llenarán dinámicamente dependiendo del entorno en el que ejecutemos el script.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7d37b966aafbd3c1/6a17ef9842022946e929f6b9/f9831034e1c4ccb554d37bdd188f2824338355a0-890x624.png" alt="La página del producto de &quot;Box of Chocolate Candy&quot; del dominio sitio web-scraping.dev, un sitio simulado para probar sitio web scraping. La página muestra el título del producto, la imagen, la descripción y los elementos HTML para los botones de precio y compra." /><h2>Docker-compose (entorno local)</h2><p>Para la <code>docker-compose.yml,</code> local desplegaremos el rastreador y un único clúster Elasticsearch + Kibana, para poder visualizar fácilmente los resultados del <em><strong>rastreo antes</strong></em> de desplegarlos en producción.</p>services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:9.1.3
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
      - ES_JAVA_OPTS=-Xms1g -Xmx1g
    ports:
      - "9200:9200"
    networks: [esnet]
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9200"]
      interval: 5s
      timeout: 5s
      retries: 10

  kibana:
    image: docker.elastic.co/kibana/kibana:9.1.3
    environment:
      - ELASTICSEARCH_HOSTS=http://es01:9200
    ports:
      - "5601:5601"
    networks: [esnet]
    depends_on: [es01]

  crawler:
    image: docker.elastic.co/integrations/crawler:0.4.2
    environment:
      - ES_HOST=http://es01:9200
      - CRAWLER_JRUBY_OPTS=--server
    container_name: crawler
    volumes:
      - ./config:/home/app/config
    networks: [esnet]
    entrypoint: ["/home/app/bin/crawler", "crawl", "/home/app/config/crawl-config-final.yml"]
    stdin_open: true
    tty: true

networks:
  esnet:
    driver: bridge<p>Fíjate en cómo el rastreador espera hasta que Elasticsearch esté listo para ejecutar.</p><h2>Acciones en Github</h2><p>Ahora necesitamos crear una acción en GitHub que copie la nueva configuración y ejecute el rastreador en nuestra máquina virtual en cada envío a main. Esto garantiza que siempre tengamos la última configuración desplegada, sin tener que entrar manualmente en la máquina virtual para actualizar archivos y ejecutar el rastreador. Vamos a usar AWS EC2 como proveedor de máquinas virtuales.</p><p>El primer paso es agregar el host (<code>VM_HOST</code>), el usuario de la máquina (<code>VM_USER</code>), la clave SSH RSA (<code>VM_KEY</code>), el host de Elasticsearch (<code>ES_HOST</code>) y la clave API de Elasticsearch (<code>ES_API_KEY</code>) a los secretos de acción de GitHub:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb5a0fcfff9b7f997/6a17ef9a6df731d7d40a0fdf/e1075bc54151b4b94eac2a6bd2682e9997e6c709-1106x707.png" alt="Una página de configuración de &quot;acciones, secretos y variables&quot;, que muestra secretos del repositorio como VM_HOST, VM_KEY y VM_USER dentro de una interfaz sitio web." /><p>De este modo, la acción podrá acceder a nuestro servidor para copiar los archivos nuevos y ejecutar el rastreo.</p><p>Ahora, creemos nuestro archivo <code>.github/workflows/deploy.yml</code> :</p>name: Deploy

on:
  push:
    branches: [main]

jobs:
  Deploy:
    name: Deploy to EC2
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v5

      - name: Deploy crawler
        env:
          HOSTNAME: ${{ secrets.VM_HOST }}
          USER_NAME: ${{ secrets.VM_USER }}
          PRIVATE_KEY: ${{ secrets.VM_KEY }}
          ES_HOST: ${{ secrets.ES_HOST }}
          ES_API_KEY: ${{ secrets.ES_API_KEY }}
        run: |
          # Save private key
          echo "$PRIVATE_KEY" &gt; private_key
          chmod 600 private_key

          # Generate final config locally
          envsubst &lt; config/crawler-config.yml &gt; config/crawl-config-final.yml

          # Copy the config folder to VM
          scp -o StrictHostKeyChecking=no -i private_key -r config ${USER_NAME}@${HOSTNAME}:~/config

          # SSH into VM and run crawler
          ssh -o StrictHostKeyChecking=no -i private_key ${USER_NAME}@${HOSTNAME} &lt;&lt; EOF
            docker run --rm \
              -v ~/config:/config \
              docker.elastic.co/integrations/crawler:latest jruby \
              bin/crawler crawl /config/crawl-config-final.yml
          EOF<p>Esta acción ejecutará los siguientes pasos cada vez que empujemos cambios en el archivo de configuración del rastreador:</p><ol><li><p>Llenar el host y la clave API de Elasticsearch en la configuración de yml</p></li><li><p>Copia la carpeta config a nuestra máquina virtual</p></li><li><p>Conéctate vía SSH a nuestra máquina virtual</p></li><li><p>Ejecuta el rastreo con la configuración que acabamos de copiar del repositorio</p></li></ol><h2>Pruebas locales</h2><p>Para probar nuestro rastreador localmente, creamos un script bash que llena el host de Elasticsearch con el local de Docker y comienza un rastreo. Puedes ejecutar <code>./local.sh</code> para ejecutarlo.</p>#!/bin/bash

# Exit on any error
set -e

# Load environment variables
export ES_HOST="http://es01:9200"

# Generate final crawler config
envsubst &lt; ./config/crawler-config.yml &gt; ./config/crawl-config-final.yml

# Bring everything up
docker compose up --build<p>Veamos Kibana DevTools para confirmar que el<code> web-crawler-index</code> se rellenó correctamente:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt989660368fe14db8/6a17ef9b9da390c79ce46562/18551635e8265866e389a9632c4e4540958e4468-990x723.png" alt="Kibana DevTools para confirmar que el índice del rastreador sitio web está configurado correctamente." /><h2>Desplegando a la producción</h2><p>Ahora estamos listos para enviar a la rama principal, que desplegará el rastreador en tu máquina virtual y comenzará a enviar registros a tu instancia Serverless Elasticsearch.</p>git add .
git commit -m "First commit"
git push<p>Esto activará la Acción de GitHub, que ejecutará el script de despliegue dentro de la máquina virtual y comenzará a rastrear.</p><p>Puedes confirmar que la acción se ejecutó yendo al repositorio de GitHub y visitando la pestaña "Acciones":</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt986f1a4e4f3288d2/6a17ef9c7f6f1584fdc09c10/67ba3a7164d7a8049fe5661264820826cb18ed64-667x325.png" alt="Las acciones se despliegan en la pestaña EC2 de un repositorio de GitHub." /><h2>Realización de cambios y re-despliegue</h2><p>Algo que quizá notaste es que el <code>price</code> de cada producto forma parte del cuerpo del documento. Lo ideal sería almacenar el precio en un campo aparte para poder aplicar filtros sobre él.</p><p>Vamos a agregar este cambio al archivo <code>crawler.yml</code> para usar <a href="https://github.com/elastic/crawler/blob/main/docs/features/EXTRACTION_RULES.md">reglas de extracción</a> que extraigan el precio de la clase CSS de <code>product-price</code> :</p>output_sink: elasticsearch
output_index: web-crawl-index
max_crawl_depth: 1

elasticsearch:
  host: ${ES_HOST}
  api_key: ${ES_API_KEY}
     
  # Index ingest pipeline to process documents before indexing          
  pipeline_enabled: true
  pipeline: pricing-pipeline

domains:
  - url: https://web-scraping.dev
    seed_urls:
      - https://web-scraping.dev/product/1
      - https://web-scraping.dev/product/2
      - https://web-scraping.dev/product/3
    extraction_rulesets:
      - url_filters:
          - type: ends
            pattern: /product/*
        rules:
          - action: extract
            field_name: price
            selector: .product-price
            join_as: string
            source: html<p>También vemos que el precio incluye un signo de dólar (<code>$</code>), que debemos eliminar si queremos hacer consultas por rango. Podemos usar una canalización de ingesta para eso. Ten en cuenta que lo estamos haciendo referencia en nuestro nuevo archivo de configuración del rastreador arriba:</p>PUT _ingest/pipeline/pricing-pipeline
{
  "processors": [
    {
      "script": {
        "source": """
                ctx['price'] = ctx['price'].replace("$","")
            """
      }
    }
  ]
}<p>Podemos ejecutar ese comando en nuestro clúster de Elasticsearch en producción. Para el desarrollo, al ser efímero, podemos hacer que la creación de pipeline forme parte del archivo <code>docker-compose.yml</code> agregando el siguiente servicio. Ten en cuenta que también agregamos un <code>depends_on</code> al servicio de rastreo para que empiece después de que la tubería se creó con éxito.</p> crawler:
    image: docker.elastic.co/integrations/crawler:0.4.2
    environment:
      - ES_HOST=http://es01:9200
      - CRAWLER_JRUBY_OPTS=--server
    container_name: crawler
    volumes:
      - ./config:/home/app/config
    networks: [esnet]
    entrypoint: ["/home/app/bin/crawler", "crawl", "/home/app/config/crawl-config-final.yml"]
    depends_on:
      pipeline-init:
        condition: service_completed_successfully
    stdin_open: true
    tty: true  


  pipeline-init:
    image: curlimages/curl:latest
    depends_on:
      es01:
        condition: service_healthy
    networks: [esnet]
    entrypoint: &gt;
        sh -c "
        echo 'Creating ingest pipeline...';
        curl -s -X PUT http://es01:9200/_ingest/pipeline/pricing-pipeline \\
          -H 'Content-Type: application/json' \\
          -d '{\"processors\":[{\"script\":{\"source\":\"ctx.price = ctx.price.replace(\\\"$\\\", \\\"\\\")\"}}]}';
        echo 'Pipeline created!';
        "<p>Ahora vamos a ejecutar <code>`./local.sh`</code> para ver el cambio localmente:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0f390aedf67cb4fe/6a17ef9eaf47b62bd2cde05b/dc1801599344a9f69f072b07ff828c4ba3815d7b-738x473.png" alt="Estoy usando './local.sh' para ver el cambio de precio localmente." /><p>¡Bien! Ahora impulsemos el cambio:</p>git add crawler-config.yml
git commit -m "added price CSS selector"
git push<p>Para confirmar que todo funciona, puedes comprobar tu Kibana de producción, que debería reflejar los cambios y mostrar el precio como un nuevo campo sin el signo del dólar.</p><h2>Conclusión</h2><p>El Elastic Open Sitio web Crawler te permite gestionar tu rastreador como código, lo que significa que puedes automatizar toda la pipeline —desde el desarrollo hasta el despliegue— y agregar entornos locales efímeros y pruebas programáticas contra los datos rastreados, por nombrar algunos ejemplos.</p><p>Se te invita a clonar el repositorio oficial y empezar a indexar tus propios datos usando este flujo de trabajo. También puedes leer <a href="https://www.elastic.co/search-labs/blog/semantic-search-open-crawler">este artículo</a> para aprender a realizar búsqueda semántica en índices producidos por el rastreador.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elastic-open-crawler-config-as-code</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elastic-open-crawler-config-as-code</guid>
    <category><![CDATA[Datos de índice]]></category>
    <category><![CDATA[Operaciones]]></category>
    <dc:creator><![CDATA[Gustavo Llermaly]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt00e7c95012dc38cc/6a17efa0fbc5f80dad491b93/0ac41f55c85ad3f647cb0e0d750ed80bacd397f3-1036x581.png" length="0" type="image/png"/>
    <pubDate>Mon, 22 Sep 2025 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>