<?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[Mapeamentos - 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[Mapeamentos - Elasticsearch Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1121c0bf0e8a6e65/6a88da6340a1841030ef456f/search-labs-thumbnail.png</url>
      <link>https://www.elastic.co/pt/search-labs/blog/category/mappings</link>
    </image>
    <link>https://www.elastic.co/pt/search-labs/blog/category/mappings</link>
    <atom:link href="https://www.elastic.co/pt/search-labs/rss/category/mappings.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[pt]]></language>
    <lastBuildDate>Mon, 28 Sep 2026 15:07:27 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Elasticsearch ES|QL traz busca de texto completo para dados que você nunca indexou]]></title>
    <description><![CDATA[MATCH e TO_TEXT trazem busca de texto completo para dados que você nunca indexou. Buscar colunas computadas, campos não mapeados e fontes federadas em ES|QL.]]></description>
    <content:encoded><![CDATA[<p>ES|QL MATCH agora executa busca de texto completo em dados que você nunca indexou. Colunas computadas, campos não mapeados, strings montadas em tempo real e até dados federados no S3. A nova função TO_TEXT diz ao ES|QL que trate qualquer string como texto analisável, para que MATCH possa tokenizar, normalizar maiúsculas e minúsculas, e fazer correspondência de termos em valores que existem somente durante a vida útil de uma consulta. Isso vai além da correspondência por padrões com LIKE e RLIKE que a maioria dos mecanismos de consulta oferece para strings não indexadas: é análise de verdade. Já disponível no Elastic Cloud Serverless e como prévia técnica no Elasticsearch 9.5.</p><h2>Como o MATCH e TO_TEXT habilitam a busca de texto completo em qualquer expressão ES|QL</h2><p>Vamos começar com uma consulta que era impossível no Elasticsearch 9.4, que usa <a href="https://www.elastic.co/docs/reference/query-languages/esql/commands/eval">o comando EVAL</a>:</p><p>Neste exemplo, resumo não possui mapeamento ou configuração de analisador. Também não está associado a nenhum índice invertido. Ele existe apenas durante a vida útil dessa consulta, mas agora você pode buscar mesmo assim. Duas adições fazem isso funcionar.</p><p>Primeiro, <a href="https://www.elastic.co/docs/reference/query-languages/esql/functions-operators/search-functions/match">MATCH</a> agora aceita qualquer expressão como seu primeiro argumento, não apenas um campo mapeado. Isso inclui colunas produzidas pelo EVAL e resultados de funções usados em linha. Também inclui campos não mapeados carregados diretamente do documento original. Além disso, todos os tipos de dados normalmente aceitos pelo MATCH são suportados neste novo caso de uso.</p><p>A segunda parte disso é a nova <a href="https://www.elastic.co/docs/reference/query-languages/esql/functions-operators/type-conversion-functions/to_text">função TO_TEXT</a>, que é a primeira função de conversão ES|QL que produz saída do tipo texto. Até agora, colunas de texto só podiam vir de campos mapeados indexados, e todas as strings produzidas pelas expressões ES|QL eram valores de palavras-chave em vez de texto. A distinção importa porque o MATCH trata os dois de forma diferente: os valores do texto são analisados, enquanto os valores das palavras-chave são comparados exatamente, espelhando como uma consulta MATCH em um campo indexado se reescreve para uma consulta de termo. TO_TEXT(x) é como você diz ao ES|QL: <em>trate essa sequência como texto completo</em>.</p><p>Este é incluído como uma prévia técnica no Elasticsearch 9.5 e, por isso, possui algumas limitações:</p><ul><li><p>No momento, funciona apenas para filtragem. Um MATCH em uma expressão ainda não contribui para a pontuação de relevância; apenas correspondências em campos indexados afetam a pontuação.</p></li><li><p>Opções de consulta como fuzziness e outras ainda não são suportadas ao combinar uma expressão.</p></li><li><p>O texto em tempo de execução é analisado com o analisador padrão. Isso ainda não é configurável.</p></li></ul><p>Trabalhos estão em andamento para abordar essas limitações.</p><h2>Por que usar a busca em texto completo em vez de LIKE ou RLIKE no ES|QL?</h2><p>ES|QL já tinha duas formas de buscar strings sem índice: LIKE (padrões curinga) e RLIKE (expressões regulares). Ambos funcionam em qualquer expressão de string, então é justo perguntar o que o MATCH adiciona. A resposta é <a href="https://www.elastic.co/docs/manage-data/data-store/text-analysis">análise</a>, uma forma mais avançada de busca que utiliza técnicas como stemming e sinônimos. Também utiliza o tratamento de stopwords.</p><p>LIKE é simples correspondência de substrings, sem qualquer compreensão das palavras que compõem uma string. Digamos, por exemplo, que você esteja procurando mensagens de log sobre uma raposa:</p><p>Isso perde "Fox avistado perto do galinheiro" devido à capitalização, ao mesmo tempo em que iguala "Outfoxed pela competição", que não tem nada a ver com uma raposa. Ele falha em ambas as direções, com falsos negativos devido à capitalização e falsos positivos em substrings contidas em outras palavras.</p><p>Expressões regulares podem corrigir o problema do caso, mas o problema da fronteira de palavras fica feio rapidamente. Algo como:</p><p>E nem isso está certo ainda. Ele deixa de encontrar "fox" no final de uma frase seguida de ! ou ?, e não considera tabulações, aspas ou parênteses. Cada correção faz o padrão mais longo, e a próxima pessoa que ler a consulta precisa fazer engenharia reversa do que ele realmente está fazendo.</p><p>MATCH faz o problema desaparecer, pois executa tanto a consulta quanto o valor por um <a href="https://www.elastic.co/docs/reference/text-analysis/analyzer-reference">analisador</a>, que tokeniza texto em termos minúsculos e então faz a correspondência termo contra termo:</p><p>Essa consulta corresponderá a valores como "A rápida raposa marrom" e "FOX avistada perto do galinheiro", mas não a "Enganada pela concorrência" ou "protocolo FOXTROT ativado", independentemente de qualquer pontuação ao redor das palavras. Claro, tudo isso funciona para consultas de múltiplos termos, como MATCH(TO_TEXT(message), "brown fox"), exatamente do jeito que você esperaria.</p><p>Estão em andamento trabalhos para viabilizar o uso dos <a href="https://www.elastic.co/docs/reference/text-analysis/analysis-lang-analyzer">36 analisadores de linguagem dedicados</a>, com suporte para linguagens naturais em dados que nunca foram indexados ou mapeados.</p><h2>Casos de uso de busca de texto completo para dados não indexados e não mapeados</h2><p>Os exemplos acima pesquisaram valores calculados a partir de <a href="https://www.elastic.co/docs/manage-data/data-store/mapping">campos mapeados</a>. Os casos de uso mais interessantes do ES|QL MATCH em expressões envolvem dados que nunca foram pesquisáveis. Vamos examinar alguns.</p><h3>Como buscar campos não mapeados no ES|QL sem adicionar um mapeamento</h3><p>Às vezes, você deliberadamente deixa um campo fora dos seus mapeamentos, como um rastreamento de pilha verboso ou uma carga útil da requisição bruta. Você pode até mesmo omitir um blob para depuração. Indexar um desses consumiria espaço em disco e na heap em cada documento e não valeria a pena para um campo que você pode consultar uma vez por trimestre.</p><p>Essa decisão sempre foi final, porque <a href="https://www.elastic.co/search-labs/blog/esql-unmapped-fields">campos não mapeados</a> eram totalmente invisíveis para consultas. No Elasticsearch 9.5, você pode usar SET unmapped_fields="load" para fazer o ES|QL carregar campos não mapeados diretamente do documento de origem como palavras-chave. Em seguida, envolva isso em TO_TEXT, e agora você pode executar uma busca de texto completo:</p><p>Aqui, stack_trace nunca foi mapeado. Cada valor é obtido dos documentos originais e analisado em tempo real. Eles são combinados linha por linha. Isso dá trabalho de verdade e nunca será tão rápido quanto uma pesquisa <a href="https://www.elastic.co/docs/manage-data/data-store/index-basics">por índice invertido</a>. Mas agora, aquele campo que você não indexou pode ser pesquisado. Você pode manter o mapeamento pequeno para o caso do dia a dia e ainda responder à pergunta uma vez por trimestre quando importa.</p><h3>Busca de texto completo em um campo de palavra-chave sem reindexação</h3><p>Os campos de palavras-chave podem fazer muito. Eles oferecem correspondência exata, agregações rápidas e ordenação, por isso tantos campos acabam mapeados dessa forma. Mas os mapeamentos são decididos quando os dados chegam, e é fácil acabar em uma situação em que você queira fazer algo diferente do que pretendia originalmente com seus dados. Talvez product_name tenha sido mapeado como palavra-chave porque os dashboards fazem agregações com ele e, depois de receber um ano de dados de produto, alguém queira poder buscar valores dentro de product_name.</p><p>A resposta antiga era mudar o mapeamento para texto (ou adicionar um multicampo) e reindexar tudo. Isso pode ser demorado e caro, e em muitos casos, os usuários simplesmente não vão querer se preocupar com isso. A nova resposta é uma chamada de função:</p><p>TO_TEXT converte os valores das palavras-chave em texto em tempo real, então o MATCH os analisa em vez de compará-los exatamente. Isso permite consultar um campo de palavra-chave sem criar um mapeamento ou reindexar o documento de origem. Se a busca se tornar uma consulta diária, indexar o campo como texto ainda é a melhor opção a longo prazo, mas TO_TEXT lhe dá uma resposta hoje, sem nenhum esforço extra.</p><h3>Buscar no mesmo campo entre índices com mapeamentos diferentes</h3><p><a href="https://www.elastic.co/docs/reference/query-languages/esql/esql-multi-index">ES|QL pode abranger muitos índices</a>, e o mesmo campo não precisa ser sempre igual em todos eles. Quando o mesmo campo tem tipos diferentes em índices distintos, ES|QL o trata como um tipo de união, e uma função de conversão resolve o conflito. Vamos considerar um exemplo em que o campo mensagem é do tipo texto no modelo de índice deste ano, mas era uma palavra-chave no do ano passado:</p><p>Cada valor é analisado no momento da consulta, seja do índice de texto ou do índice de palavras-chave. Os valores das palavras-chave dos índices antigos são tokenizados e em minúsculas como todo o resto, então "connection reset" encontra "Connection RESET by peer", não importa em qual índice esteja.</p><p>Outro caso interessante é quando um campo é mapeado em apenas um índice, mas também presente (e não mapeado) no outro:</p><p>Há uma nuance que vale a pena destacar aqui. Se error_details estiver mapeado em logs-2026, mas não em logs-2025, o Elasticsearch não pode enviar essa consulta para <a href="https://lucene.apache.org/">Lucene</a>, porque os índices onde o campo não está mapeado retornariam silenciosamente nenhuma correspondência. Em vez disso, o planejador percebe que o campo pode não estar mapeado e avalia toda a MATCH linha por linha, de onde quer que as linhas tenham vindo. Você não precisa saber quais índices têm o campo mapeado; a consulta apenas responde à questão.</p><h2>Como ES|QL analisa texto no momento da consulta sem um índice invertido</h2><p>Quando o ES|QL planeja uma correspondência (match) contra uma expressão, ele analisa a string de consulta uma vez, no início, em um conjunto de termos. A forma como cada linha é então avaliada depende do tipo da expressão:</p><p><strong>Tipo de expressão</strong></p><p><strong>Processamento</strong></p><p><strong>Comportamento de correspondência</strong></p><p>texto (via TO_TEXT)</p><p>O analisador divide o valor em termos minúsculos</p><p>Comparação token-contra-token; uma linha corresponde se qualquer token for igual a qualquer termo de consulta (semântica OU)</p><p>palavra-chave, IP, data, numérico</p><p>Sem análise; constante de consulta convertida uma vez para o tipo nativo</p><p>Comparação exata por linha</p><p>Ambos os caminhos ignoram completamente o Lucene e avaliam os valores linha por linha. O caminho não textual reflete exatamente o que uma consulta match faz quando executada no Lucene para esses tipos de campo, de modo que a semântica permanece consistente independentemente de a sua consulta atingir ou não um índice.</p><p>Uma consulta de índice invertido faz seu trabalho no momento da ingestão e nunca acessa documentos que não correspondem no momento da consulta. Um match em tempo de execução faz essa análise no momento da consulta, para cada linha que a alcança. Uma é rápida porque o trabalho já aconteceu; a outra é flexível porque os dados não precisam ter sido indexados de forma alguma.</p><h2>O que vem a seguir para a busca de texto completo no ES|QL</h2><p>Tudo o que está neste post é a primeira parte de um esforço maior para fazer a busca no ES|QL funcionar em qualquer coisa, não apenas no que você indexou antes. As limitações mencionadas anteriormente estão sendo trabalhadas ativamente, e o roadmap vai além:</p><ul><li><p><strong>Pontuação.</strong> Correspondências em tempo de execução contribuem para _score, então você pode ordenar por relevância mesmo quando os dados nunca foram indexados.</p></li><li><p><strong>MATCH_PHRASE</strong><strong> em expressões.</strong> Já disponível no Elastic Cloud Serverless, e chegando ao Elastic Stack na versão 9.6.</p></li><li><p><strong>Analisadores configuráveis.</strong> Suporte a analisadores para MATCH e MATCH_PHRASE em expressões, permitindo analisadores de linguagem, derivação (stemming) e sinônimos no momento da consulta.</p></li><li><p><strong>Opções do MATCH.</strong> Opções como fuzziness e operador para correspondências em tempo real.</p></li><li><p><strong>Busca vetorial.</strong> Gerando vetores de incorporação por linha e executando k-nearest neighbors (kNN) em expressões dense_vector em tempo de execução, trazendo também a pesquisa semântica para dados não indexados.</p></li></ul><h2>Experimente hoje a busca de texto completo do ES|QL em expressões</h2><p>Você pode experimentar a busca em tempo de execução hoje mesmo. Já está disponível no Elastic Cloud Serverless, onde as novas capacidades do ES|QL são lançadas primeiro, e ele é disponibilizado como uma prévia técnica no Elasticsearch 9.5. Comece consultando a referência <a href="https://www.elastic.co/docs/reference/query-languages/esql/functions-operators/search-functions">das funções de pesquisa</a> e verifique a página <a href="https://www.elastic.co/docs/reference/query-languages/esql/limitations">de limitações do ES|QL</a> para conhecer os limites atuais. É uma prévia técnica porque queremos seu feedback: se você buscar algo que nunca foi indexado e isso o surpreender, seja positiva ou negativamente, <a href="https://www.elastic.co/pt/community">gostaríamos muito de saber</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[Mapeamentos]]></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[Como exibir os campos de um índice do Elasticsearch]]></title>
    <description><![CDATA[Aprenda como exibir os campos de um índice do Elasticsearch usando as APIs _mapping e _search, subcampos, _source sintético e campos de tempo de execução.]]></description>
    <content:encoded><![CDATA[<p>Neste artigo, discutiremos como exibir os campos de um índice do Elasticsearch. Isso pode ser útil para entender a estrutura dos seus dados, identificar campos específicos e solucionar problemas. Abordaremos os seguintes tópicos:</p><ol><li><p>Utilizando a API <code>_mapping</code> para recuperar informações de campo</p></li><li><p>Utilizando a API <code>_search</code> para exibir valores de campo</p></li><li><p>Exibição de subcampos</p></li><li><p>_source sintética</p></li><li><p>Campos de tempo de execução</p></li></ol><h2>1. Utilizando a API _mapping para recuperar informações de campo</h2><p>A API <code>_mapping</code> permite recuperar a definição de mapeamento para um índice ou vários índices. Isso inclui informações sobre os campos, seus tipos de dados e outras propriedades. Para recuperar o mapeamento de um índice específico, utilize a seguinte solicitação:</p>GET /&lt;index_name&gt;/_mapping<p>Por exemplo, se você tiver um índice chamado <code>my_index</code>, poderá recuperar seu mapeamento com a seguinte solicitação:</p>GET /my_index/_mapping<p>A resposta incluirá a definição de mapeamento para o índice, que contém informações sobre os campos e suas propriedades.</p><p>Também é possível recuperar o mapeamento de um campo específico. Isso pode ser útil se o seu mapeamento for muito extenso e você quiser se concentrar apenas em um campo específico. Para obter o mapeamento de um campo específico, utilize a seguinte solicitação:</p>GET /my_index/_mapping/field/my_field<p>Você também pode recuperar os mapeamentos de vários campos separando seus nomes por vírgulas, como na seguinte solicitação:</p>GET /my_index/_mapping/field/my_field_1,my_field_2,my_field_3<h2>2. Usando a API _search para exibir valores de campo</h2><p>Para exibir os valores dos campos em um índice do Elasticsearch, você pode usar a API <code>_search</code> . A API <code>_search</code> oferece várias maneiras de controlar quais campos são retornados; as duas principais são:</p><ol><li><p><strong><code>_source</code></strong>O campo <a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/mapping-source-field"><code>_source</code></a> contém o corpo original do documento JSON exatamente como foi indexado, incluindo quaisquer alterações feitas pelos pipelines de ingestão ou etapas de pré-processamento. Para exibir campos específicos do documento de origem, implemente a filtragem de origem, como veremos a seguir.</p></li><li><p><strong><code>fields</code></strong>O parâmetro <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/retrieve-selected-fields"><code>fields</code></a> permite recuperar campos específicos dos seus documentos ao realizar uma pesquisa, com base no mapeamento do índice. Ao contrário de <code>_source</code>, <code>fields</code> também pode retornar valores de campos armazenados, valores de documentos ou campos de tempo de execução sem fazer referência a <code>_source</code>, embora para campos padrão sem valores de documentos ou configurações armazenadas, ele recorra a <code>_source</code>. Isso pode trazer muitos benefícios, como melhoria de desempenho e outros, como veremos a seguir.</p></li></ol><h3>Usando o campo _source</h3><p>Por padrão, a API<code> _search</code> retorna o campo <code>_source</code> , que contém o documento JSON original que foi indexado. Para exibir campos específicos, você pode adicionar filtros no parâmetro <code>_source </code>da solicitação de pesquisa; isso é chamado de filtragem de origem.</p><p>Aqui está um exemplo de uma solicitação de pesquisa que retorna os valores dos campos <code>title </code>e <code>author</code> para documentos no índice <code>my_index</code> :</p>GET /my_index/_search
{
  "query": {
    "match_all": {}
  },
  "_source": ["title", "author"]
}<p>Neste exemplo, o parâmetro <code>_source</code> especifica os campos a serem retornados.</p><p>Se você precisar de ainda mais controle, pode usar as propriedades <code>includes</code> e <code>excludes </code>do objeto <code>_source</code> . Por exemplo, a consulta abaixo retorna o campo de nível superior <code>title</code> e todos os subcampos de <code>author</code> exceto <code>author.description</code>.</p>GET /my_index/_search
{
  "query": {
    "match_all": {}
  },
  "_source": {
     “includes”: [“title”, “author.*],
     “excludes”: [“author.description”]
  }
}<p>Neste exemplo, usamos o padrão <code>author.* </code>para recuperar todos os subcampos diretos do objeto <code>author </code> . Então excluímos explicitamente <code>author.description </code>para que apenas os outros campos de autor sejam retornados. Note que isso não traz nenhuma melhoria de desempenho, já que ainda precisa carregar e analisar o JSON de origem, mas pode reduzir o tamanho da resposta enviada pela rede.</p><h3>Usando o parâmetro de campos</h3><p>Você pode usar o parâmetro <code>fields</code> para filtrar os campos retornados na resposta da pesquisa. O uso de <code>fields</code> em vez de <code>_source</code> oferece diversas vantagens, incluindo:</p><ul><li><p><strong>Desempenho aprimorado: </strong><code>fields </code>pode retornar valores diretamente de <a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/mapping-store">campos armazenados</a> ou <a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/doc-values">valores de documentos</a> sem ter que carregar o <code>_source</code> completo, tornando o tamanho da carga útil da resposta menor.</p></li><li><p><strong>Saída formatada:</strong> Para campos padrão,<code> fields</code> pode recorrer a <code>_source</code> para obter os valores, mas ele analisa o mapeamento do índice para formatar corretamente a saída, como datas formatadas, tornando-as consistentes com o que é usado para agregações e classificação.</p></li><li><p><strong>Acesso a campos de tempo de execução:</strong> <code>fields</code> pode retornar campos de tempo de execução, que não existem no <code>_source</code> original.</p></li><li><p>Você pode encontrar mais benefícios <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/retrieve-selected-fields#search-fields-param">aqui</a>.</p></li></ul><p>Por exemplo, para retornar apenas os campos <code>title</code> e <code>author</code> no índice <code>my_index</code> , você pode usar a seguinte solicitação de pesquisa:</p>GET /my_index/_search
{
  "query": {
    "match_all": {}
  },
  "fields": ["title", "author"],
  "_source": false
}<p>Na consulta acima, definimos o campo <code>_source </code>como falso para não retornarmos o documento de origem. Isso pode minimizar drasticamente o tamanho da carga útil da resposta, mas lembre-se de que isso só funciona porque os campos <code>title</code> e <code>author</code> são do tipo de campo <code>keyword </code> , que têm <code>doc_values</code> habilitado por padrão. Se o campo não tiver <code>doc_values</code> habilitado e <code>_source</code> estiver definido como falso, o Elasticsearch não terá como recuperá-los e eles serão ignorados na resposta.</p><p>É importante notar que a resposta <code>fields</code> sempre retorna uma matriz de valores para cada campo, mesmo que haja apenas um único valor. Isso ocorre porque o Elasticsearch não possui um tipo de array dedicado, e qualquer campo pode ter vários valores. Para obter mais informações sobre arrays no Elasticsearch, clique <a href="http://elastic.co/docs/reference/elasticsearch/mapping-reference/array">aqui</a>.</p><h3>Outras formas de recuperar campos</h3><p>Embora a recuperação de campos usando <code>_source</code> ou <code>fields</code> sejam os métodos recomendados, existem outros métodos disponíveis para casos de uso específicos, como:</p><p><strong>Campos de valor do documento:</strong> Se você quiser evitar <code>_source</code> completamente, você pode pesquisar usando o parâmetro <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/retrieve-selected-fields#docvalue-fields"><code>docvalue_fields</code></a> . Os valores do documento armazenam os mesmos valores de campo que <code>_source</code> , mas em uma estrutura de dados em disco, otimizada para classificação e agregações.</p><p>Como é separado dos valores armazenados com <code>_source</code>, você pode solicitar campos específicos sem carregar todo o <code>_source</code>. Isso é útil se você estiver consultando documentos grandes, mas precisar apenas de alguns campos pequenos que suportem valores do tipo "doc". Outro caso de uso para usar <code>docvalue_fields </code>é quando você deseja usar formatação personalizada nos campos <code>date</code> e <code>numeric</code> , como veremos no exemplo abaixo.</p><p>Observe que isso só funciona para campos que você habilita <code>doc_values</code> ou para tipos de campo que o têm habilitado por padrão, como <code>keyword</code>, <code>date</code>, tipos numéricos e <code>boolean</code>, não para <a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/text"><code>text</code></a> ou <a href="https://www.elastic.co/docs/reference/elasticsearch/plugins/mapper-annotated-text-usage"><code>annotated_text</code></a>.</p><p>Neste exemplo, usamos o parâmetro <code>docvalue_fields</code> para recuperar os campos <code>title</code>, <code>author</code> e <code>published</code> sem carregar o documento <code>_source</code> completo:</p>GET /my_index/_search
{
  "query": {
    "match_all": {}
  },
  "docvalue_fields": [
    "title",
    "author",
    {
      "field": "published",
      "format": "epoch_millis"
    }
  ],
  "_source": false
}<p>Quando esta consulta é executada, o Elasticsearch obtém os valores diretamente de seu armazenamento colunar em disco, em vez de referenciar o <code>_source </code>para cada documento. O campo <code>published</code> é retornado com o formato <code>epoch_millis</code> em vez do formato padrão, graças ao parâmetro <code>format</code> fornecido na consulta.</p><p><strong>Campos armazenados:</strong> Se você marcou explicitamente campos específicos como <a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/mapping-store">armazenados</a> no mapeamento, você pode usar o parâmetro <code>stored_fields</code> para filtrar esses campos. Isso é útil se você deseja respostas resumidas apenas com esses campos específicos ou para campos que você armazenou deliberadamente para recuperação posterior. É armazenado separadamente de <code>_source</code>, portanto, este método também é útil para evitar a necessidade de carregar <code>_source</code>.</p><p>É importante notar que esta opção está desativada por padrão e geralmente não é recomendada. Em vez disso, utilize a filtragem de origem para retornar determinados subconjuntos do documento de origem original.</p><p>Na consulta de exemplo abaixo, usamos o parâmetro <code>stored_fields</code> para recuperar o campo <code>summary</code> , que tem a configuração de mapeamento de índice de ”<code>store”: true</code>.</p>GET /my_index/_search
{
  "query": {
    "match_all": {}
  },
  "stored_fields": ["summary"]
}<p>Quando esta consulta é executada, o Elasticsearch verifica se este campo foi marcado com <code>”store”: true</code>, se não o encontrar, irá ignorar o campo completamente.</p><h2>3. Exibição de subcampos</h2><p>Se o seu índice contiver subcampos, você pode usar a notação de ponto para especificar o caminho do campo no parâmetro <code>fields</code> . Note que os subcampos são diferentes do <a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/nested">tipo de campo aninhado</a>. Por exemplo, se você tiver um subcampo chamado <code>address.city</code>, poderá incluí-lo na resposta da pesquisa desta forma:</p>GET /my_index/_search
{
  "query": {
    "match_all": {}
  },
  "fields": ["title", "author", "address.city"],
  "_source": false
}<p>Neste exemplo, a resposta da pesquisa incluirá os valores dos campos <code>title</code>, <code>author</code> e <code>address.city</code> .</p><h2>4. Fonte sintética</h2><p>Se você quiser manter a funcionalidade de usar<code> _source</code> , mas também economizar espaço em disco, você tem a opção de usar <code>_source</code> sintético em seu mapeamento de índice. <a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/mapping-source-field#synthetic-source"><code>_source</code></a> <a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/mapping-source-field#synthetic-source">sintético </a>é um recurso que permite ao Elasticsearch reconstruir o <code>_source</code> a partir de dados existentes, como campos armazenados e valores de documentos, mesmo quando <code>_source</code> está desativado. Isso permite economizar bastante espaço de armazenamento, ao custo de velocidades ligeiramente menores no momento da consulta, já que a reconstrução ocorre em tempo real. Ative este recurso usando os valores abaixo nas configurações do seu índice:</p>PUT idx
{
  "settings": {
    "index": {
      "mapping": {
        "source": {
          "mode": "synthetic"
        }
      }
    }
  }
}<p>Algumas vantagens de usar <code>_source </code>sintético incluem: exibição do documento completo ao usar a API <code>_search</code> , filtragem de origem e compatibilidade com outros recursos e ferramentas como o Kibana que esperam que <code>_source</code> esteja disponível, tudo isso evitando a necessidade de armazenar o documento <code>_source</code> completo.</p><h2>5. Campos de tempo de execução</h2><p><a href="https://www.elastic.co/docs/manage-data/data-store/mapping/runtime-fields">Os campos de tempo de execução</a> permitem definir campos com script no momento da consulta ou no mapeamento do índice, dentro de um bloco de tempo de execução. Esses campos nunca são indexados, portanto, adicionar um campo de tempo de execução não aumenta o tamanho do índice, mas nunca aparecerá em <code>_source</code>. Os campos de tempo de execução definidos no mapeamento são persistentes e estão disponíveis para todas as consultas, enquanto os campos de tempo de execução definidos no momento da consulta são temporários e estão disponíveis apenas nessa solicitação de pesquisa.</p><p>A principal vantagem de usar campos em tempo de execução é a capacidade de adicionar campos aos documentos depois de já os ter importado, simplificando as decisões de mapeamento. Os campos de tempo de execução também são ótimos para enriquecer seus documentos com valores que não existem no documento original, mas são gerados por meio de um script, como formatar uma string ou calcular uma pontuação.</p><p>Vale ressaltar também que os campos de tempo de execução podem prejudicar o desempenho, pois será necessário executar um script para cada documento no conjunto de resultados. Para <a href="https://www.elastic.co/docs/manage-data/data-store/mapping/retrieve-runtime-field">recuperar um campo de tempo de execução</a>, você também pode usar o parâmetro <code>fields</code> na API <code>_search</code> .</p><h2>Conclusão</h2><p>A exibição de campos de um índice Elasticsearch pode variar desde a simples recuperação de valores usando o mapeamento de índice ou o <code>_source</code>, até métodos mais avançados usando <code>fields</code>, <code>docvalue_fields</code> ou campos de tempo de execução para maior controle e eficiência. Compreender as vantagens e desvantagens de diferentes métodos é fundamental para otimizar suas experiências de busca. Seja para otimizar payloads, enriquecer documentos ou usar dados sintéticos <code>_source</code> para economizar armazenamento, o Elasticsearch oferece diversas ferramentas e recursos para encontrar os dados que você precisa, da maneira que você precisa. Essas técnicas podem ajudá-lo a entender a estrutura de seus dados, identificar campos específicos e 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[Dados de indexação]]></category>
    <category><![CDATA[Mapeamentos]]></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[Mapeamento de embeddings para tipos de campo do Elasticsearch: semantic_text, dense_vector, sparse_vector]]></title>
    <description><![CDATA[Discutindo como e quando usar semantic_text, dense_vector ou sparse_vector, e como eles se relacionam com a geração de embeddings.]]></description>
    <content:encoded><![CDATA[<p>O uso de embeddings para melhorar a relevância e a precisão da recuperação de informações cresceu significativamente ao longo dos anos. Ferramentas como o Elasticsearch evoluíram para dar suporte a esse tipo de dados por meio de tipos de campos especializados, como vetores densos, vetores esparsos e texto semântico. No entanto, para obter bons resultados, é essencial entender como mapear corretamente os embeddings para os tipos de campo disponíveis no Elasticsearch: <code>semantic_text</code>, <code>dense_vector</code> e <code>sparse_vector</code>.</p><p>Neste artigo, discutiremos esses tipos de campos, quando usar cada um deles e como eles se relacionam com as estratégias de geração e uso de embeddings, tanto durante a indexação quanto na consulta.</p><h2>Tipo de vetor denso</h2><p>O tipo de campo <code>dense_vector</code> no Elasticsearch é usado para armazenar vetores densos, que são representações numéricas de dados como texto, imagens e áudio, onde quase todas as dimensões são relevantes. Esses vetores são gerados usando modelos de incorporação fornecidos por plataformas como OpenAI, Cohere ou Hugging Face, e são projetados para capturar o significado semântico geral dos dados, mesmo quando eles não compartilham termos exatos com outros documentos.</p><p>No Elasticsearch, vetores densos podem ter até 4096 dimensões, dependendo do modelo utilizado. Por exemplo, o modelo all-MiniLM-L6-v2 gera vetores com 384 dimensões, enquanto o text-embedding-ada-002 da OpenAI produz vetores com 1536 dimensões.</p><p>O campo <code>dense_vector</code> é geralmente adotado como o tipo padrão para armazenar esse tipo de incorporação quando é necessário maior controle, como usar vetores pré-gerados, aplicar funções de similaridade personalizadas ou integrar com modelos externos.</p><h3>Quando e por que usar o tipo dense_vector?</h3><p>Vetores densos são excelentes para capturar a similaridade semântica entre frases, parágrafos ou documentos inteiros. Funcionam muito bem quando o objetivo é comparar o significado geral dos textos, mesmo que não compartilhem os mesmos termos.</p><p>O campo vetorial denso é ideal quando você já possui um pipeline externo de geração de embeddings usando modelos fornecidos por plataformas como OpenAI, Cohere ou Hugging Face e deseja apenas armazenar e consultar esses vetores manualmente. Este tipo de campo oferece alta compatibilidade com modelos de incorporação e total flexibilidade na geração e consulta, permitindo controlar como os vetores são produzidos, indexados e usados durante a busca.</p><p>Além disso, oferece suporte a diferentes formas de busca semântica, com consultas como k-NN ou script_score para casos em que seja necessário ajustar a lógica de classificação. Essas possibilidades tornam o vetor denso ideal para aplicações como RAG (Retrieval-Augmented Generation), sistemas de recomendação e buscas personalizadas baseadas em similaridade.</p><p>Finalmente, o campo permite personalizar a lógica de relevância, usando funções como <code>cosineSimilarity</code>, <code>dotProduct</code> ou <code>l2norm</code> para adaptar a classificação de acordo com as necessidades do seu caso de uso. </p><p>Vetores densos continuam sendo a melhor opção para quem precisa de flexibilidade, personalização e compatibilidade com casos de uso avançados, como os mencionados acima.</p><h3>Como usar a consulta para o tipo vetor denso?</h3><p>As pesquisas em campos definidos como <strong><code>dense_vector</code></strong> usam a consulta dos k vizinhos mais próximos. Esta consulta é responsável por encontrar documentos cujo vetor denso seja o mais próximo do vetor de consulta. Abaixo, segue um exemplo de como aplicar uma consulta k-NN a um campo vetorial denso:</p>{
  "knn": {
    "field": "my_dense_vector",
    "k": 10,
    "num_candidates": 50,
    "query_vector": [/* vector generated by model */]
  }
}<p>Além da consulta k-NN, caso haja necessidade de personalizar a pontuação do documento, também é possível usar a consulta script_score, combinando-a com funções de comparação vetorial, como <strong>cossenosimilaridade, produto escalar ou norma l2,</strong> para calcular a relevância de forma mais controlada. Veja o exemplo:</p>{
"script_score": {
    "query": { "match_all": {} },
    "script": {
      "source": "cosineSimilarity(params.query_vector,
'my_dense_vector') + 1.0",
      "params": {
        "query_vector": [/* vector */]
      }
    }
  }
}<p>Se você quiser se aprofundar no assunto, recomendo explorar o artigo <a href="https://www.elastic.co/search-labs/blog/vector-search-set-up-elasticsearch">Como configurar a pesquisa vetorial no Elasticsearch.</a></p><p></p><h2>Tipo de vetor esparso</h2><p>O tipo de campo <strong><code>sparse_vector</code></strong> é usado para armazenar vetores esparsos, que são representações numéricas onde a maioria dos valores é zero e apenas alguns termos têm pesos significativos. Esse tipo de vetor é comum em modelos baseados em termos, como o SPLADE ou o ELSER (Elastic Learned Sparse EncodeR).</p><h3>Quando e por que usar vetores esparsos?</h3><p>Vetores esparsos são ideais quando você precisa de uma busca mais precisa em termos lexicais, sem sacrificar a inteligência semântica. Eles representam o texto como pares de token/valor, destacando apenas os termos mais relevantes com pesos associados, o que proporciona clareza, controle e eficiência.</p><p>Esse tipo de campo é especialmente útil quando você gera vetores com base em termos, como nos modelos ELSER ou SPLADE, que atribuem pesos diferentes a cada token com base em sua importância relativa no texto.</p><p>Para as ocasiões em que você deseja controlar a influência de palavras específicas na consulta, os tipos de vetores esparsos permitem ajustar manualmente o peso dos termos para otimizar a classificação dos resultados.</p><p>Entre os principais benefícios estão a transparência na busca, já que é possível entender claramente por que um documento foi considerado relevante, e a eficiência de armazenamento, pois apenas os tokens com valor diferente de zero são salvos, ao contrário dos vetores densos que armazenam todas as dimensões.</p><p>Além disso, vetores esparsos são o complemento ideal em estratégias de busca híbridas, podendo inclusive ser combinados com vetores densos para unir precisão lexical à compreensão semântica.</p><h3>Como usar a consulta para o tipo vetor esparso?</h3><p>A consulta <strong><code>sparse_vector</code></strong> permite pesquisar documentos com base em um vetor de consulta no formato token/valor. Veja um exemplo da consulta abaixo:</p>{
  "query": {
    "sparse_vector": {
      "field": "field_sparse",
      "query_vector": {
        "token1": 0.6,
        "token2": 0.2,
        "token3": 0.9
      }
    }
  }
}<p>Se preferir usar um modelo treinado, é possível utilizar um endpoint de inferência que transforma automaticamente o texto da consulta em um vetor esparso:</p>{
  "query": {
    "sparse_vector": {
      "field": "field_sparse",
      "inference_id": "the inference ID to produce the token/weights",
      "query": "search text"
    }
  }
}<p>Para explorar este tópico mais a fundo, sugiro a leitura de <a href="https://www.elastic.co/search-labs/blog/sparse-vector-embedding">Understanding sparse vector embeddings with trained ML models</a>.</p><h2>Tipo de texto semântico</h2><p>O tipo de campo <strong><code>semantic_text</code></strong> é a maneira mais simples e direta de usar a pesquisa semântica no Elasticsearch. Ele lida automaticamente com a geração de embeddings, tanto no momento da indexação quanto no momento da consulta, por meio de um endpoint de inferência. Isso significa que você não precisa se preocupar em gerar ou armazenar vetores manualmente.</p><h3>Quando e por que usar texto semântico?</h3><p>O campo <code>semantic_text</code> é ideal para quem quer começar com o mínimo de esforço técnico e sem ter que lidar com vetores manualmente. Este campo automatiza etapas como a geração de incorporações e o mapeamento de busca vetorial, tornando a configuração mais rápida e conveniente.</p><p>Você deve considerar usar <code>semantic_text</code> quando valoriza <strong>simplicidade e abstração</strong>, pois isso <strong>elimina a complexidade de configurar manualmente mapeamentos, geração de incorporações e pipelines de ingestão</strong>. Basta selecionar o modelo de inferência e o Elasticsearch cuida do resto.</p><p>As principais vantagens incluem <strong>a geração automática de embeddings,</strong> realizada durante a indexação e a consulta, e <strong>o mapeamento pronto para uso</strong>, que já vem pré-configurado para suportar o modelo de inferência selecionado.</p><p>Além disso, o campo oferece <strong>suporte nativo para a divisão automática de textos longos (fragmentação de texto)</strong>, permitindo que textos extensos sejam divididos em trechos menores, cada um com seu próprio embedding, o que melhora a precisão da busca. Isso aumenta consideravelmente a produtividade, especialmente para equipes que desejam entregar valor rapidamente sem se preocupar com a engenharia subjacente da busca semântica.</p><p>No entanto, embora <code>semantic_text</code> proporcione velocidade e simplicidade, esta abordagem tem algumas limitações. Permite a utilização de modelos padrão de mercado, desde que estejam disponíveis como endpoints de inferência no Elasticsearch. Mas <strong>não suporta incorporações geradas externamente</strong>, como é possível com o campo <code>dense_vector</code> .</p><p>Se você precisar de mais controle sobre como os vetores são gerados, quiser usar seus próprios embeddings ou precisar combinar vários campos para estratégias avançadas, os campos <code>dense_vector</code> e <code>sparse_vector</code> fornecem a flexibilidade necessária para cenários mais personalizados ou específicos do domínio.</p><h3>Como usar a consulta para o tipo de texto semântico</h3><p>Antes de <strong><code>semantic_text</code></strong>, era necessário usar uma consulta diferente dependendo do tipo de incorporação (densa ou esparsa). Uma consulta <code>sparse_vector</code> foi usada para campos esparsos, enquanto campos <code>dense_vector</code> exigiram consultas KNN.</p><p>Com o tipo de texto semântico, a busca é realizada utilizando a <a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-semantic-query">consulta semântica</a>, que gera automaticamente o vetor de consulta e o compara com os embeddings dos documentos indexados. O tipo <strong><code>semantic_text</code></strong> permite definir um ponto de extremidade de inferência para incorporar a consulta, mas se nenhum for especificado, o mesmo ponto de extremidade usado durante a indexação será aplicado à consulta.</p>{
  "query": {
    "semantic": {
      "field": "semantic_text_field",
      "query": "search text"
    }
  }
}<p>Para saber mais, sugiro a leitura do artigo <a href="https://www.elastic.co/search-labs/blog/semantic-search-simplified-semantic-text">Elasticsearch new semantic_text mapping: Simplifying semantic search</a>.</p><h2>Conclusão</h2><p>Ao escolher como mapear embeddings no Elasticsearch, é essencial entender como você deseja gerar os vetores e qual o nível de controle necessário sobre eles. Se você busca simplicidade, o campo de texto semântico permite buscas semânticas automáticas e escaláveis, tornando-o ideal para muitos casos de uso iniciais. Quando é necessário maior controle, desempenho mais preciso ou integração com modelos personalizados, os campos vetoriais densos e esparsos oferecem a flexibilidade necessária.</p><p>O tipo de campo ideal depende do seu caso de uso, da infraestrutura disponível e do nível de maturidade da sua pilha de aprendizado de máquina. Mais importante ainda, a Elastic oferece as ferramentas para construir sistemas de busca modernos e altamente adaptáveis.</p><h2>Referências</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 vetorial esparso</a></p></li><li><p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/dense-vector.html">Tipo de campo vetorial 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 de vetor esparso</a></p></li><li><p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/knn-search.html">pesquisa kNN</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/semantic-search-simplified-semantic-text">Novo mapeamento semantic_text do Elasticsearch: Simplificando a busca semântica</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/sparse-vector-embedding">Compreendendo incorporações vetoriais esparsas com modelos de aprendizado de máquina treinados</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[Banco de dados vetorial]]></category>
    <category><![CDATA[Mapeamentos]]></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>