<?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[Matthew Adams - 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[Matthew Adams - 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/author/matthew-adams</link>
    </image>
    <link>https://www.elastic.co/es/search-labs/author/matthew-adams</link>
    <atom:link href="https://www.elastic.co/es/search-labs/rss/author/matthew-adams.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[es]]></language>
    <lastBuildDate>Fri, 18 Sep 2026 21:10:22 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Agrupación no supervisada de documentos con Elasticsearch + incrustaciones de Jina]]></title>
    <description><![CDATA[Un enfoque práctico y reproducible para la agrupación no supervisada de documentos con Elasticsearch y embeddings de Jina.]]></description>
    <content:encoded><![CDATA[<p>La búsqueda vectorial empieza con una consulta, pero ¿qué pasa si no tienes una?</p><p>Las organizaciones acumulan grandes colecciones de documentos, como tickets de soporte, presentaciones legales, feeds de noticias y trabajos de investigación, pero para poder hacer las preguntas correctas, primero necesitan entender lo que contienen. Sin etiquetas o datos de entrenamiento, revisar manualmente miles de documentos es poco práctico. La búsqueda tradicional no es útil cuando no sabes qué buscar.</p><p>Esta publicación describe un enfoque nativo de Elasticsearch para la agrupación no supervisada de documentos y el seguimiento temporal de temas que aborda este problema de descubrimiento. Después de leerla, podrás seguir la evolución de distintos temas a lo largo de varios días:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta8c243e0c5773440/6a17093fa6c2b98c86e7968c/100a60a7fb85da8ab3813fd071a82c93f2c3f318-1300x650.png" alt="Cadenas de temas temporales que evolucionan a lo largo de febrero de 2025: cada ruta coloreada es un tema que persiste a lo largo de los días, con un ancho de enlace que muestra la fuerza de superposición de kNN" /><p><strong>Lo que descubrirás:</strong></p><ul><li><p>Por qué <strong>las incrustaciones de agrupación</strong> (y no las incrustaciones de recuperación) son fundamentales para descubrir temas sin una consulta.</p></li><li><p>Cómo la clasificación de centroides con sonda de densidad agrupa documentos por tema usando Elasticsearch k vecinos más cercanos (kNN) y lotes de <code>msearch</code>.</p></li><li><p>¿Cómo puede <a href="https://www.elastic.co/docs/reference/aggregations/search-aggregations-bucket-significanttext-aggregation"><code>significant_text</code></a> autoetiquetar clústeres para que los temas sean legibles sin entrenar un modelo?</p></li><li><p>De qué forma las cadenas temporales de temas conectan los clústeres de datos diarios para mostrar la evolución de los temas día a día.</p></li></ul><p>El pipeline utiliza unos 8500 artículos de febrero de 2025 de BBC News y The Guardian como corpus de prueba. Si bien las noticias son convenientes porque tienen un comportamiento temporal claro, el patrón es aplicable si el descubrimiento de documentos es importante: revisión legal, monitoreo del cumplimiento normativo, síntesis de investigación, triage de atención al cliente.</p><p><strong>Stack:</strong></p><ul><li><p><a href="https://www.elastic.co/search-labs/blog/jina-embeddings-v5-text"><strong>Jina v5</strong></a> <strong>incrustaciones de agrupación:</strong> adaptadores específicos de Low-Rank Adaptation (LoRA) para la agrupación de temas. <a href="https://www.elastic.co/blog/elastic-jina-ai">Jina se unió a Elastic</a>, y sus modelos están disponibles de forma nativa a través del <a href="https://www.elastic.co/docs/explore-analyze/elastic-inference/eis">Elastic Inference Service (EIS)</a>.</p></li><li><p><strong>Elasticsearch:</strong> <a href="https://www.elastic.co/docs/solutions/search/vector/knn">kNN</a> escalable, etiquetado <code>significant_text</code> y almacenamiento de vectores.</p></li><li><p><a href="https://www.elastic.co/search-labs/blog/diskbbq-elasticsearch-introduction"><strong>DiskBBQ:</strong></a> un formato de índice vectorial basado en disco que combina <a href="https://www.elastic.co/docs/reference/elasticsearch/index-settings/bbq">Better Binary Quantization (BBQ)</a> con una partición jerárquica k-medios para la aceleración aproximada de los vecinos más cercanos (ANN). Esta partición de índice es interna a la búsqueda vectorial y separada del algoritmo de agrupación con sonda de densidad utilizado en esta publicación. <code>bbq_disk</code> almacena vectores cuantificados en el disco y mantiene solo los metadatos de partición en el heap, lo que reduce drásticamente los requisitos de recursos en comparación con <code>bbq_hnsw</code>, mientras mantiene un alto nivel de recuperación.</p></li><li><p><strong>Agrupación global + vinculación temporal diaria:</strong> descubrimiento y evolución del tema.</p></li></ul><p><strong>Lo que necesitarás:</strong></p><ul><li><p>Un despliegue de Elasticsearch (Elastic Cloud, Elasticsearch Serverless o Elastic Self-Managed 8.18+/9.0+): <code>bbq_disk</code> requiere la versión 8.18 o posterior. La sección opcional de recuperación diversificada requiere 9.3+ o sin servidor.</p></li><li><p>Una <a href="https://jina.ai/embeddings/">clave de API de Jina</a>: la capa gratuita incluye 10 millones de tokens, lo que cubre la pipeline de agrupación del núcleo (~4.25 millones de tokens). La comparación opcional entre recuperación y agrupación usa una segunda pasada de incrustación.</p></li><li><p>Una <a href="https://bonobo.capi.gutools.co.uk/register/developer">clave API de Guardian</a> (gratis).</p></li></ul><h2>Configuración</h2><p>Instala los paquetes requeridos:</p>pip install elasticsearch pandas numpy plotly umap-learn python-dotenv pydantic-settings datasets requests<p>Opcional (solo si ejecutas los asistentes de raspado desde este repositorio):</p>pip install beautifulsoup4<p>Luego configura las claves API en un archivo <code>.env</code> en la raíz del proyecto:</p>ELASTIC_CLOUD_ID=your-cloud-id        # or ELASTIC_HOST=https://...
ELASTIC_API_KEY=your-api-key
JINA_API_KEY=your-jina-key
GUARDIAN_API_KEY=your-guardian-key<p>Este cuaderno llama a <code>load_dotenv(override=True)</code>, por lo que los valores locales <code>.env</code> tienen prioridad.</p>Connected to Elasticsearch<h2>Parte 1: agrupación de descubrimiento - ¿Por qué agrupar incrustaciones?</h2><p>La mayoría de las búsquedas vectoriales usan <strong>incrustaciones de recuperación</strong> entrenadas para hacer coincidir una <em>consulta</em> con <em>documentos</em> relevantes. Eso es ideal para la búsqueda, pero no para el descubrimiento. Cuando quieras encontrar qué temas existen en un corpus sin ninguna consulta, necesitas incrustaciones que agrupen documentos similares.</p><p>Jina v5 resuelve esto con <strong>adaptadores de Low-Rank Adaptation (LoRA) específicos para cada tarea</strong>. LoRA agrega pequeñas actualizaciones de bajo rango a las capas internas específicas mientras mantiene la mayoría de los pesos del modelo base congelados, por lo que el comportamiento del modelo se desplaza hacia una tarea específica sin repetir el entrenamiento completo. El mismo modelo base produce diferentes incrustaciones según el parámetro <code>task</code>:</p><p>Tarea</p><p>Capacitado para</p><p>Caso de uso</p><p>retrieval.passage</p><p>Coincidencia búsqueda-documento</p><p>Búsqueda, Retrieval-Augmented Generation (RAG)</p><p>agrupación</p><p>Agrupación de temas (optimizada para clústeres estrechos)</p><p>Descubrimiento, categorización</p><p>El adaptador de agrupación está entrenado para hacer que los documentos sobre el mismo tema estén <em>más cerca</em> en el espacio de incrustaciones y que los documentos sobre temas diferentes estén <em>más separados</em>. La comparación visual a continuación muestra la diferencia de forma concreta.</p><h3>Recuperación frente a agrupación: una comparación visual</h3><p>Para ver la diferencia, se incrusta una muestra de documentos con ambos tipos de tareas. La agrupación se realiza en el espacio de incrustación original de 1024 dimensiones; Uniform Manifold Approximation and Projection (UMAP) se usa solo para proyectar esas incrustaciones en 2D para su visualización. UMAP preserva la estructura de vecindad local, por lo cual es útil para comparar la separación entre clústeres.</p><p>A continuación, se muestra la misma muestra de 480 documentos con ambos tipos de tareas y proyectada en 2D con UMAP. Busca grupos de colores más compactos y mejor diferenciados en el panel de agrupación.</p>    Full dataset: 8,495 articles
    Sources: guardian: 5749, bbc: 2746
    Date range: 2025-02-01 to 2025-02-28


    Sample: 480 docs across 8 sections
    section
    Film              60
    World news        60
    Australia news    60
    Opinion           60
    Football          60
    US news           60
    Sport             60
    Business          60


    Clustering embeddings: 480
    Retrieval embeddings:  480


    UMAP projection complete<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4b3733dccad212b6/6a1709407d8d67aaeb70e6a4/9bcf7a744900560c1c6c63a2dc3af2f9bfd33e11-1100x500.png" alt="Comparación de UMAP entre incrustaciones de recuperación y de agrupación" /><p><em>Las incrustaciones de recuperación (izquierda) distribuyen los temas ampliamente; las incrustaciones de agrupación (derecha) producen grupos más ajustados y separados de los mismos documentos.</em></p><p>Las incrustaciones de agrupación producen grupos más compactos y visualmente más distintivos. Las incrustaciones de recuperación distribuyen los temas de manera más uniforme, ideales para la búsqueda (similitud de grano fino); pero para el descubrimiento, los clústeres temáticos compactos son lo que importa.</p><p>Esta es la razón por la que <code>task="clustering"</code> se usa para el resto de este recorrido.</p><h3>Carga de los sets de datos</h3><p>El corpus combina dos fuentes de noticias para febrero de 2025:</p><ul><li><p><strong>BBC News</strong> a través del <a href="https://huggingface.co/datasets/RealTimeData/bbc_news_alltime">set de datos RealTimeData/BBC_News_AllTime HuggingFace</a>.</p></li><li><p><strong>The Guardian</strong> a través de la <a href="https://open-platform.theguardian.com/">API de Guardian Open Platform</a>.</p></li></ul><p>Tener varias fuentes permite validar que la agrupación encuentra <em>temas</em> en lugar de <em>estilo específico de la fuente</em>.</p>    Total articles:  8,495
    
    Source breakdown:
    source
    guardian    5749
    bbc         2746
    
    Date range: 2025-02-01 → 2025-02-28
    Days covered: 28
    
    Sample article:
      Source:  guardian
      Title:   Carbon monoxide poisoning ruled out in death of Gene Hackman and wife, police sa
      Section: Film
      Text:    Authorities have ruled out that Gene Hackman and his wife, Betsy Arakawa, died from carbon monoxide poisoning earlier this week in their home in Santa Fe, New Mexico. The Santa Fe county sheriff, Adan...<h3>Incrustar con la tarea de agrupación</h3><p>La API de Jina v5 se llama con <code>task="clustering"</code> para todos los documentos. Las incrustaciones se almacenan en caché en disco, por lo que las ejecuciones posteriores se saltan la API por completo.</p><p>La llamada a la API es muy sencilla. El parámetro <code>task</code> es la diferencia clave con respecto al uso típico de incrustación:</p>payload = {
    "model": "jina-embeddings-v5-text-small",
    "input": texts,
    "task": "clustering",  # ← This selects the clustering LoRA adapter
}<p>El tiempo que se muestra a continuación refleja un acierto de caché. La primera ejecución contra la API lleva más tiempo, según el tamaño del corpus.</p>    Embeddings ready: 8,495 vectors of dimension 1024
    Time: 0.6s<h3>Indexar un índice único de Elasticsearch</h3><p>Para la agrupación por descubrimiento, el mes completo se destina a un índice (<code>docs-clustering-all</code>). La partición diaria se realiza más tarde para la vinculación temporal de temas.</p><p>El mapeo de índices emplea <a href="https://www.elastic.co/docs/reference/elasticsearch/index-settings/bbq"><code>bbq_disk</code></a> para el campo vectorial:</p>{
  "embedding": {
    "type": "dense_vector",
    "dims": 1024,
    "index": true,
    "similarity": "cosine",
    "index_options": {
      "type": "bbq_disk"        // hierarchical k-means partitioning for ANN index lookup; separate from this post's clustering algorithm
    }
  }
}<p>Un vector float32 de 1024 dimensiones es de 4 KB. <a href="https://www.elastic.co/search-labs/blog/diskbbq-elasticsearch-introduction"><code>bbq_disk</code></a> usa k-medios jerárquicos para particionar vectores en pequeños clústeres, los cuantifica en binario y almacena los vectores de precisión completa en el disco para volver a guardarlos. Solo los metadatos de partición permanecen en el heap, por lo que los requisitos de memoria permanecen bajos incluso para corpus grandes. Para las cargas de trabajo que pueden permitirse más memoria dinámica, <a href="https://www.elastic.co/docs/reference/elasticsearch/index-settings/bbq"><code>bbq_hnsw</code></a> crea un grafo HNSW (Hierarchical Navigable Small World) para agilizar las búsquedas, aunque a costa de un mayor consumo de recursos.</p><p>El tipo de campo <a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/dense-vector"><code>dense_vector</code></a> brinda soporte para múltiples estrategias de cuantización: <code>bbq_disk</code> y <code>bbq_hnsw</code> son las más adecuadas para embeddings de alta dimensión, como los vectores de 1024 dimensiones usados aquí.</p>    Indexed 8,495 documents into docs-clustering-all
    Time: 57.5s<h3>Agrupación: clasificación del centroide sondeada por densidad</h3><p>Los algoritmos de agrupación tradicionales como HDBSCAN asumen que puedes mantener la matriz de vectores N × d completa en memoria y ejecutar actualizaciones de pasada completa repetidas. Para 8495 documentos con 1024 dimensiones, esto es manejable (~35 MB), pero el enfoque no escala a millones de documentos sin infraestructura adicional.</p><p>Este algoritmo es conceptualmente similar a la inicialización de KMedios++ con asignación de Voronoi y un nivel de ruido, pero emplea <a href="https://www.elastic.co/docs/solutions/search/vector/knn">la búsqueda kNN</a> de Elasticsearch como primitiva de cálculo, manteniendo casi todo el trabajo en el servidor:</p><ol><li><p><strong>Muestrea el 5 % de los documentos</strong> como sondas de densidad (muestra aleatoria, mínimo 50).</p></li><li><p><strong>Densidad de sondas vía lotes de</strong> <a href="https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-msearch"><strong><code>msearch</code></strong></a> <strong>kNN</strong>. Cada sonda dispara una búsqueda kNN y registra la similitud media de sus vecinos. Alta similitud media = región densa del espacio de incrustación. <a href="https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-msearch"><code>msearch</code></a> envía múltiples solicitudes de búsqueda en una sola llamada HTTP, lo cual es fundamental en este caso: el sondeo de densidad genera cientos de consultas kNN, y agruparlas evita la sobrecarga por solicitud.</p></li><li><p><strong>Seleccione semillas de alta densidad con diversificación</strong>: los candidatos por encima de la densidad mediana se ordenan por densidad descendente y se aceptan de manera ávida solo cuando su similitud del coseno con cada semilla existente está por debajo de un umbral de separación. Este es el único cómputo del lado del cliente (~0.01s para 8k docs).</p></li><li><p><strong>Clasifica todos los documentos frente a los centroides mediante</strong> <strong><code>msearch</code></strong> <strong>kNN</strong>: cada semilla actúa como un centroide; una búsqueda kNN recupera documentos cercanos por encima de un umbral de similitud. Cada documento se asigna al centroide que lo devolvió con la puntuación más alta. Los clústeres pequeños se disuelven en ruido.</p></li></ol><p>Elasticsearch se encarga del trabajo pesado: <code>msearch</code> para sondas de densidad, <code>msearch</code> para clasificación y <code>significant_text</code> para etiquetado. Para este corpus (8495 documentos), la muestra del 5 % de sondeo de densidad lanza 425 consultas kNN de sondeo, que <code>msearch</code> agrupa en nueve llamadas HTTP (con lotes de 50), lo que evita la sobrecarga de una solicitud por sondeo. Combinado con la búsqueda ANN de <code>bbq_disk</code>, esto mantiene la etapa de agrupación rápida y escalable. Las consultas kNN usan un valor mínimo de <a href="https://www.elastic.co/docs/deploy-manage/production-guidance/optimize-performance/approximate-knn-search"><code>num_candidates</code></a> para mayor velocidad durante la pasada de agrupación; las consultas de búsqueda de producción deben usar valores más altos de <code>num_candidates</code> para mejorar la recuperación a costa de la latencia.</p><p>Los clústeres tienen tamaños naturales determinados por la densidad del espacio de incrustación alrededor de cada centroide, no por un límite rígido de <code>k</code>. Las regiones temáticas densas producen clústeres más grandes; los temas de nicho producen clústeres más pequeños.</p><h4>¿Por qué no KMeans o HDBSCAN?</h4><p>KMedios asume clústeres esféricos y requiere la matriz N×d completa en memoria. Para corpus que caben en memoria, <a href="https://scikit-learn.org/stable/modules/generated/sklearn.cluster.HDBSCAN.html">HDBSCAN</a> es una alternativa estable. Maneja formas arbitrarias de clústeres y tiene una semántica de densidad bien entendida.</p><p>El enfoque de centroides con sondeo de densidad apunta a un nicho diferente: corpus con almacenamiento, recuperación y agrupación en un solo sistema, o en los que la escala hace que las operaciones matriciales del lado del cliente sean poco prácticas. Usa Elasticsearch kNN como primitiva de cómputo, maneja tamaños de clúster arbitrarios y mantiene casi todo el procesamiento del lado del servidor.</p>    Clustered global index in 31.6s
      Total clusters: 82
      Total noise:    2420 (28.5%)
      Density probes: 425 kNN queries via 9 _msearch HTTP calls<h4>Comprender la tasa de ruido</h4><p>La tasa de ruido de ~28 % es intencional, no un modo de falla. Los documentos que no encajan en ningún clúster denso en el <code>similarity_threshold</code> configurado quedan sin asignar en vez de ser forzados a una coincidencia deficiente. Esto actúa como un control de calidad: las columnas de opinión, los artículos cortos y las historias aisladas resisten naturalmente la acción de agrupar porque carecen de la densidad temática que define un grupo coherente.</p><p>El umbral es ajustable: reducir <code>similarity_threshold</code> produce una agrupación más agresiva (más documentos asignados, pero clústeres más dispersos), mientras que aumentarlo ajusta los clústeres e incrementa la fracción de ruido. Para este corpus de contenido de noticias mixtas, ~30 % de ruido es un punto de operación razonable. Los despliegues de producción deben ajustar el umbral según criterios de calidad específicos del dominio.</p><h3>Etiquetas automáticas con significant_text</h3><p>Ahora cada clúster necesita una etiqueta legible para humanos. La agregación <code>significant_text</code> de Elasticsearch encuentra términos que aparecen inusualmente a menudo en un conjunto en primer plano (el clúster) en comparación con un conjunto de fondo (el corpus completo).</p><p>En el fondo, utiliza una heurística estadística (puntuación JLH de forma predeterminada) que equilibra los cambios de frecuencia absoluta y relativa, sin machine learning, sin llamadas a modelos de lenguaje grandes (LLM). Un clúster sobre política del Reino Unido podría mostrar términos como <code>starmer</code>, <code>labour</code>, <code>downing</code> porque esos términos son desproporcionadamente comunes en ese clúster en comparación con el corpus de noticias general.</p><p>Para esta pasada global, las etiquetas se calculan directamente con respecto a <code>docs-clustering-all</code>, por lo que tanto el primer plano como el fondo se extraen del mes completo. En la parte 2, el etiquetado usa el patrón de índice diario (<code>docs-clustering-*</code>), un comodín que permite que las búsquedas abarquen todos los índices coincidentes simultáneamente, para darle a <code>significant_text</code> un fondo más amplio y lograr un mejor contraste.</p><p>Una forma mínima de consulta se ve así:</p>{
  "size": 0,
  "query": { "term": { "cluster_id": "72" } },
  "aggs": {
    "label_terms": {
      "significant_text": {
        "field": "text",
        "size": 5,
        "filter_duplicate_text": true
      }
    }
  }
}<p><code>significant_text</code> también sirve como control de calidad: los clústeres que no producen términos importantes no tienen vocabulario distintivo. Son agrupaciones incoherentes que deberían disolverse de nuevo en ruido en lugar de recibir una etiqueta engañosa.</p><p>Un paso de limpieza determinista y ligero elimina los términos de etiqueta ruidosos (tokens numéricos, palabras genéricas) y recurre a un titular representativo cuando es necesario. Esto mantiene las etiquetas nativas de Elasticsearch y, al mismo tiempo, mejora la legibilidad.</p>    Sample cluster labels:
      cluster   3  (200 docs)  arsenal | mikel | villa
      cluster   1  (198 docs)  volodymyr | ukrainian | kyiv
      cluster   0  (196 docs)  hostages | hamas | israeli
      cluster   4  (187 docs)  scrum | rugby | borthwick
      cluster  52  (185 docs)  fossil | renewable | renewables
      cluster  10  (156 docs)  labour | gwynne | mps
      cluster  40  (151 docs)  novel | novels | literary
      cluster  11  (149 docs)  mewis | sarina | wiegman
      cluster  44  (143 docs)  flooding | rainfall | rain
      cluster  13  (131 docs)  doge | musk | elon
      cluster  12  (128 docs)  murder | insp | knockholt
      cluster   5  (124 docs)  putin | backstop | starmer


    Reassigned 35 docs from incoherent clusters to noise
    Total docs: 8,495
    Clustered:  6,040 (71.1%)
    Noise:      2,455 (28.9%)<h3>Visualizar los clústeres</h3><p>Las visualizaciones a continuación muestran lo que descubrió la pasada global de agrupación: un desglose por fecha de los documentos agrupados frente a los documentos de ruido, una proyección UMAP del mes completo y un gráfico de combinación de fuentes que confirma que los clústeres reflejan temas en lugar de fuentes.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4ed087d8b6dac2a0/6a17094260084b44543c4501/99099f5adaa945ae4097c50b0d7151c7dd28872e-1000x400.png" alt="Distribución diaria de documentos agrupados en clústeres frente a documentos de ruido" /><p>Distribución diaria de documentos agrupados frente a documentos de ruido a lo largo de febrero de 2025.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf5ca320bc91131ab/6a17094366c4f95828f8bfbf/477c6c7177942955a942f85f5c881da50e517915-1100x700.png" alt="Proyección UMAP de todo el mes con todos los documentos" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5f554a6bc2bc367b/6a170945a929cfa7a1ae0947/4f4302556c8974c416842452cf33bca06e90b966-1100x700.png" alt="Proyección UMAP que muestra solo documentos agrupados" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8e40c26f89ce5523/6a17094747d49c147d2d8974/327f96a79e382ef30614cb0570aa7fccd822b8f8-1100x700.png" alt="[Proyección UMAP que resalta un solo clúster" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf1dd2c19ae628f1d/6a1709481949f7a630e7a9a3/acfb1524a10e24d6ff2412e7c3ec0f2b3ac75193-900x600.png" alt="Mezcla de origen por cluster que muestra la agrupación por temas" /><p>Cada isla coloreada en el UMAP representa un clúster: un grupo de artículos sobre el mismo tema descubiertos únicamente a partir de la similitud de incrustación. Los puntos de ruido gris son artículos que no encajaban perfectamente en ningún clúster (a menudo artículos cortos, artículos de opinión o historias únicas).</p><p>El gráfico de desglose de fuentes confirma que los clústeres contienen artículos de <strong>ambas</strong> BBC News y The Guardian. La agrupación está encontrando <em>temas</em>, no <em>fuentes</em>: exactamente lo que el descubrimiento no supervisado debería arrojar.</p><h3>Explorar la amplitud del clúster con el recuperador diversificado</h3><p>El kNN simple devuelve los documentos más similares al centroide de un clúster (el núcleo compacto). Pero los clústeres reales cubren subtemas. El <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/retrievers/diversify-retriever"><strong>recuperador diversificado</strong></a> utiliza Maximal Marginal Relevance (MMR) para mostrar documentos que son relevantes para el centroide pero también <em>diferentes entre sí</em>.</p><p>El parámetro clave es <strong>λ (lambda):</strong></p><ul><li><p>λ = 1.0 → pura relevancia (igual que kNN simple).</p></li><li><p>λ = 0.0 → diversidad pura (resultados de máxima distribución).</p></li><li><p>λ = 0.5 → equilibrado: es relevante para el tema, pero cubre diferentes ángulos.</p></li></ul><p>Una solicitud mínima de recuperador tiene el siguiente aspecto:</p>{
  "size": 8,
  "retriever": {
    "diversify": {
      "type": "mmr",
      "field": "embedding",
      "lambda": 0.5,
      "query_vector": "&lt;cluster-centroid-vector&gt;",
      "retriever": {
        "knn": {
          "field": "embedding",
          "query_vector": "&lt;cluster-centroid-vector&gt;",
          "k": 50,
          "num_candidates": 100
        }
      }
    }
  }
}<p>Los parámetros <code>type</code>, <code>field</code> y <code>query_vector</code> son necesarios a nivel de diversificación: <code>field</code> indica al MMR qué campo dense_vector usar para la similitud entre resultados, y <code>query_vector</code> proporciona el punto de referencia para el puntaje de relevancia.</p><p>Esto te permite responder: “¿Qué abarca realmente este clúster?” en vez de solo “¿Qué hay en su centro?”</p>    Exploring cluster 52 (185 docs)
    Label: fossil | renewable | renewables
    Centroid computed (dim=1024)


    ========================================================================
    Plain kNN (closest to centroid)
    ========================================================================
      1. [0.9738] Green campaigners fear ministers are poised to award billions of pounds in fresh subsidies to Drax power station, despite strong concerns...
      2. [0.9710] Thirteen more oil and gas licences could be cancelled as ministers decide new guidance for fossil fuel extraction after a landmark court...
      3. [0.9699] Experts have accused the fossil fuel industry of seeking special treatment after lobbyists argued greenhouse gas emissions from oilfields...
      4. [0.9681] Burning wood is a terrible way of producing electricity . Chopping down trees destroys habitats for wildlife, and growing new trees cannot...
      5. [0.9649] Keir Starmer will do huge damage to the global fight against climate change if he gives in to political pressure and allows the development...
      6. [0.9641] Labour will next week be confronted with stark policy choices that threaten to expose the fault lines between the Treasury and the...
      7. [0.9638] The Drax power station near Selby in north Yorkshire burns imported wood pellets  The government has agreed a new funding arrangement with...
      8. [0.9581] If you care about the world we are handing on to future generations, the news on Thursday morning was dramatic. This January was the...
    
    ========================================================================
    Diversify retriever (MMR, lambda=0.5)
    ========================================================================
      1. [0.9738] Green campaigners fear ministers are poised to award billions of pounds in fresh subsidies to Drax power station, despite strong concerns...
      2. [0.9434] Oil and gas interests have waged a coordinated campaign to kill pro-electrification policies that ban gas connections in new buildings ,...
      3. [0.9303] It was interesting to read that new licences for oil and gas production in the North Sea are being delayed by legal action ( Thirteen more...
      4. [0.9139] The US energy secretary, Chris Wright, has said he “would love to see Australia get in the game of supplying uranium and maybe going down...
      5. [0.9077] Rachel Reeves was facing criticism on Saturday night as it was confirmed that a report she cited as evidence that a third ­runway at...
      6. [0.8996] When Margaret Thatcher opened the Hadley Centre for Climate Change in 1990 journalists suggested she was attempting to appear to be doing...
      7. [0.8993] The vast majority of governments are likely to miss a looming deadline to file vital plans that will determine whether or not the world has...
      8. [0.8987] European imports of seaborne gas shipments fell by a fifth last year to their lowest level since the pandemic, according to a new report,...
    
    Overlap: 1/8 documents appear in both result sets
    
    Avg pairwise similarity (lower = more diverse):
      Plain kNN:          0.9057
      Diversify retriever: 0.6965<p>Los resultados simples de kNN se agrupan en torno a un ángulo del tema: los documentos más similares al centroide y entre sí. El recuperador diversificado muestra diferentes facetas del mismo clúster: subtemas, fuentes diferentes y perspectivas variadas.</p><p>La métrica de diversidad confirma esto cuantitativamente: la similitud promedio por pares es menor en los resultados del recuperador diversificado, lo que significa que los documentos arrojados tienen mayor alcance.</p><p>Esto es útil para:</p><ul><li><p><strong>Comprender el alcance real de un clúster</strong>: no solo su centro, sino también sus bordes.</p></li><li><p><strong>Generar resúmenes</strong>. Los documentos diversos y representativos le dan a un LLM mejor material.</p></li><li><p><strong>Encontrar ejemplos representativos</strong> para revisión humana o etiquetado posterior.</p></li><li><p><strong>Controles de calidad</strong>. Si los diversos resultados parecen incoherentes, es posible que el clúster deba dividirse.</p></li></ul><h2>Parte 2: cadenas temáticas temporales</h2><h3>Seguimiento de temas con el paso de los días</h3><p>La parte 1 agrupó todo el mes a nivel global para el descubrimiento de temas. Para el flujo temporal, la misma clasificación de centroides con sonda de densidad se ejecuta independientemente por día en los <strong>índices diarios</strong>, y luego los clústeres se vinculan en días adyacentes. Tenga en cuenta que los clústeres diarios son independientes de los clústeres globales de la parte 1; cada día produce sus propias asignaciones y etiquetas de clúster ajustadas al contenido de ese día.</p><h4><strong>El enfoque de enlazado: muestra y consulta</strong></h4><p>Para cada clúster el día A:</p><ol><li><p>Muestra algunos documentos representativos.</p></li><li><p>Ejecuta kNN contra el índice del día B.</p></li><li><p>Cuenta cuántas coincidencias se registran en cada clúster del día B.</p></li><li><p>Si la fracción de aciertos excede un umbral (fracción kNN ≥ 0.4), registra un enlace.</p></li></ol><p>Esto es rápido (solo se consultan unos pocos documentos por clúster, no todos) y usa el kNN nativo de Elasticsearch, sin necesidad de herramientas externas.</p>Preparing daily indices for temporal linkage...


Indexed 8,495 docs into 28 daily indices


Temporal links found: 808 in 145.4s

Strongest links:
  2025.02.01 'league | arsenal | premier' -&gt; 2025.02.02 'league | season | striker'  (100%)
  2025.02.03 'league | striker | loan' -&gt; 2025.02.04 'league | striker | season'  (100%)
  2025.02.03 'score | operator | gedling' -&gt; 2025.02.04 'league | striker | season'  (100%)
  2025.02.12 'playoff | leg | bayern' -&gt; 2025.02.13 'league | players | injury'  (100%)
  2025.02.14 'league | injury | football' -&gt; 2025.02.15 'league | premier | football'  (100%)
  2025.02.18 'russia | ukraine | talks' -&gt; 2025.02.19 'saudi | russia | arabia'  (100%)
  2025.02.18 'football | league | bayern' -&gt; 2025.02.19 'league | manchester | players'  (100%)
  2025.02.21 'league | premier | manchester' -&gt; 2025.02.22 'game | players | defeat'  (100%)
  2025.02.21 'rugby | calcutta | brilliant' -&gt; 2025.02.22 'game | players | defeat'  (100%)
  2025.02.26 'metals | kyiv | ukrainian' -&gt; 2025.02.27 'ukraine | russia | talks'  (100%)<p>Una fracción kNN del 100 % significa que cada documento muestreado del clúster de origen llegó al mismo clúster de destino, el vínculo entre días más fuerte posible. La mayoría de los vínculos anteriores están relacionados con el fútbol, lo que tiene sentido: la cobertura de la Premier League se ejecuta a diario con alta consistencia temática.</p><p>El enlace <code>score | operator | gedling</code> → <code>league | striker | season</code> es un ejemplo de un clúster de fútbol local de nicho (Gedling es un club de liga no profesional) que se integra en el clúster más amplio de la Premier League al día siguiente, una consecuencia natural de la reagrupación diaria a diferentes niveles de granularidad.</p><h3>Construyendo cadenas de historias</h3><p>Una cadena de temas es una secuencia de agrupaciones vinculadas en días consecutivos.</p><p>Los enlaces individuales por pares indican que el clúster "Política del Reino Unido" del lunes se conecta con el del martes. Las cadenas revelan la evolución completa: una historia que comienza el lunes, evoluciona a lo largo de la semana y se desvanece el viernes.</p><p>Las cadenas se construyen de forma voraz a partir de enlaces con una fracción kNN ≥ 0.4, lo que significa que al menos el 40 % de los documentos muestreados del clúster de origen terminaron en un único clúster de destino. Comenzando desde el clúster más antiguo, el algoritmo siempre sigue el enlace saliente más fuerte.
</p>    Strong links (kNN fraction &gt;= 0.4): 244
    Story chains spanning 3+ days: 18
      Chain 1: 'ukrainian | kyiv | eastern' (19 days: Feb 3 → Feb 21)
      Chain 2: 'playing | opposition' (19 days: Feb 10 → Feb 28)
      Chain 3: 'tadhg | maro | cadan' (10 days: Feb 1 → Feb 10)
      Chain 4: 'invade | china | putin' (8 days: Feb 21 → Feb 28)
      Chain 5: 'elected | labour | leader' (7 days: Feb 12 → Feb 18)
      Chain 6: 'film | swift | awards' (6 days: Feb 2 → Feb 7)
      Chain 7: 'amendment | termination | reporting' (6 days: Feb 12 → Feb 17)
      Chain 8: 'officers | scene | police' (5 days: Feb 1 → Feb 5)<p>La cadena más larga rastrea la cobertura Ucrania-Rusia durante 19 días consecutivos, lo cual no es sorprendente dado el sostenido nivel de intensidad geopolítica en febrero de 2025. El segundo más largo sigue al fútbol de la Premier League durante 19 días del mes. Las cadenas más cortas capturan la temporada de premios (cine/premios, seis días), el rugby de las Seis Naciones (10 días) y la cobertura del liderazgo político del Reino Unido (siete días). Cada cadena representa una evolución temática que el algoritmo descubrió puramente a partir de la similitud de incrustaciones a través de índices diarios.</p><h3>Sankey: visualizando el flujo de la historia</h3><p>Un diagrama de Sankey es una visualización de un flujo en la que el grosor de los enlaces indica la intensidad de la conexión. Aquí, cada banda vertical es un día, cada nodo es un clúster diario (dimensionado por el recuento de documentos) y cada ruta de color traza una cadena de temas a lo largo del tiempo. El ancho del enlace codifica la fuerza de superposición de kNN: los enlaces más gruesos significan que más documentos muestreados llegaron al clúster de destino. Los colores son consistentes por cadena, así que una sola ruta de color de izquierda a derecha se lee como la progresión de un tema.</p><p>Por ejemplo, la cadena Ucrania-Rusia (que se ve como una de las rutas más largas) fluye de manera continua desde principios de febrero hasta la tercera semana, con enlaces que se mantienen gruesos, lo que indica una fuerte continuidad temática a lo largo de los días.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta8c243e0c5773440/6a17093fa6c2b98c86e7968c/100a60a7fb85da8ab3813fd071a82c93f2c3f318-1300x650.png" alt="Cadenas temporales de temas que se desarrollan a lo largo de febrero de 2025" /><p><em>Cadenas temporales de temas que se desarrollan a lo largo de febrero de 2025. Cada camino coloreado es un tema que persiste a lo largo de los días; el ancho del enlace indica la fuerza de superposición kNN.</em></p><h2>Qué ofrece este enfoque</h2><p>Esta guía cubrió una pipeline completa de agrupación de documentos sin supervisión desarrollada sobre Elasticsearch:</p><ol><li><p><strong>Agrupar incrustaciones</strong>: los adaptadores específicos de la tarea de Jina v5 producen incrustaciones optimizadas para la agrupación por temas, no solo para la coincidencia entre consulta y documento.</p></li><li><p><strong>Agrupación de descubrimiento global</strong>: agrupar el mes completo en un índice maximiza el descubrimiento de temas entre días.</p></li><li><p><strong>Clasificación de centroides con densidad probada</strong>: muestrea el 5 %, sondea densidad vía <code>msearch</code> kNN, selecciona semillas diversas de alta densidad, clasifica todos los documentos contra los centroides. Elasticsearch maneja el cómputo pesado; solo la selección de semillas se ejecuta del lado del cliente (~0.01 s).</p></li><li><p><a href="https://www.elastic.co/docs/reference/aggregations/search-aggregations-bucket-significanttext-aggregation"><strong><code>significant_text</code></strong></a> <strong>etiquetado</strong>: las pruebas de significancia producen etiquetas de clúster significativas sin ningún modelo de ML o anotación manual. Los clústeres que no producen términos significativos son incoherentes y se degradan a ruido: una barrera de calidad integrada.</p></li><li><p><strong>Vinculación temporal de temas</strong>: los índices diarios y el rastreo de muestras y consultas de kNN entre índices permiten rastrear cómo evolucionan los temas a lo largo del tiempo.</p></li></ol><p><strong>Conclusiones clave:</strong></p><ul><li><p>El tipo de tarea de incrustación es importante: las incrustaciones de agrupación producen grupos temáticos notablemente más compactos.</p></li><li><p>Elasticsearch puede funcionar tanto como capa de almacenamiento <em>como</em> motor de agrupación mediante <a href="https://www.elastic.co/docs/solutions/search/vector/knn">búsqueda kNN</a>.</p></li><li><p>La clasificación de centroides con sonda de densidad mantiene casi todos los datos del lado del servidor y produce clústeres con tamaños naturales determinados por la densidad de espacio de incrustaciones.</p></li><li><p><code>significant_text</code> es rápido, interpretable y efectivo tanto para el etiquetado automático como para el control de calidad.</p></li></ul><p><strong>Este enfoque es útil en los siguientes casos:</strong></p><ul><li><p>Tienes texto con fecha y quieres descubrir un tema sin datos de entrenamiento etiquetados.</p></li><li><p>Deseas una pila para almacenamiento, búsqueda de vectores, etiquetado y vinculación temporal.</p></li></ul><p><strong>Extensiones para explorar:</strong></p><ul><li><p>Agrupación de varios períodos (resúmenes semanales y mensuales).</p></li><li><p>Ingesta en tiempo real con asignación incremental de clúster.</p></li><li><p>Resúmenes de clústeres generados por LLM usando los términos de significant_text como semillas.</p></li><li><p>A mayor escala, los centroides de K-Medios obtenidos mediante muestreo pueden servir como semillas de inicio rápido para la agrupación basada en densidad, lo que reduce el costo de la fase de exploración.</p></li></ul><h2>Pruébalo tú mismo</h2><p>Sustituye el corpus de documentos con marcas de tiempo por el tuyo; cualquier colección de texto con fechas funciona con este pipeline. El cuaderno completo y el código de soporte están disponibles en el <a href="https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/unsupervised-document-clustering-elasticsearch-jina-embeddings">repositorio complementario</a>.</p><ul><li><p><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"><strong>Activa una prueba gratuita de Elastic Cloud</strong></a>: crea un clúster administrado con soporte para <code>bbq_disk</code> en cuestión de minutos.</p></li><li><p><a href="https://www.elastic.co/elasticsearch/serverless"><strong>Prueba Elasticsearch Serverless</strong></a>: sin gestión de clústeres, escala automáticamente y brinda soporte para todo en este tutorial.</p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/unsupervised-document-clustering-elasticsearch-jina-embeddings</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/unsupervised-document-clustering-elasticsearch-jina-embeddings</guid>
    <category><![CDATA[Base de datos vectorial]]></category>
    <category><![CDATA[Investigación en ML]]></category>
    <category><![CDATA[Jina AI]]></category>
    <dc:creator><![CDATA[Matthew Adams]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4bd7dd10a7cd6dc8/6a17094a14b270581de3c5b6/662c00694c3e0c2fb2128098bdb6813df9e86a72-1280x720.png" length="0" type="image/png"/>
    <pubDate>Fri, 10 Apr 2026 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>