<?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[Mapeos - 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[Mapeos - 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/mappings</link>
    </image>
    <link>https://www.elastic.co/es/search-labs/blog/category/mappings</link>
    <atom:link href="https://www.elastic.co/es/search-labs/rss/category/mappings.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[es]]></language>
    <lastBuildDate>Mon, 28 Sep 2026 15:07:27 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Elasticsearch ES|QL lleva la búsqueda de texto completo a datos que nunca indexaste]]></title>
    <description><![CDATA[MATCH y TO_TEXT llevan la búsqueda de texto completo a datos que nunca indexaste. Busca columnas calculadas, campos no mapeados y fuentes federadas en ES|QL.]]></description>
    <content:encoded><![CDATA[<p>ES|QL MATCH ahora ejecuta una búsqueda de texto completo en datos que nunca indexaste. Columnas calculadas, campos no mapeados, textos ensamblados sobre la marcha, incluso datos federados ubicados en S3. La nueva función TO_TEXT le indica a ES|QL que trate cualquier cadena como texto analizable, por lo que MATCH puede tokenizar, normalizar mayúsculas y minúsculas y hacer coincidir términos que existen solo durante el ciclo de vida de una búsqueda. Esto va más allá de la coincidencia de patrones LIKE y RLIKE que la mayoría de los motores de búsqueda ofrecen para textos no indexados: es análisis real. Disponible ahora en Elastic Cloud Serverless y como vista previa técnica en Elasticsearch 9.5.</p><h2>Cómo MATCH y TO_TEXT habilitan la búsqueda de texto completo en cualquier expresión ES|QL</h2><p>Empecemos con una búsqueda que era imposible en Elasticsearch 9.4, que usa <a href="https://www.elastic.co/docs/reference/query-languages/esql/commands/eval">el comando EVAL</a>:</p><p>En este ejemplo, no tiene una configuración de mapeo ni de analizador. Tampoco está asociado con ningún índice invertido. Solo existe durante la vida útil de esta búsqueda, pero ahora puedes realizar una búsqueda de todos modos. Dos adiciones hacen que esto funcione.</p><p>Primero, <a href="https://www.elastic.co/docs/reference/query-languages/esql/functions-operators/search-functions/match">MATCH</a> ahora acepta cualquier expresión como su primer argumento, no solo un campo mapeado. Eso incluye las columnas producidas por EVAL y los resultados de funciones utilizados en línea. También incluye campos no mapeados cargados directamente desde el documento original. Además, todos los tipos de datos normalmente aceptados por MATCH son compatibles en este nuevo caso de uso.</p><p>La segunda parte de esto es la nueva función <a href="https://www.elastic.co/docs/reference/query-languages/esql/functions-operators/type-conversion-functions/to_text">TO_TEXT</a>, que es la primera función de conversión ES|QL que produce la salida de tipo texto. Hasta ahora, las columnas de texto solo podían provenir de campos indexados y mapeados, y todos los textos producidos por las expresiones ES|QL eran valores de palabras clave en lugar de texto. La distinción es importante porque MATCH trata ambos de forma diferente: se analizan los valores de texto, mientras que los valores de palabras clave se comparan exactamente, reflejando cómo una búsqueda MATCH en un campo de palabra clave indexado se reescribe en una búsqueda de término. TO_TEXT(x) es la forma de indicarle a ES|QL: <em>trata esta cadena como texto completo</em>.</p><p>Esto se envía como una vista previa técnica en Elasticsearch 9.5 y, como tal, tiene algunas limitaciones:</p><ul><li><p>Actualmente solo está filtrando. Una coincidencia en una expresión aún no contribuye a la puntuación de relevancia; solo las coincidencias en los campos indexados afectan la puntuación.</p></li><li><p>Las opciones de búsqueda, como la imprecisión y otras, aún no son compatibles al hacer coincidir una expresión.</p></li><li><p>El texto en tiempo de ejecución se analiza con el analizador estándar. Esto aún no es configurable.</p></li></ul><p>Se está trabajando para solucionar estas limitaciones.</p><h2>¿Por qué usar la búsqueda de texto completo en lugar de LIKE o RLIKE en ES|QL?</h2><p>ES|QL ya tenía dos formas de búsqueda de textos sin índice: LIKE (patrones comodines) y RLIKE (expresiones regulares). Ambos funcionan en cualquier expresión de texto, así que es justo preguntar qué agrega MATCH. La respuesta es <a href="https://www.elastic.co/docs/manage-data/data-store/text-analysis">el análisis</a>, una forma más avanzada de búsqueda que emplea técnicas como el stemming y los sinónimos. También usa la eliminación de palabras vacías.</p><p>LIKE es una simple coincidencia de subcadenas, sin ninguna comprensión de las palabras que componen un texto. Digamos, por ejemplo, que estás buscando mensajes de log sobre un oso:</p><p>Esto no detecta “Oso avistado cerca del gallinero” por la mayúscula, mientras que sí coincide con “Un resultado fabuloso para la competencia”, que no tiene nada que ver con un oso. Falla en ambas direcciones: hay falsos negativos por la mayúscula y falsos positivos por subcadenas escondidas dentro de otras palabras.</p><p>Las expresiones regulares pueden solucionar el problema de las mayúsculas y minúsculas, pero el problema de los límites de las palabras se complica rápidamente. Algo como:</p><p>Y ni siquiera así queda bien. No detecta un oso al final de una oración seguido de ¡ o ¿, y no dice nada sobre tabulaciones, comillas o paréntesis. Cada arreglo hace que el patrón sea más largo, y la próxima persona que lea la búsqueda tiene que hacer ingeniería inversa para entender qué es lo que realmente hace.</p><p>MATCH hace que el problema desaparezca, porque ejecuta tanto la búsqueda como el valor a través de un <a href="https://www.elastic.co/docs/reference/text-analysis/analyzer-reference">analizador</a>, que tokeniza el texto en términos en minúsculas y luego compara término con término:</p><p>Esta búsqueda coincidirá con valores como “El rápido oso pardo” y “OSO avistado cerca del gallinero”, pero no con “Un resultado hermoso para la competencia” ni “Protocolo OSOBUCO habilitado”, sin importar la puntuación que rodee a las palabras. Por supuesto, todo esto también funciona con búsquedas de varios términos, como MATCH(TO_TEXT(message), “oso pardo”), tal como uno esperaría.</p><p>Se está trabajando para habilitar el uso de los <a href="https://www.elastic.co/docs/reference/text-analysis/analysis-lang-analyzer">36 analizadores de lenguaje</a>, con soporte para lenguajes naturales en datos que nunca fueron indexados ni mapeados.</p><h2>Casos de uso de búsqueda de texto completo para datos no indexados y no mapeados</h2><p>Los ejemplos anteriores buscaron valores calculados a <a href="https://www.elastic.co/docs/manage-data/data-store/mapping">partir de campos mapeados</a>. Los casos de uso más interesantes para ES|QL MATCH en expresiones involucran datos que nunca se pudieron buscar en absoluto. Vamos a repasar algunos.</p><h3>Cómo buscar campos sin mapeo en ES|QL sin agregar un mapeo</h3><p>A veces dejas deliberadamente un campo fuera de tus mapeos, como un rastreo de pila verboso o una carga útil de solicitud sin procesar. Incluso podrías omitir un bloque de depurar. Indexar uno de estos campos costaría espacio en disco y memoria heap en cada documento, y no valdría la pena para un campo que quizás consultes una vez al trimestre.</p><p>Esa decisión siempre ha sido definitiva, porque los <a href="https://www.elastic.co/search-labs/blog/esql-unmapped-fields">campos no mapeados</a> eran invisibles para las búsquedas por completo. En Elasticsearch 9.5, puedes usar SET unmapped_fields="load" para hacer que ES|QL cargue campos no mapeados directamente desde el documento de origen como palabras clave. Sigue envolviéndolo en TO_TEXT, y ahora puedes ejecutar una búsqueda de texto completo en él:</p><p>Aquí, stack_trace nunca se mapeó. Cada valor se obtiene de los documentos originales y se analiza sobre la marcha. Están emparejados fila por fila. Eso es un trabajo real, y nunca será tan rápido como una búsqueda de <a href="https://www.elastic.co/docs/manage-data/data-store/index-basics">índice invertido</a>. Pero ahora, ese campo que no indexaste ya no es inbuscable. Puedes mantener el mapeo pequeño para el caso cotidiano y seguir respondiendo a la pregunta de una vez por trimestre cuando importa.</p><h3>Búsqueda de texto completo en un campo de palabras clave sin reindexar</h3><p>Los campos de palabras clave pueden hacer mucho. Dan coincidencias exactas, agregaciones rápidas y clasificación, razón por la cual tantos campos terminan mapeados de esa manera. Pero los mapeos se deciden cuando llegan los datos, y es fácil terminar en una situación en la que quieres hacer algo diferente con tus datos de lo que originalmente pretendías. Quizás product_name se mapeó como palabra clave porque los paneles de control agregan datos en función de ella, y luego de recibir datos de productos de un año, alguien quiere poder buscar dentro de los valores de product_name.</p><p>La respuesta antigua era cambiar el mapeo a texto (o agregar campos múltiples) y reindexar todo. Esto puede llevar mucho tiempo y ser costoso, y en muchos casos, los usuarios simplemente no querrán molestarse con ello. La nueva respuesta es una llamada a una función:</p><p>TO_TEXT convierte los valores de las palabras clave en texto sobre la marcha, así que MATCH los analiza en vez de compararlos exactamente. Esto te permite consultar un campo de palabra clave sin crear un mapeo o reindexar el documento de origen. Si la búsqueda se convierte en una búsqueda cotidiana, indexar el campo como texto sigue siendo el movimiento correcto a largo plazo, pero TO_TEXT te da una respuesta hoy, sin ningún trabajo adicional.</p><h3>Buscar el mismo campo en los índices con diferentes mapeos</h3><p><a href="https://www.elastic.co/docs/reference/query-languages/esql/esql-multi-index">ES|QL puede abarcar muchos índices</a>, y el mismo campo no tiene por qué verse siempre igual en todos. Cuando el mismo campo tiene diferentes tipos en distintos índices, ES|QL lo trata como un tipo de unión, y una función de conversión resuelve el conflicto. Consideremos un ejemplo en el que el campo message tiene tipo texto en la plantilla de índice de este año, pero era tipo palabra clave en la del año pasado:</p><p>Cada valor se analiza en el momento de la búsqueda, ya sea que provenga del índice de texto o del de la palabra clave. Los valores de palabra clave de los índices más antiguos se tokenizan y convierten a minúsculas como todo lo demás, así que “connection reset” encuentra “Connection RESET by peer”, sin importar en qué índice se encuentre.</p><p>Otro caso interesante es cuando un campo está mapeado en un solo índice pero también presente (y no mapeado) en el otro:</p><p>Hay un matiz que vale la pena destacar aquí. Si error_details está mapeado en logs-2026 pero no en logs-2025, Elasticsearch no puede enviar esta búsqueda a <a href="https://lucene.apache.org/">Lucene</a>, porque los índices donde el campo no está mapeado no devolverían coincidencias silenciosamente. En cambio, el planificador se da cuenta de que el campo está potencialmente no mapeado y evalúa todo MATCH fila por fila, de donde provengan las filas. No es necesario que sepas en cuál de tus índices está mapeado el campo; la búsqueda simplemente responde a la pregunta.</p><h2>Cómo ES|QL analiza el texto en tiempo de búsqueda sin un índice invertido</h2><p>Cuando ES|QL planifica un MATCH contra una expresión, analiza el texto de búsqueda una vez, de antemano, en un conjunto de términos. La forma en que se evalúa cada fila depende del tipo de expresión:</p><p><strong>Tipo de expresión</strong></p><p><strong>Procesamiento</strong></p><p><strong>Comportamiento de coincidencia</strong></p><p>texto (mediante TO_TEXT)</p><p>El analizador tokeniza el valor en términos en minúsculas</p><p>Comparación token-contra-token; una fila coincide si cualquier token es igual a cualquier término de búsqueda (O semántica)</p><p>palabra clave, ip, fecha, numérico</p><p>Sin análisis; constante de búsqueda convertida una vez al tipo nativo</p><p>Comparación exacta por fila</p><p>Ambas rutas eluden Lucene por completo y evalúan los valores fila por fila. La ruta no textual refleja exactamente lo que hace una búsqueda de coincidencia cuando se delega a Lucene contra esos tipos de campo, por lo que la semántica sigue siendo consistente independientemente de si la búsqueda llega a un índice.</p><p>Una búsqueda de índice invertido hace su trabajo en el momento de la ingesta, y nunca procesa documentos que no coinciden en el momento de la búsqueda. Un MATCH en tiempo de ejecución realiza ese análisis en el momento de la búsqueda, por cada fila que llega a él. Uno es rápido porque el trabajo ya ocurrió; el otro es flexible porque los datos no necesitan haber sido indexados en absoluto.</p><h2>¿Qué novedades hay para la búsqueda de texto completo en ES|QL?</h2><p>Todo lo que se menciona en esta publicación es la primera entrega de un esfuerzo mayor para lograr que la búsqueda en ES|QL funcione con cualquier tipo de contenido, no solo con lo que se indexó previamente. Las limitaciones señaladas anteriormente se abordan de forma activa, y la roadmap va más allá:</p><ul><li><p><strong>Puntuación.</strong> Las coincidencias en tiempo de ejecución contribuirán a _score, por lo que puedes ordenar por relevancia incluso cuando los datos nunca se indexaron.</p></li><li><p><strong>MATCH_PHRASE</strong><strong> en las expresiones.</strong> Ya disponible en Elastic Cloud Serverless, y llegará a Elastic Stack en la versión 9.6.</p></li><li><p><strong>Analizadores configurables.</strong> Compatibilidad del analizador con MATCH y MATCH_PHRASE en expresiones, lo que permite el uso de analizadores de lenguaje, derivación y sinónimos en el momento de la búsqueda.</p></li><li><p><strong>Opciones de coincidencia.</strong> Opciones como la coincidencia inexacta y el operador para coincidencias en tiempo de ejecución.</p></li><li><p><strong>Búsqueda vectorial.</strong> Generar incrustaciones por fila y ejecutar kNN (vecinos más cercanos) en expresiones dense_vector en tiempo de ejecución, llevando también la búsqueda semántica a datos no indexados.</p></li></ul><h2>Prueba la búsqueda de texto completo ES|QL en expresiones hoy</h2><p>Puedes probar la búsqueda en tiempo de ejecución hoy mismo. Ya está disponible en Elastic Cloud Serverless, donde las nuevas capacidades de ES|QL llegan primero y se lanza como vista previa técnica en Elasticsearch 9.5. Comienza con la referencia de <a href="https://www.elastic.co/docs/reference/query-languages/esql/functions-operators/search-functions">funciones de búsqueda</a> y consulta la página de <a href="https://www.elastic.co/docs/reference/query-languages/esql/limitations">limitaciones de ES|QL</a> para conocer los límites actuales. Es una vista previa técnica porque queremos tus comentarios: si realizas una búsqueda de algo que nunca fue indexado y te sorprende, ya sea positiva o negativamente, <a href="https://www.elastic.co/es/community">nos encantaría saberlo</a>.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/full-text-search-unindexed-data</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/full-text-search-unindexed-data</guid>
    <category><![CDATA[ES|QL]]></category>
    <category><![CDATA[Mapeos]]></category>
    <dc:creator><![CDATA[Kevin Corcoran,Ioana Tagirta]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9a74e633d05585a8/6a730774b8c2e64c3ebe0fd4/image1.jpg" length="0" type="image/jpeg"/>
    <pubDate>Wed, 05 Aug 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Cómo mostrar los campos de un índice de Elasticsearch]]></title>
    <description><![CDATA[Aprende a mostrar campos de un índice de Elasticsearch usando las APIs _mapping y _search, subcampos, _source sintéticos y campos de ejecución.]]></description>
    <content:encoded><![CDATA[<p>En este artículo, hablaremos de cómo mostrar los campos de un índice de Elasticsearch. Esto puede ser útil para entender la estructura de tus datos, identificar campos específicos y solucionar problemas. Vamos a tratar los siguientes temas:</p><ol><li><p>Uso de la API <code>_mapping</code> para recuperar información de campos</p></li><li><p>Uso de la API <code>_search</code> para mostrar los valores de los campos</p></li><li><p>Visualización de subcampos</p></li><li><p>_source sintética</p></li><li><p>Campos de tiempo de ejecución</p></li></ol><h2>1. Uso de la API _mapping para recuperar información de campo</h2><p>La API <code>_mapping</code> permite recuperar la definición de mapeo para un índice o varios índices. Esto incluye información sobre los campos, sus tipos de datos y otras propiedades. Para recuperar el mapeo de un índice específico, emplee la siguiente petición:</p>GET /&lt;index_name&gt;/_mapping<p>Por ejemplo, si tienes un índice llamado <code>my_index</code>, puedes recuperar su mapeo con la siguiente petición:</p>GET /my_index/_mapping<p>La respuesta incluirá la definición de mapeo para el índice, que contiene información sobre los campos y sus propiedades.</p><p>También es posible recuperar el mapeo de un campo específico. Esto puede ser útil si tu mapeo es bastante grande y solo quieres centrarte en un campo específico. Para recuperar el mapeo de un campo específico, emplee la siguiente petición:</p>GET /my_index/_mapping/field/my_field<p>También puedes recuperar las asignaciones de varios campos separando sus nombres con comas, como en la siguiente petición:</p>GET /my_index/_mapping/field/my_field_1,my_field_2,my_field_3<h2>2. Uso de la API _search para mostrar los valores de los campos</h2><p>Para mostrar los valores de los campos en un índice de Elasticsearch, puedes usar la API <code>_search</code> . La API <code>_search</code> te ofrece múltiples formas de controlar qué campos se devuelven; Los dos principales son:</p><ol><li><p><strong><code>_source</code></strong>: El campo <a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/mapping-source-field"><code>_source</code></a> contiene el cuerpo original del documento JSON exactamente como estaba indexado, incluyendo cualquier cambio realizado por las canalizaciones de ingestión o pasos de preprocesamiento. Para mostrar campos específicos del documento fuente, implementa filtrado de fuentes como veremos a continuación.</p></li><li><p><strong><code>fields</code></strong>: El parámetro <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/retrieve-selected-fields"><code>fields</code></a> te permite recuperar campos específicos de tus documentos al realizar una búsqueda, basándote en el mapeo de índice. A diferencia de <code>_source</code>, <code>fields</code> también puede devolver valores de campos almacenados, valores de documentación o campos de ejecución sin referenciar la <code>_source</code>, aunque para campos estándar sin valores de documento ni configuraciones almacenadas, vuelve a <code>_source</code>. Esto puede aportar muchos beneficios como el rendimiento y más, como veremos a continuación.</p></li></ol><h3>Uso del campo _source</h3><p>Por defecto, la API<code> _search</code> devuelve el campo <code>_source</code> , que contiene el documento JSON original que se indexó. Para mostrar campos específicos, puedes agregar filtros en el parámetro <code>_source </code>de la solicitud de búsqueda; Esto se llama filtrado de fuente.</p><p>Aquí tienes un ejemplo de una solicitud de búsqueda que devuelve los valores de los campos <code>title </code>y <code>author</code> para documentos en el índice <code>my_index</code> :</p>GET /my_index/_search
{
  "query": {
    "match_all": {}
  },
  "_source": ["title", "author"]
}<p>En este ejemplo, el parámetro <code>_source</code> especifica los campos que se deben devolver.</p><p>Si necesitas aún más control, puedes usar las propiedades de <code>includes</code> y <code>excludes </code>del objeto <code>_source</code>. Por ejemplo, la consulta siguiente devuelve el campo <code>title</code> de nivel superior y todos los subcampos de <code>author</code> excepto <code>author.description</code>.</p>GET /my_index/_search
{
  "query": {
    "match_all": {}
  },
  "_source": {
     “includes”: [“title”, “author.*],
     “excludes”: [“author.description”]
  }
}<p>En este ejemplo, usamos el patrón <code>author.* </code>para recuperar todos los subcampos directos del objeto <code>author </code>. Luego excluimos explícitamente <code>author.description </code>para que solo se devuelvan los otros campos de autor. Ten en cuenta que esto no tiene mejoras de rendimiento ya que aún tiene que cargar y analizar el JSON de origen, pero puede reducir el tamaño de la respuesta enviada por la red.</p><h3>Uso del parámetro de campos</h3><p>Puedes usar el parámetro <code>fields</code> para filtrar los campos que aparecen en la respuesta de búsqueda. Emplear <code>fields</code> <code>_source</code> ofrece varios beneficios, entre ellos:</p><ul><li><p><strong>Mejora de rendimiento: </strong><code>fields </code>puede devolver valores directamente desde <a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/mapping-store">campos almacenados</a> o <a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/doc-values">valores de documentos</a> sin tener que cargar toda la <code>_source</code>, haciendo que el tamaño de la carga útil de respuesta sea menor.</p></li><li><p><strong>Salida formateada:</strong> Para campos estándar,<code> fields</code> puede recurrir a <code>_source</code> para obtener los valores, pero revisa el mapeo del índice para formatear correctamente la salida, como las fechas formateadas, haciéndolas consistentes con lo que se usa para agregaciones y ordenación.</p></li><li><p><strong>Acceso a campos de tiempo de ejecución:</strong> <code>fields</code> puede devolver campos de tiempo de ejecución, que no existen en el <code>_source</code>original.</p></li><li><p>Aquí <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/retrieve-selected-fields#search-fields-param">se pueden encontrar</a> más beneficios.</p></li></ul><p>Por ejemplo, para devolver solo los campos <code>title</code> y <code>author</code> en el índice <code>my_index</code> , puedes usar la siguiente solicitud de búsqueda:</p>GET /my_index/_search
{
  "query": {
    "match_all": {}
  },
  "fields": ["title", "author"],
  "_source": false
}<p>En la consulta anterior, ponemos el campo <code>_source </code>en false para no devolver el documento fuente. Esto puede minimizar significativamente el tamaño de la carga útil para la respuesta, pero recuerda que esto solo funciona porque los campos <code>title</code> y <code>author</code> son del tipo <code>keyword </code>campo, que <code>doc_values</code> habilitaron por defecto. Si el campo no tiene <code>doc_values</code> activado y el <code>_source</code> está configurado como falso, Elasticsearch no tendría forma de recuperarlos y se omitiría en la respuesta.</p><p>Es importante señalar que la respuesta <code>fields</code> siempre devuelve un array de valores para cada campo, incluso si solo hay un único valor. Esto se debe a que Elasticsearch no tiene un tipo de array dedicado, y cualquier campo puede tener varios valores. Para más información sobre los arrays en Elasticsearch, haz <a href="http://elastic.co/docs/reference/elasticsearch/mapping-reference/array">clic aquí</a>.</p><h3>Otras formas de recuperar campos</h3><p>Aunque recuperar campos usando <code>_source</code> o <code>fields</code> son los métodos recomendados, existen diferentes métodos disponibles para casos de uso específicos, como:</p><p><strong>Campos de valor de documentos:</strong> Si quieres evitar <code>_source</code> por completo, puedes buscar usando el parámetro <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/retrieve-selected-fields#docvalue-fields"><code>docvalue_fields</code></a>. Los valores de documentación almacenan los mismos valores de campo que <code>_source</code> pero en una estructura de datos en disco, optimizada para ordenar y agregar.</p><p>Como está separado de los valores almacenados con <code>_source</code>, puedes aplicar campos específicos sin cargar toda la <code>_source</code>. Esto es útil si consultas documentos grandes pero solo necesitas unos pocos campos pequeños que soporten valores de documentos. Otro caso de uso para usar <code>docvalue_fields </code>es cuando quieres usar formato personalizado en campos <code>date</code> y <code>numeric</code> , como veremos en el ejemplo más abajo.</p><p>Ten en cuenta que esto solo funciona para campos que activas <code>doc_values</code> o para tipos de campos que lo tienen activado por defecto, como <code>keyword</code>, <code>date</code>, tipos numéricos y <code>boolean</code>, no para <a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/text"><code>text</code></a> o <a href="https://www.elastic.co/docs/reference/elasticsearch/plugins/mapper-annotated-text-usage"><code>annotated_text</code></a>.</p><p>En este ejemplo, usamos el parámetro <code>docvalue_fields</code> para recuperar los campos <code>title</code>, <code>author</code>, y <code>published</code> sin cargar el documento completo de <code>_source</code> :</p>GET /my_index/_search
{
  "query": {
    "match_all": {}
  },
  "docvalue_fields": [
    "title",
    "author",
    {
      "field": "published",
      "format": "epoch_millis"
    }
  ],
  "_source": false
}<p>Cuando se ejecuta esta consulta, Elasticsearch toma los valores directamente de su almacenamiento columnar en disco en lugar de referenciar el <code>_source </code>de cada documento. El campo <code>published</code> se devuelve con el formato <code>epoch_millis</code> en lugar del formato por defecto, gracias al parámetro <code>format</code> proporcionado en la consulta.</p><p><strong>Campos almacenados:</strong> Si marcas explícitamente campos específicos como <a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/mapping-store">almacenados</a> en el mapeo, puedes usar el parámetro <code>stored_fields</code> para filtrar esos campos. Esto es útil si quieres respuestas ligeras solo con esos campos específicos o para campos que almacenaste deliberadamente para recuperarlos después. Se almacena por separado de <code>_source</code>, por lo que este método también es útil para evitar la necesidad de cargar <code>_source</code>.</p><p>Es importante señalar que esta opción está desactivada por defecto y generalmente no se recomienda. Emplea filtrado de fuentes para devolver ciertos subconjuntos del documento fuente original.</p><p>En la consulta de ejemplo a continuación, usamos el parámetro <code>stored_fields</code> para recuperar el campo <code>summary</code> , que tiene la configuración de mapeo de índice "<code>store”: true</code>.</p>GET /my_index/_search
{
  "query": {
    "match_all": {}
  },
  "stored_fields": ["summary"]
}<p>Cuando se ejecuta esta consulta, Elasticsearch busca si este campo está marcado con <code>”store”: true</code>, si no lo encuentra, se saltará el campo por completo.</p><h2>3. Visualización de subcampos</h2><p>Si tu índice contiene subcampos, puedes usar la notación de puntos para especificar el camino de campo en el parámetro <code>fields</code> . Ten en cuenta que los subcampos son diferentes del <a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/nested">tipo de campo anidado</a>. Por ejemplo, si tienes un subcampo llamado <code>address.city</code>, puedes incluirlo en la respuesta de búsqueda así:</p>GET /my_index/_search
{
  "query": {
    "match_all": {}
  },
  "fields": ["title", "author", "address.city"],
  "_source": false
}<p>En este ejemplo, la respuesta de búsqueda incluirá los valores de los campos <code>title</code>, <code>author</code> <code>address.city</code> .</p><h2>4. _source sintético</h2><p>Si quieres mantener la funcionalidad de usar<code> _source</code> pero también ahorrar espacio en disco, tienes la opción de usar <code>_source</code> sintético en tu mapeo de índice. <a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/mapping-source-field#synthetic-source">La_source</a> sintética es una función que permite a Elasticsearch reconstruir el <code>_source</code> a partir de datos existentes como campos almacenados y valores de documentos, incluso cuando <code>_source</code> está desactivado. Esto te permite ahorrar mucho espacio de almacenamiento a cambio de velocidades ligeramente menores en el momento de la consulta, ya que la reconstrucción se realiza sobre la marcha. Activa esta función usando los valores que aparecen a continuación en la configuración de tu índice:</p>PUT idx
{
  "settings": {
    "index": {
      "mapping": {
        "source": {
          "mode": "synthetic"
        }
      }
    }
  }
}<p>Algunos beneficios de usar <code>_source </code>sintéticos incluyen: visualización completa del documento al usar la API <code>_search</code> , filtrado de código fuente y compatibilidad con otras funciones y herramientas como Kibana que esperan <code>_source</code> estén disponibles, todo ello evitando la necesidad de almacenar el documento completo <code>_source</code> .</p><h2>5. Campos de tiempo de ejecución</h2><p><a href="https://www.elastic.co/docs/manage-data/data-store/mapping/runtime-fields">Los campos de ejecución</a> te permiten definir campos guionizados en el momento de la consulta o en tu mapeo de índice bajo un bloque de ejecución. Estos campos nunca se indexan, por lo que agregar un campo en tiempo de ejecución no aumenta el tamaño del índice pero nunca aparecerá en <code>_source</code>. Los campos de ejecución definidos en el mapeo son persistentes y están disponibles para todas las consultas, mientras que los campos de ejecución definidos en el momento de la consulta son temporales y solo están disponibles en esa solicitud de búsqueda.</p><p>El principal beneficio de usar campos de tiempo de ejecución es la posibilidad de agregar campos a documentos luego de haberlos ingerido, simplificando así tus decisiones de mapeo. Los campos de ejecución también son ideales para enriquecer tus documentos con valores que no existen en el documento original pero que se generan mediante un script, como formatear una cadena o calcular un puntaje.</p><p>También cabe destacar que los campos de ejecución pueden perjudicar el rendimiento, ya que será necesario ejecutar un script para cada documento del conjunto de resultados. Para <a href="https://www.elastic.co/docs/manage-data/data-store/mapping/retrieve-runtime-field">recuperar un campo de ejecución</a>, también puedes usar el parámetro <code>fields</code> en la API <code>_search</code> .</p><h2>Conclusión</h2><p>Mostrar campos de un índice de Elasticsearch puede ir desde simplemente recuperar valores usando el mapeo de índice o el <code>_source</code>, hasta métodos más avanzados usando campos <code>fields</code>, <code>docvalue_fields</code>o en tiempo de ejecución para mayor control y eficiencia. Comprender los compromisos entre diferentes métodos es clave para optimizar tus experiencias de búsqueda. Ya sea que estés optimizando cargas útiles, enriqueciendo documentos o empleando <code>_source</code> sintéticos para ahorrar espacio, Elasticsearch te ofrece múltiples herramientas y funciones para encontrar los datos que necesitas, de la manera que necesitas. Estas técnicas pueden ayudarte a entender la estructura de tus datos, identificar campos específicos y solucionar problemas.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-index-show-fields</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-index-show-fields</guid>
    <category><![CDATA[Datos de índice]]></category>
    <category><![CDATA[Mapeos]]></category>
    <dc:creator><![CDATA[JD Armada]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd041e871a8935448/6a17de320b0bedf404dd34ab/23b96aaa1a38b1f4747b4a87695d816f24c0cf70-720x421.jpg" length="0" type="image/jpeg"/>
    <pubDate>Wed, 06 Aug 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Mapear incrustaciones a tipos de campos de Elasticsearch: semantic_text, dense_vector, sparse_vector]]></title>
    <description><![CDATA[Discutir cómo y cuándo usar semantic_text, dense_vector o sparse_vector, y cómo se relacionan con la generación de incrustaciones.]]></description>
    <content:encoded><![CDATA[<p>El uso de incrustaciones para mejorar la relevancia y precisión de la recuperación de información creció significativamente a lo largo de los años. Herramientas como Elasticsearch evolucionaron para soportar este tipo de datos mediante tipos de campos especializados como vectores densos, vectores dispersos y texto semántico. Sin embargo, para lograr buenos resultados, es esencial entender cómo mapear correctamente las incrustaciones a los tipos de campos disponibles de Elasticsearch: <code>semantic_text</code>, <code>dense_vector</code>y <code>sparse_vector</code>.</p><p>En este artículo, discutiremos estos tipos de campos, cuándo usar cada uno y cómo se relacionan con la generación y las estrategias de uso de incrustaciones, tanto durante la indexación como durante la consulta.</p><h2>Tipo vectorial denso</h2><p>El tipo de campo <code>dense_vector</code> en Elasticsearch se emplea para almacenar vectores densos, que son representaciones numéricas de datos como texto, imágenes y audio, donde casi todas las dimensiones son relevantes. Estos vectores se generan empleando modelos de incrustación proporcionados por plataformas como OpenAI, Cohere o Hugging Face, y están diseñados para captar el significado semántico general de los datos, incluso cuando no comparten términos exactos con otros documentos.</p><p>En Elasticsearch, los vectores densos pueden tener hasta 4096 dimensiones dependiendo del modelo empleado. Por ejemplo, el modelo totalmente MiniLM-L6-v2 genera vectores con 384 dimensiones, mientras que el text-embedding-ada-002 de OpenAI produce vectores con 1536 dimensiones.</p><p>El campo <code>dense_vector</code> se adopta comúnmente como el tipo predeterminado para almacenar este tipo de incrustación cuando se necesita mayor control, como usando vectores pregenerados, aplicando funciones de similitud personalizadas o integrando con modelos externos.</p><h3>¿Cuándo y por qué usar dense_vector tipo?</h3><p>Los vectores densos son excelentes para capturar similitudes semánticas entre oraciones, párrafos o documentos completos. Funcionan muy bien cuando el objetivo es comparar el significado general de los textos, aunque no compartan los mismos términos.</p><p>El campo vectorial denso es ideal cuando ya tienes una pipeline externa de generación de embedding usando modelos proporcionados por plataformas como OpenAI, Cohere o Hugging Face y solo quieres almacenar y consultar estos vectores manualmente. Este tipo de campo ofrece alta compatibilidad con modelos de incrustación y total flexibilidad en la generación y consulta, permitiéndote controlar cómo se producen, indexan y emplean los vectores durante la búsqueda.</p><p>Además, soporta diferentes formas de búsqueda semántica, con consultas como k-NN o script_score para casos en los que sea necesario ajustar la lógica de clasificación. Estas posibilidades hacen que el vector denso sea ideal para aplicaciones como RAG (Generación Aumentada por Recuperación), sistemas de recomendación y búsquedas personalizadas basadas en similitudes.</p><p>Por último, el campo te permite personalizar la lógica de relevancia, usando funciones como <code>cosineSimilarity</code>, <code>dotProduct</code> o <code>l2norm</code> para adaptar la clasificación según las necesidades de tu caso de uso. </p><p>Los vectores densos siguen siendo la mejor opción para quienes necesitan flexibilidad, personalización y compatibilidad con casos de uso avanzados como los mencionados anteriormente.</p><h3>¿Cómo usar la consulta para el tipo de vector denso?</h3><p>Las búsquedas en campos definidos como <strong><code>dense_vector</code></strong> emplean la consulta k-vecinos más cercanos. Esta consulta es responsable de encontrar documentos cuyo vector denso está más cercano al vector de consulta. A continuación se muestra un ejemplo de cómo aplicar una consulta k-NN a un campo vectorial denso:</p>{
  "knn": {
    "field": "my_dense_vector",
    "k": 10,
    "num_candidates": 50,
    "query_vector": [/* vector generated by model */]
  }
}<p>Además de la consulta k-NN, si es necesario personalizar el puntaje del documento, también es posible usar la consulta script_score, combinándola con funciones de comparación vectorial como <strong>cosenoSimilitud, Producto PuntoPunto o l2norm</strong> para calcular la relevancia de forma más controlada. Mira el ejemplo:</p>{
"script_score": {
    "query": { "match_all": {} },
    "script": {
      "source": "cosineSimilarity(params.query_vector,
'my_dense_vector') + 1.0",
      "params": {
        "query_vector": [/* vector */]
      }
    }
  }
}<p>Si quieres profundizar más, te recomiendo explorar el artículo <a href="https://www.elastic.co/search-labs/blog/vector-search-set-up-elasticsearch">Cómo configurar la búsqueda vectorial en Elasticsearch.</a></p><p></p><h2>Tipo vectorial disperso</h2><p>El tipo de campo <strong><code>sparse_vector</code></strong> se emplea para almacenar vectores dispersos, que son representaciones numéricas donde la mayoría de los valores son cero y solo unos pocos términos tienen pesos significativos. Este tipo de vector es común en modelos basados en términos como SPLADE o ELSER (Elastic Learned Sparse EncodeR).</p><h3>¿Cuándo y por qué usar tipo vectorial disperso?</h3><p>Los vectores dispersos son ideales cuando se necesita una búsqueda más precisa en términos léxicos, sin sacrificar la inteligencia semántica. Representan el texto como pares token/valor, resaltando solo los términos más relevantes con pesos asociados, lo que proporciona claridad, control y eficiencia.</p><p>Este tipo de campo es especialmente útil cuando se generan vectores basados en términos, como en los modelos ELSER o SPLADE, que asignan diferentes pesos a cada token según su importancia relativa en el texto.</p><p>Para las ocasiones en las que quieres controlar la influencia de palabras específicas en la consulta, los tipos vectoriales dispersos te permiten ajustar manualmente el peso de los términos para optimizar el orden de los resultados.</p><p>Entre los principales beneficios están la transparencia en la búsqueda, ya que es posible entender claramente por qué un documento se consideraba relevante, y la eficiencia de almacenamiento, ya que solo se almacenan los tokens con valor distinto de cero, a diferencia de los vectores densos que almacenan todas las dimensiones.</p><p>Además, los vectores dispersos son el complemento ideal en estrategias de búsqueda híbrida, e incluso pueden combinar con vectores densos para combinar precisión léxica con comprensión semántica.</p><h3>¿Cómo usar la consulta para el tipo de vector disperso?</h3><p>La consulta <strong><code>sparse_vector</code></strong> te permite buscar documentos basándote en un vector de consulta en formato token/valor. Consulta un ejemplo de la consulta a continuación:</p>{
  "query": {
    "sparse_vector": {
      "field": "field_sparse",
      "query_vector": {
        "token1": 0.6,
        "token2": 0.2,
        "token3": 0.9
      }
    }
  }
}<p>Si prefieres usar un modelo capacitado, es posible emplear un punto final de inferencia que transforme automáticamente el texto de consulta en un vector disperso:</p>{
  "query": {
    "sparse_vector": {
      "field": "field_sparse",
      "inference_id": "the inference ID to produce the token/weights",
      "query": "search text"
    }
  }
}<p>Para profundizar en este tema, sugiero leer <a href="https://www.elastic.co/search-labs/blog/sparse-vector-embedding">Understanding sparse vector embeddings with trained ML</a> models.</p><h2>Tipo de texto semántico</h2><p>El tipo de campo <strong><code>semantic_text</code></strong> es la forma más sencilla y directa de usar la búsqueda semántica en Elasticsearch. Gestiona automáticamente la generación de incrustaciones, tanto en tiempo de indexación como en tiempo de consulta, a través de un punto final de inferencia. Esto significa que no tienes que preocuparte por generar o almacenar vectores manualmente.</p><h3>¿Cuándo y por qué usar texto semántico?</h3><p>El campo <code>semantic_text</code> es ideal para quienes quieren empezar con el mínimo esfuerzo técnico y sin tener que manejar vectores manualmente. Este campo automatiza pasos como la generación de incrustaciones y el mapeo de búsqueda vectorial, haciendo que la configuración sea más rápida y cómoda.</p><p>Deberías considerar usar <code>semantic_text</code> cuando valoras la <strong>simplicidad y la abstracción</strong>, ya que <strong>elimina la complejidad de configurar manualmente mapeos, generación de incrustaciones y pipelines de ingestión</strong>. Solo tienes que seleccionar el modelo de inferencia, y Elasticsearch se encarga del resto.</p><p>Los principales beneficios incluyen <strong>la generación automática de incrustaciones,</strong> realizada tanto durante la indexación como durante la consulta, y <strong>el mapeo listo para usar</strong>, que viene preconfigurado para soportar el modelo de inferencia seleccionado.</p><p>Además, el campo <strong>ofrece soporte nativo para la división automática de textos largos (fragmentación de texto),</strong> permitiendo dividir textos grandes en pasajes más pequeños, cada uno con su propia incrustación, lo que mejora la precisión en la búsqueda. Esto aumenta enormemente la productividad, especialmente para equipos que quieren ofrecer valor rápidamente sin tener que lidiar con la ingeniería subyacente de la búsqueda semántica.</p><p>Sin embargo, aunque <code>semantic_text</code> proporciona rapidez y simplicidad, este enfoque tiene algunas limitaciones. Permite el uso de modelos estándar de mercado, siempre que estén disponibles como puntos finales de inferencia en Elasticsearch. Pero <strong>no soporta incrustaciones generadas externamente</strong>, como es posible con el campo <code>dense_vector</code> .</p><p>Si necesitas más control sobre cómo se generan los vectores, quieres usar tus propios embeddings o necesitas combinar varios campos para estrategias avanzadas, los campos <code>dense_vector</code> y <code>sparse_vector</code> ofrecen la flexibilidad necesaria para escenarios más personalizados o específicos de dominio.</p><h3>Cómo usar la consulta para el tipo de texto semántico</h3><p>Antes de <strong><code>semantic_text</code></strong>, era necesario usar una consulta diferente según el tipo de incrustación (densa o dispersa). Se empleaba una consulta <code>sparse_vector</code> para campos dispersos, mientras que <code>dense_vector</code> campos requerían consultas KNN.</p><p>Con el tipo de texto semántico, la búsqueda se realiza usando la <a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-semantic-query">consulta semántica</a>, que genera automáticamente el vector de consulta y lo compara con las incrustaciones de los documentos indexados. El tipo <strong><code>semantic_text</code></strong> permite definir un extremo de inferencia para incrustar la consulta, pero si no se especifica ninguno, se aplicará el mismo punto final que se usa durante la indexación a la consulta.</p>{
  "query": {
    "semantic": {
      "field": "semantic_text_field",
      "query": "search text"
    }
  }
}<p>Para saber más, te sugiero leer el artículo <a href="https://www.elastic.co/search-labs/blog/semantic-search-simplified-semantic-text">Elasticsearch nueva semantic_text mapeo: Simplificando la búsqueda semántica</a>.</p><h2>Conclusión</h2><p>Al elegir cómo mapear incrustaciones en Elasticsearch, es esencial entender cómo quieres generar los vectores y qué nivel de control necesitas sobre ellos. Si buscas simplicidad, el campo de texto semántico permite una búsqueda semántica automática y escalable, lo que lo hace ideal para muchos casos de uso iniciales. Cuando se requiere más control, un rendimiento ajustado o integración con modelos personalizados, los campos vectoriales densos y dispersos proporcionan la flexibilidad necesaria.</p><p>El tipo de campo ideal depende de tu caso de uso, la infraestructura disponible y la madurez de tu pila de aprendizaje automático. Lo más importante es que Elastic ofrece las herramientas para construir sistemas de búsqueda modernos y altamente adaptables.</p><h2>Referencias</h2><ul><li><p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/semantic-text.html">Tipo de campo de texto semántico</a></p></li><li><p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/sparse-vector.html">Tipo de campo vectorial disperso</a></p></li><li><p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/dense-vector.html">Tipo de campo vectorial denso</a></p></li><li><p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-semantic-query.html">Consulta semántica</a></p></li><li><p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-sparse-vector-query.html">Consulta vectorial dispersa</a></p></li><li><p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/knn-search.html">Búsqueda kNN</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/semantic-search-simplified-semantic-text">Mapeado de nuevas semantic_text de Elasticsearch: Simplificación de la búsqueda semántica</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/sparse-vector-embedding">Comprendiendo las incrustaciones de vectores dispersos con modelos de aprendizaje automático capacitados</a></p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/mapping-embeddings-to-elasticsearch-field-types</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/mapping-embeddings-to-elasticsearch-field-types</guid>
    <category><![CDATA[Base de datos vectorial]]></category>
    <category><![CDATA[Mapeos]]></category>
    <dc:creator><![CDATA[Andre Luiz]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt72cd3c2601b22886/6a17083b0c4857259901a9dc/f98fdff837db55b466780c0bae672aa6f6c3a966-1200x628.png" length="0" type="image/png"/>
    <pubDate>Tue, 13 May 2025 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>