<?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[Mike Pellegrini - 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[Mike Pellegrini - 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/author/mike-pellegrini</link>
    </image>
    <link>https://www.elastic.co/pt/search-labs/author/mike-pellegrini</link>
    <atom:link href="https://www.elastic.co/pt/search-labs/rss/author/mike-pellegrini.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[pt]]></language>
    <lastBuildDate>Tue, 22 Sep 2026 07:49:16 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Busca híbrida sem complicações: simplificando a busca híbrida com recuperadores.]]></title>
    <description><![CDATA[Descubra como simplificar a busca híbrida no Elasticsearch com um formato de consulta de múltiplos campos para recuperadores lineares e RRF, e crie consultas sem conhecimento prévio sobre seu índice do Elasticsearch.]]></description>
    <content:encoded><![CDATA[<p><a href="https://www.elastic.co/what-is/hybrid-search">A busca híbrida</a> é amplamente reconhecida como uma abordagem de busca poderosa, combinando a precisão e a velocidade da <a href="https://www.elastic.co/search-labs/blog/lexical-and-semantic-search-with-elasticsearch#lexical-search---sparse-retrieval">busca lexical</a> com os recursos de linguagem natural da <a href="https://www.elastic.co/what-is/semantic-search">busca semântica</a>. No entanto, aplicá-lo na prática pode ser complicado, muitas vezes exigindo conhecimento profundo sobre o índice e a construção de consultas verbosas com configurações complexas. Neste blog, exploraremos como o <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/retrievers#multi-field-query-format">formato de consulta com múltiplos campos para buscadores lineares e RRF</a> torna a busca híbrida mais simples e acessível, eliminando problemas comuns e permitindo que você aproveite todo o seu potencial com maior facilidade. Analisaremos também como o formato de consulta com vários campos permite realizar consultas de pesquisa híbridas sem conhecimento prévio sobre o índice.</p><h2>O problema da amplitude de pontuação</h2><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3521a6558cd477ca/6a17f174445de94d3c4d0225/c8b49153c47d2cdc233c0d2e440db04711d48ca5-1600x1600.jpg" alt="" /><p>Para contextualizar, vamos analisar um dos principais motivos pelos quais a busca híbrida pode ser difícil: a variação nos intervalos de pontuação. Nosso velho amigo <a href="https://www.elastic.co/elasticon/conf/2016/sf/improved-text-scoring-with-bm25">BM25</a> produz pontuações ilimitadas. Em outras palavras, o BM25 pode gerar pontuações que variam de perto de 0 até (teoricamente) o infinito. Em contraste, as consultas aos campos <code>dense_vector</code> produzirão pontuações limitadas entre 0 e 1. Exacerbando este problema, <code>semantic_text</code> ofusca o tipo de campo usado para indexar embeddings, portanto, a menos que você tenha conhecimento detalhado sobre a configuração do seu índice e endpoint de inferência, pode ser difícil dizer qual será o intervalo de pontuação da sua consulta. Isso representa um problema ao tentar intercalar resultados de busca lexical e semântica, já que os resultados lexicais podem ter precedência sobre os semânticos, mesmo que os resultados semânticos sejam mais relevantes. A solução geralmente aceita para esse problema é normalizar as pontuações antes de intercalar os resultados. O Elasticsearch possui duas ferramentas para isso: os recuperadores <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/retrievers/linear-retriever">lineares</a> e <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/retrievers/rrf-retriever">RRF</a> .
</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt09ed6bf3d25066bd/6a17f1750b0bedbd70dd3686/264481268c8b6ac259e3c257b85431b513f16672-1077x586.png" alt="Comparação dos resultados da pesquisa com linear/rrf versus sem linear/rrf." /><p>O recuperador <strong>RRF</strong> aplica o <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/reciprocal-rank-fusion">algoritmo RRF</a>, usando a classificação do documento como medida de relevância e descartando a pontuação. Como a pontuação não é considerada, as discrepâncias na faixa de pontuação não representam um problema.</p><p>O recuperador <strong>linear</strong> utiliza uma combinação linear para determinar a pontuação final de um documento. Isso envolve pegar a pontuação de cada consulta de componente para o documento, normalizá-la e somá-las para gerar a pontuação total. Matematicamente, a operação pode ser expressa como:</p>Total Score = 𝚺(N(Sx))<p>Onde <code>N</code> é a função de normalização e SX é a pontuação para a consulta X. A função de normalização é fundamental aqui, pois transforma a pontuação de cada consulta para usar o mesmo intervalo. Você pode aprender mais sobre o recuperador linear <a href="https://www.elastic.co/search-labs/blog/linear-retriever-hybrid-search">aqui</a>.</p><h2>Analisando detalhadamente</h2><p>Os usuários podem implementar uma busca híbrida eficaz com essas ferramentas, mas isso requer algum conhecimento sobre o seu índice. Vejamos um exemplo com o recuperador linear, onde consultaremos um índice com dois campos:</p>PUT linear_retriever_example
{
  "mappings": {
    "properties": {
      "semantic_text_field": { &lt;1&gt;
        "type": "semantic_text",
        "inference_id": ".multilingual-e5-small-elasticsearch"
      },
      "text_field": { &lt;2&gt;
        "type": "text"
      }
    }
  }
}<p>1. <code>semantic_text_field</code> é um campo <code>semantic_text</code> que usa <a href="https://www.elastic.co/docs/explore-analyze/machine-learning/nlp/ml-nlp-e5">E5</a>, um modelo de incorporação de texto.</p><p>2. <code>text_field</code> é um campo <code>text</code> padrão</p>GET linear_retriever_example/_search
{
  "retriever": {
    "linear": {
      "retrievers": [
        {
          "retriever": {
            "standard": {
              "query": {
                "match": { &lt;1&gt;
                  "semantic_text_field": "foo"
                }
              }
            }
          },
          "normalizer": "minmax"
        },
        {
          "retriever": {
            "standard": {
              "query": {
                "match": {
                  "text_field": "foo"
                }
              }
            }
          },
          "normalizer": "minmax"
        }
      ]
    }
  }
}<p>1. Usamos uma consulta <code>match</code> em nosso campo <code>semantic_text</code> , para o qual <a href="https://www.elastic.co/search-labs/blog/semantic-search-match-knn-sparse-vector#we-made-match-happen-in-semantic-search!">adicionamos suporte no Elasticsearch 8.18/9.0</a></p><p>
Ao construir a consulta, precisamos ter em mente que <code>semantic_text_field</code> usa um modelo de incorporação de texto, portanto, quaisquer consultas sobre ele gerarão uma pontuação entre 0 e 1. Precisamos também saber que <code>text_field</code> é um campo <code>text</code> padrão e, portanto, as consultas nele gerarão uma pontuação ilimitada. Para criar um conjunto de resultados com a relevância adequada, precisamos usar um mecanismo de recuperação que normalize as pontuações das consultas antes de combiná-las. Neste exemplo, usamos o recuperador linear com normalização <code>minmax</code> , que normaliza a pontuação de cada consulta para um valor entre 0 e 1.</p><p>A construção da consulta neste exemplo é bastante simples, pois envolve apenas dois campos. No entanto, a situação pode se complicar rapidamente à medida que mais campos, e de tipos variados, são adicionados. Isso demonstra como escrever uma consulta de pesquisa híbrida eficaz geralmente requer um conhecimento mais profundo do índice consultado, para que as pontuações das consultas componentes sejam devidamente normalizadas antes da combinação. Isso representa uma barreira para a adoção mais ampla da busca híbrida.</p><h3>Agrupamento de consultas</h3><p>Vamos expandir o exemplo: E se quiséssemos consultar um campo <code>text</code> e dois campos <code>semantic_text</code> ? Poderíamos construir uma consulta como esta:</p>GET linear_retriever_example/_search
{
  "retriever": {
    "linear": {
      "retrievers": [
        {
          "retriever": {
            "standard": {
              "query": {
                "semantic": {
                  "field": "semantic_text_field_1",
                  "query": "foo"
                }
              }
            }
          },
          "normalizer": "minmax"
        },
        {
          "retriever": {
            "standard": {
              "query": {
                "semantic": {
                  "field": "semantic_text_field_2",
                  "query": "foo"
                }
              }
            }
          },
          "normalizer": "minmax"
        },
        {
          "retriever": {
            "standard": {
              "query": {
                "match": {
                  "text_field": "foo"
                }
              }
            }
          },
          "normalizer": "minmax"
        }
      ]
    }
  }
}<p>Isso parece bom à primeira vista, mas existe um problema em potencial. Agora, as correspondências do campo <code>semantic_text</code> representam ⅔ da pontuação total:</p>Total Score = N(semantic_text_field_1 score) + N(semantic_text_field_2 score) + N(text_field score)<p>Provavelmente não é isso que você deseja, pois cria uma pontuação desequilibrada. Os efeitos podem não ser tão perceptíveis em um exemplo como este, com apenas 3 campos, mas tornam-se problemáticos quando mais campos são consultados. Por exemplo, a maioria dos índices contém muito mais campos lexicais do que semânticos (ou seja, <code>dense_vector</code>, <code>sparse_vector</code> ou <code>semantic_text</code>). E se estivéssemos consultando um índice com 9 campos lexicais e 1 campo semântico usando o padrão acima? As correspondências lexicais representariam 90% da pontuação, diminuindo a eficácia da busca semântica.</p><p>Uma forma comum de resolver isso é agrupar as consultas em categorias lexicais e semânticas e atribuir pesos iguais a ambas. Isso impede que qualquer uma das categorias domine a pontuação total.</p><p>Vamos colocar isso em prática. Como seria essa abordagem de consultas agrupadas neste exemplo ao usar o recuperador linear?</p>GET linear_retriever_example/_search
{
  "retriever": {
    "linear": {
      "retrievers": [
        {
          "retriever": {
            "linear": {
              "retrievers": [
                {
                  "retriever": {
                    "standard": {
                      "query": {
                        "semantic": {
                          "field": "semantic_text_field_1",
                          "query": "foo"
                        }
                      }
                    }
                  },
                  "normalizer": "minmax"
                },
                {
                  "retriever": {
                    "standard": {
                      "query": {
                        "semantic": {
                          "field": "semantic_text_field_2",
                          "query": "foo"
                        }
                      }
                    }
                  },
                  "normalizer": "minmax"
                }
              ]
            }
          },
          "normalizer": "minmax"
        },
        {
          "retriever": {
            "standard": {
              "query": {
                "match": {
                  "text_field": "foo"
                }
              }
            }
          },
          "normalizer": "minmax"
        }
      ]
    }
  }
}<p>Uau, isso está ficando prolixo! Você pode até ter precisado rolar a página para cima e para baixo várias vezes para examinar toda a consulta! Aqui, utilizamos dois níveis de normalização para criar os grupos de consulta. Matematicamente, pode ser expresso como:</p>Total Score = N(N(semantic_text_field_1 score) + N(semantic_text_field_2 score)) + N(text_field score)<p>Este segundo nível de normalização garante que as consultas aos campos <code>semantic_text</code> e <code>text</code> sejam ponderadas igualmente. Observe que omitimos a normalização de segundo nível para <code>text_field</code> neste exemplo, uma vez que há apenas um campo lexical, poupando-o de <em>ainda mais</em> verbosidade.</p><p>Essa estrutura de consulta já é complexa demais, e estamos consultando apenas três campos. À medida que se consultam mais campos, a tarefa torna-se cada vez mais difícil de gerir, mesmo para profissionais de pesquisa experientes.</p><h2>O formato de consulta com vários campos</h2><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5d9007d279f0da29/6a17f17714d90c39cf79b6f5/dd04e1686076a574b717c1460acfe4eb79299208-1600x1600.jpg" alt="" /><p>Adicionamos o <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/retrievers#multi-field-query-format">formato de consulta com vários campos</a> para os recuperadores lineares e RRF no Elasticsearch 8.19, 9.1 e <a href="https://www.elastic.co/cloud/serverless">serverless</a> para simplificar tudo isso. Agora você pode realizar a mesma consulta acima apenas com:</p>GET linear_retriever_example/_search
{
  "retriever": {
    "linear": {
      "fields": [ "semantic_text_field_1", "semantic_text_field_2", "text_field" ],
      "query": "foo",
      "normalizer": "minmax"
    }
  }
}<p>O que reduz a consulta de 55 linhas para apenas 9! O Elasticsearch usa automaticamente os mapeamentos de índice para:</p><ul><li><p>Determine o tipo de cada campo consultado.</p></li><li><p>Agrupe cada campo em uma categoria lexical ou semântica.</p></li><li><p>Dê o mesmo peso a cada categoria na pontuação final.</p></li></ul><p>Isso permite que qualquer pessoa execute uma consulta de pesquisa híbrida eficaz sem precisar saber detalhes sobre o índice ou os endpoints de inferência utilizados.</p><p>Ao usar o RRF, você pode omitir o <code>normalizer</code>, já que a classificação é usada como um indicador de relevância:</p>GET rrf_retriever_example/_search
{
  "retriever": {
    "rrf": {
      "fields": [ "semantic_text_field_1", "semantic_text_field_2", "text_field" ],
      "query": "foo"
    }
  }
}<h2>Aumento por campo</h2><p>Ao usar o recuperador linear, você pode aplicar um reforço por campo para ajustar a importância das correspondências em determinados campos. Por exemplo, digamos que você esteja consultando quatro campos: dois campos <code>semantic_text</code> e dois campos <code>text</code> :</p>GET linear_retriever_example/_search
{
  "retriever": {
    "linear": {
      "fields": [ "semantic_text_field_1", "semantic_text_field_2", "text_field_1", "text_field_2" ],
      "query": "foo",
      "normalizer": "minmax"
    }
  }
}<p>Por padrão, cada campo tem o mesmo peso em seu grupo (lexical ou semântico). A distribuição da pontuação é a seguinte:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdc6e197e5ff7b68d/6a17f179505ac32834ad8c46/ba31c76189e3a1e5b1638437ccf0528aafec2598-1600x549.png" alt="Comparação de grupos de consulta e pontuações de campo" /><p>Em outras palavras, cada área corresponde a 25% da pontuação total.</p><p>Podemos usar a sintaxe <code>field^boost</code> para adicionar um aumento por campo a qualquer campo. Vamos aplicar um aumento de 2 a <code>semantic_text_field_1</code> e <code>text_field_1</code>:</p>GET linear_retriever_example/_search
{
  "retriever": {
    "linear": {
      "fields": [ "semantic_text_field_1^2", "semantic_text_field_2", "text_field_1^2", "text_field_2" ]
      "query": "foo",
      "normalizer": "minmax"
    }
  }
}<p>Agora a distribuição da pontuação é a seguinte:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltccc9ed7d6e865a5e/6a17f17abe6086a31d004882/de20e555d52f914bf483a048d056f54f4fece757-1600x549.png" alt="Alteração no peso do campo com busca de referência e híbrida" /><p>Cada grupo de consultas ainda tem o mesmo peso, mas agora o peso dos campos dentro dos grupos foi alterado:</p><ul><li><p><code>semantic_text_field_1</code> representa 66% da pontuação do grupo de consultas semânticas e 33% da pontuação total.</p></li><li><p><code>text_field_1</code> representa 66% da pontuação do grupo de consulta lexical e 33% da pontuação total.</p></li></ul><p>ℹ️ Observe que o intervalo de pontuação total não será alterado quando um aumento por campo for aplicado. Este é um efeito colateral intencional da normalização de pontuação, que garante que as pontuações das consultas lexicais e semânticas permaneçam diretamente comparáveis entre si.</p><p>ℹ️ O reforço por campo também pode ser usado com o recuperador RRF no Elasticsearch 9.2+</p><h3>Resolução curinga</h3><p>Você pode usar o caractere curinga <code>*</code> no parâmetro <code>fields</code> para corresponder a vários campos. Continuando o exemplo acima, esta consulta é funcionalmente equivalente a consultar explicitamente s<code>emantic_text_field_1</code>, <code>semantic_text_field_2</code> e <code>text_field_1</code> :</p>GET linear_retriever_example/_search
{
  "retriever": {
    "linear": {
      "fields": [ "semantic_text_field_*", "*_field_1" ],
      "query": "foo",
      "normalizer": "minmax"
    }
  }
}<p>É interessante notar que o padrão <code>*_field_1</code> corresponde tanto <code>text_field_1</code> quanto a <code>semantic_text_field_1</code>. Isso é tratado automaticamente; a consulta será executada como se cada um dos campos tivesse sido consultado explicitamente. Também não há problema em que <code>semantic_text_field_1</code> corresponda a ambos os padrões; todas as correspondências de nomes de campos são desduplicadas antes da execução da consulta.</p><p>Você pode usar o caractere curinga de diversas maneiras:</p><ul><li><p>Correspondência de prefixo (ex: <code>*_text_field</code>)</p></li><li><p>Correspondência em linha (ex: <code>semantic_*_field</code>)</p></li><li><p>Correspondência de sufixo (ex: <code>semantic_text_field_*</code>)</p></li></ul><p>Você também pode usar vários curingas para aplicar uma combinação do acima, como <code>*_text_field_*</code>.</p><h3>Campos de consulta padrão</h3><p>O formato de consulta com vários campos também permite consultar um índice sobre o qual você não sabe nada. Se você omitir o parâmetro <code>fields</code> , a consulta abrangerá todos os campos especificados pela <a href="https://www.elastic.co/docs/reference/elasticsearch/index-settings/index-modules">configuração de índice index.query.default_field</a>:</p>GET linear_retriever_example/_search
{
  "retriever": {
    "linear": {
      "query": "foo",
      "normalizer": "minmax"
    }
  }
}<p>Por padrão, <code>index.query.default_field</code> é definido como <code>*</code>. Este caractere curinga será resolvido para todos os tipos de campo no índice que suportam consultas por termo, que são a maioria. As exceções são:</p><ul><li><p><code>dense_vector</code> campos</p></li><li><p><code>rank_vector</code> campos</p></li><li><p>Campos geométricos: <code>geo_point</code>, <code>shape</code></p></li></ul><p>Essa funcionalidade é especialmente útil quando você deseja realizar uma consulta de pesquisa híbrida em um índice fornecido por terceiros. O formato de consulta com vários campos permite executar uma consulta adequada de forma simples. Basta excluir o parâmetro <code>fields</code> e todos os campos aplicáveis serão consultados.</p><h2>Conclusão</h2><p>O problema do intervalo de pontuação pode tornar a implementação de uma busca híbrida eficaz bastante complexa, especialmente quando há pouca informação sobre o índice consultado ou os endpoints de inferência em uso. O formato de consulta com múltiplos campos para os mecanismos de recuperação linear e RRF atenua esse problema, integrando uma abordagem de busca híbrida automatizada, baseada em agrupamento de consultas, em uma API simples e acessível. Funcionalidades adicionais, como reforço por campo, resolução de curingas e campos de consulta padrão, ampliam a funcionalidade para abranger diversos casos de uso.</p><h2>Experimente o formato de consulta com vários campos hoje mesmo.</h2><p>Você pode conferir os mecanismos de recuperação linear e RRF com o formato de consulta de múltiplos campos em projetos Elasticsearch <a href="https://www.elastic.co/cloud/serverless">Serverless</a> totalmente gerenciados, com um <a href="https://www.elastic.co/docs/deploy-manage/deploy/elastic-cloud/create-serverless-project">período de avaliação gratuito</a>. Também está disponível em versões de pilha a partir das versões 8.19 e 9.1.</p><p>Comece em minutos no seu ambiente local com um único comando:</p>curl -fsSL https://elastic.co/start-local | sh<p></p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/hybrid-search-multi-field-query-retrievers-elasticsearch</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/hybrid-search-multi-field-query-retrievers-elasticsearch</guid>
    <category><![CDATA[Busca híbrida]]></category>
    <category><![CDATA[Relevância]]></category>
    <dc:creator><![CDATA[Mike Pellegrini]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt89e066372c549595/6a17f17c3e9e457c38ba1583/4494f98ae3958bbdbc6171df9677fc4d65ec5640-1536x1024.png" length="0" type="image/png"/>
    <pubDate>Thu, 27 Nov 2025 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>