<?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[Noções básicas - 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[Noções básicas - 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/basics</link>
    </image>
    <link>https://www.elastic.co/pt/search-labs/blog/category/basics</link>
    <atom:link href="https://www.elastic.co/pt/search-labs/rss/category/basics.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[pt]]></language>
    <lastBuildDate>Mon, 28 Sep 2026 00:42:05 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Como implantar o Elasticsearch no Azure AKS automaticamente]]></title>
    <description><![CDATA[Aprenda como implantar o Elasticsearch com o Kibana no Azure usando o AKS Automatic e o ECK para uma configuração parcialmente gerenciada do Elasticsearch.]]></description>
    <content:encoded><![CDATA[<p>Este artigo faz parte de uma série onde aprenderemos como instalar o Elasticsearch usando diferentes infraestruturas.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt45071aec499098c0/6a17fe770b0beda3d1dd37f4/0a65ca8b62fd8a42d7751b8f4bf057e33d877304-940x458.png" alt="esforços de implantação do Elasticsearch" /><p>O ECK exige um esforço significativamente maior do que as soluções Elastic Cloud baseadas no Marketplace, mas é mais automatizado do que implantar VMs por conta própria, porque o operador do Kubernetes cuidará da orquestração do sistema e do escalonamento dos nós.</p><p>Desta vez, vamos trabalhar com o Azure Kubernetes Service (AKS), usando o modo automático. Nos outros artigos, você aprenderá como usar <a href="https://www.elastic.co/search-labs/blog/azure-elasticsearch-vm-deployment">as VMs do Azure</a> e <a href="https://www.elastic.co/search-labs/blog/deploy-elasticsearch-azure-marketplace">o Azure Marketplace</a>.</p><h2>O que é o AKS Automatic?</h2><p><a href="https://learn.microsoft.com/en-us/azure/aks/intro-aks-automatic">O Azure Kubernetes Service (AKS) gerencia automaticamente </a>a configuração do cluster, aloca recursos dinamicamente e integra as melhores práticas de segurança, preservando a flexibilidade do Kubernetes, permitindo que os desenvolvedores passem da imagem do contêiner para o aplicativo implantado em minutos.</p><p>O AKS Automatic elimina a maior parte da sobrecarga de gerenciamento de clusters e encontra um bom equilíbrio entre simplicidade e flexibilidade. A escolha certa depende do seu caso de uso, mas a decisão fica mais fácil se você planeja:</p><ul><li><p><strong>Implante um ambiente de teste: </strong>A implantação é rápida e simples, tornando-a ideal para experimentos rápidos ou clusters de curta duração.</p></li><li><p><strong>Trabalhe sem requisitos rígidos de VM, armazenamento ou rede: </strong>o AKS Automatic fornece configurações padrão predefinidas; portanto, se elas atenderem às suas necessidades, você evita configurações adicionais.</p></li><li><p><strong>Comece a usar o Kubernetes pela primeira vez: </strong>ao lidar com grande parte da configuração do cluster, o AKS Automatic reduz a curva de aprendizado e permite que as equipes se concentrem em seus aplicativos.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9e74556cda9b56bd/6a17fe791d1b830cdc93e681/2e4c09b8c5e0ce5e8ea9c369626a373b7030a5ba-854x489.png" alt=" Como criar um cluster automático do Azure Kubernetes Service (AKS)" /><p>Para o Elasticsearch, usaremos <a href="https://www.elastic.co/docs/deploy-manage/deploy/cloud-on-k8s">o Elastic Cloud on Kubernetes </a>(ECK), que é o operador oficial do Elastic Kubernetes e simplifica a orquestração das implantações do Elastic Stack no Kubernetes.</p><h2>Como configurar o AKS automaticamente</h2><p>1. Faça login no <a href="https://azure.microsoft.com/">Portal do Microsoft Azure</a>.</p><p>2. No <strong>canto superior direito, </strong>cliqueNo botão do<strong> Cloud Shell</strong> , você pode acessar o console e implantar o cluster AKS a partir daí. Alternativamente, você pode usar o <a href="https://learn.microsoft.com/en-us/azure/cloud-shell/overview">Azure Cloud Shell</a>.</p><p><em><strong>Lembre-se de atualizar o ID do projeto com o seu durante o tutorial.</strong></em></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt06acd165140f9ab5/6a17fe7ae9ea876604a9c849/0aa60605777c0a6e3aef8faa4e54388c2cb582c8-624x495.png" alt="" /><p><em>Abrir o AKS deve ser semelhante à captura de tela acima.</em></p><p>3. Instale a extensão aks-preview da CLI do Azure. Esta versão de pré-visualização permitirá selecionar <code>--sku automatic</code> na criação do cluster, o que habilita o recurso AKS Automático.</p>az extension add --name aks-preview<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt703add301bb94b89/6a17fe7c57726213da1bce20/2e05ab67fc554c5fb5208683c179fdeaeadd95db-624x56.png" alt="" /><p><em>Se você vir esta mensagem, significa que a extensão AKS foi instalada corretamente.</em></p><p>4. Registre<a href="https://learn.microsoft.com/en-us/azure/azure-app-configuration/concept-feature-management"> os sinalizadores de recursos</a> usando o comando <code>az feature register</code></p>az feature register --namespace Microsoft.ContainerService --name AutomaticSKUPreview<p><em>Você verá os detalhes sobre a assinatura do recurso que acabamos de criar:</em></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt024ca2930c3a02e3/6a17fe7ee9ea87e003a9c84d/3aca710c1f312ba91de461638e518386919ec722-801x138.png" alt="" /><p>Verifique o status do registro até que ele mude de “<em><strong>Registrando</strong></em>” para “<em><strong>Registrado</strong></em>”. O processo de cadastro pode levar alguns minutos.</p>az feature show --namespace Microsoft.ContainerService --name AutomaticSKUPreview<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0b8d717b484bd461/6a17fe7f445de951aa4d0382/186486b08ab8e1c372efaff50f10cbddeaf4e0cd-844x177.png" alt="" /><p>Execute <code>az provider register</code> para propagar as alterações.</p>az provider register --namespace Microsoft.ContainerService<p>5. Criar um grupo de recursos</p><p>Um grupo de recursos é um grupo lógico de recursos do Azure que serão gerenciados e implantados.</p>az group create --name elastic-resource --location eastus<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbbf4b6e75c2dd560/6a17fe8163baff6114741e72/d1952269e97d94f914020754bd02702f9eafd037-770x212.png" alt="" /><p>6. Crie um cluster do Autopilot. Vamos chamá-lo de <em><strong>myAKSAutomaticCluster </strong></em>e usar o grupo de recursos que acabamos de criar. Certifique-se de ter <em><strong>16 vCPUs</strong></em> disponíveis em qualquer um dos seguintes tamanhos de VM: <a href="https://learn.microsoft.com/en-us/azure/virtual-machines/sizes/general-purpose/dpsv5-series">Standard_D4pds_v5</a>, <a href="https://learn.microsoft.com/en-us/azure/virtual-machines/sizes/general-purpose/dldsv5-series">Standard_D4lds_v5</a>, <a href="https://learn.microsoft.com/en-us/azure/virtual-machines/sizes/general-purpose/dadsv5-series">Standard_D4ads_v5</a>, <a href="https://learn.microsoft.com/en-us/azure/virtual-machines/sizes/general-purpose/ddsv5-series">Standard_D4ds_v5</a>, <a href="https://learn.microsoft.com/en-us/azure/virtual-machines/sizes/general-purpose/ddv5-series">Standard_D4d_v5</a>, <a href="https://learn.microsoft.com/en-us/azure/virtual-machines/sizes/general-purpose/ddv4-series">Standard_D4d_v4</a>, <a href="https://learn.microsoft.com/en-us/azure/virtual-machines/sizes/general-purpose/dsv3-series">Standard_DS3_v2</a>, <a href="https://learn.microsoft.com/en-us/azure/virtual-machines/sizes/memory-optimized/dv2-dsv2-series-memory">Standard_DS12_v2</a> para que o AKS possa alocar recursos.</p>az aks create \
    --resource-group elastic-resource \
    --name myAKSAutomaticCluster \
    --sku automatic \
    --generate-ssh-keys<p><em>* Se você receber </em>dois erros<em><code>MissingSubscriptionRegistration</code></em><em>), volte ao passo 4 com as assinaturas ausentes. Por exemplo, </em><em><code>The subscription is not registered to use namespace '</code></em><em><strong><code>microsoft.insights</code></strong></em><em><code>'</code></em><em> requer a execução de </em><em><code>az provider register --namespace Microsoft.Insights.</code></em></p><p>Siga as instruções de login interativo:</p><p><em>Uma mensagem solicitando a execução do comando “az login” será exibida. Você precisa executar esse comando e depois esperar.</em></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc711a241388cf786/6a17fe83dbb4fff454fb5929/14c0238f755fe6347519e69d3cb28c0fa52ec044-775x203.png" alt="" /><p>7. Aguarde até que esteja pronto. Leva cerca de 10 minutos para criar.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc389eecd12e3b2c8/6a17fe8425daab0b2408a442/eb00c3ad18f884f47db6645b196808ebec07c1fc-797x177.png" alt="" /><p>8. Configure o acesso à linha de comando do kubectl.</p>az aks get-credentials --resource-group elastic-resource --name myAKSAutomaticCluster<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfdb13d3950950b06/6a17fe85b1e11319e179f4bd/5136d72a5d455345b0b6205bb232c4bdf7762998-793x52.png" alt="" /><p><em>Observe que a extensão que instalamos está habilitando o AKS Automático.</em></p><p>9. Confirme se os nós foram implantados.</p>kubectl get nodes<p>Você verá uma mensagem de erro de acesso proibido; copie o ID do usuário da mensagem de erro.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4b2bb8558e1a39f4/6a17fe87a292991ce3d02ea8/d6c021fa54f4db00d2d795f5ba9b5a93376d03cd-818x47.png" alt="" /><p>10. Adicione seu usuário ao controle de acesso do AKS.</p><p>Obtenha o ID da AKS. Copie a saída do comando.</p>az aks show --resource-group elastic-resource  --name myAKSAutomaticCluster --query id --output tsv<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0ebc4fa29348d561/6a17fe896df7317a3b0a1166/22a1cdc538bd379812a752c6a368a0651000abb8-810x36.png" alt="" /><p>Crie uma atribuição de função usando o ID do AKS e o ID principal do seu usuário.</p>az role assignment create --role "Azure Kubernetes Service RBAC Cluster Admin" --assignee &lt;PRINCIPAL_ID&gt; --scope &lt;AKS_ID&gt;<p>11. Tente confirmar novamente se os nós foram implantados.</p>kubectl get nodes<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltda416366f0e53d49/6a17fe8ab1e113f87c79f4c1/c9b3a5c1cc540ef732c3e7f60b0a973bdbd0b6fd-617x99.png" alt="" /><p>12. Instale o operador Elastic Cloud on the Kubernetes (ECK).</p># Install ECK Custom Resource Definitions
kubectl create -f https://download.elastic.co/downloads/eck/2.16.1/crds.yaml

# Install the ECK operator
kubectl apply -f https://download.elastic.co/downloads/eck/2.16.1/operator.yaml<p>13. Vamos criar uma instância Elasticsearch de nó único com os valores padrão.</p>cat &lt;&lt;EOF | kubectl apply -f -
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: quickstart
spec:
  version: 9.0.0
  nodeSets:
  - name: default
    count: 1
    config:
      node.store.allow_mmap: false
EOF<p>Desativamos <code>nmap</code> porque a máquina AKS padrão tem um valor <code>vm.max_map_count</code> muito baixo. Desativá-lo não é recomendado para produção, mas aumentar o valor de <code>vm.max_map_count</code>. Você pode ler mais sobre como fazer isso <a href="https://www.elastic.co/docs/deploy-manage/deploy/cloud-on-k8s/virtual-memory">aqui</a>.</p><p>14. Vamos também implantar um cluster Kibana de nó único. Para o Kibana, adicionaremos um balanceador de carga, que nos fornecerá um IP externo que poderemos usar para acessar o Kibana a partir do nosso dispositivo.</p>cat &lt;&lt;EOF | kubectl apply -f -
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
  name: quickstart
spec:
  version: 9.0.0
  http:
    service:
      spec:
        type: LoadBalancer
  count: 1
  elasticsearchRef:
    name: quickstart
EOF<p>Por padrão, o AKS Automatic configurará o balanceador de carga como público; você pode alterar esse comportamento definindo a anotação de metadados:</p><p><code>service.beta.kubernetes.io/azure-load-balancer-internal: "true"</code></p><p>15. Verifique se seus pods estão em execução.</p>kubectl get pods<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltea98380109a7a0b1/6a17fe8c4b055dda6c43241e/213a897176c0af6cea19c7c777cfaf8734e3ee6e-616x84.png" alt="" /><p>16. Você também pode executar <code>kubectl get elasticsearch</code> e <code>kubectl get kibana</code> para estatísticas mais específicas, como versão do Elasticsearch, nós e integridade.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt89119d59582673d9/6a17fe8d4b055d4257432422/c84988e725ef892eddd8fb7e5a03d58c35a8f9d6-470x62.png" alt="" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte714550df3504cd4/6a17fe8f7b54f982a28b3b19/452dd03d314cd00c8a3c19e19862b968592a0435-415x62.png" alt="" /><p>17. Acesse seus serviços.</p>kubectl get svc<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfc9c24dc9b78a354/6a17fe900b0beda9f8dd37f8/b2d3e8f368be22b89aa2ed4d4d514f97dd6cbabd-624x115.png" alt="" /><p>Isso mostrará o <a href="https://www.elastic.co/docs/deploy-manage/deploy/cloud-on-k8s/accessing-services">URL externo</a> do Kibana em EXTERNAL-IP. Pode levar alguns minutos para o balanceador de carga ser provisionado. <em><strong>Copie o valor de EXTERNAL-IP.</strong></em></p><p>18. Obtenha a senha do Elasticsearch para o usuário 'elastic':</p>kubectl get secret quickstart-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltec8ef3a4df60e7a8/6a17fe9263baff3381741e76/bd74537f8c35c4e027c518913fdb0a0524621d56-624x31.png" alt="" /><p>19. <strong>Acesse o Kibana</strong> através do seu navegador:</p><p>a. URL: https://:5601&lt;EXTERNAL_IP&gt;</p><p>b. Nome de usuário: elastic</p><p>c. Senha: c44A295CaEt44D6xIzN6Zs5m (da etapa anterior)</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7e8fbd1593bae329/6a17fe937b54f91d7c8b3b1d/a601112527d80721b292328ed8da58386d2837eb-463x503.png" alt="" /><p>20. Ao acessar o Elastic Cloud pelo seu navegador, você verá a tela de boas-vindas.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9ad7cd3196eb7dbe/6a17fe95b1e11336a579f4c5/f91e71fa961d215a8d886601d1a9fc5c452ce329-1999x1256.png" alt="" /><p>Se você deseja alterar as especificações do cluster Elasticsearch, como alterar ou redimensionar nós, pode aplicar o manifesto YML novamente com as novas configurações:</p>cat &lt;&lt;EOF | kubectl apply -f -
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: quickstart
spec:
  version: 9.0.0
  nodeSets:
    - name: default
      count: 2
      config:
        node.store.allow_mmap: false
      podTemplate:
        spec:
          containers:
            - name: elasticsearch
              resources:
                requests:
                  memory: 1.5Gi
                  cpu: 2
                limits:
                  memory: 1.5Gi
                  cpu: 2
EOF<p>Neste exemplo, vamos adicionar mais um nó e modificar a RAM e a CPU. Como você pode ver, agora <code>kubectl get elasticsearch</code> mostra 2 nós:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdfe6ff383e03814e/6a17fe974b055dd514432426/4b139a476b50933d45d99e09479112817964f76a-624x60.png" alt="" /><p>O mesmo se aplica ao Kibana:</p>cat &lt;&lt;EOF | kubectl apply -f -
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
  name: quickstart
spec:
  version: 9.0.0
  http:
    service:
      spec:
        type: LoadBalancer
  count: 1
  elasticsearchRef:
    name: quickstart
  podTemplate:
    spec:
      containers:
        - name: kibana
          env:
            - name: NODE_OPTIONS
              value: "--max-old-space-size=1024"
          resources:
            requests:
              memory: 0.5Gi
              cpu: 0.5
            limits:
              memory: 1Gi
              cpu: 1
EOF<p>Podemos ajustar o uso de CPU/RAM do contêiner e também o uso de memória <a href="https://nodejs.org/">do Node.js </a>(<a href="https://nodejs.org/api/cli.html#--max-old-space-sizesize-in-mib">max-old-space-size</a>).</p><p>Lembre-se de que <a href="https://www.elastic.co/docs/deploy-manage/deploy/cloud-on-k8s/volume-claim-templates">os pedidos de reembolso em grande volume já existentes não podem ser reduzidos</a>. Após aplicar a atualização, o operador fará as alterações com o mínimo de interrupção possível.</p><p>Lembre-se de excluir o cluster quando terminar os testes para evitar custos desnecessários.</p>az aks delete --name myAKSAutomaticCluster --resource-group elastic-resource<h2>Conclusão</h2><p>Utilizar o Azure AKS Automatic com o ECK oferece uma solução equilibrada para a implementação do Elasticsearch e do Kibana: reduz a complexidade operacional, garante o dimensionamento e as atualizações automatizadas e aproveita a flexibilidade do Kubernetes. Essa abordagem é ideal para equipes que desejam um processo de implantação confiável, repetível e de fácil manutenção, sem precisar gerenciar manualmente cada detalhe da infraestrutura, tornando-se uma escolha prática tanto para ambientes de teste quanto de produção.</p><h2>Próximas etapas</h2><p>Se você quiser saber mais sobre Kubernetes, pode consultar a documentação oficial aqui:</p><ul><li><p><a href="https://www.elastic.co/docs/deploy-manage/deploy/cloud-on-k8s">Elastic Cloud no Kubernetes | Documentação da Elastic</a></p></li><li><p><a href="https://learn.microsoft.com/en-us/azure/aks/intro-aks-automatic">Introdução ao Azure Kubernetes Service (AKS) Automático (prévia)</a></p></li><li><p><a href="https://azure.github.io/AKS/2024/05/22/aks-automatic">AKS Automatic - Blog de Engenharia da AKS</a></p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-azure-aks-automatic-deployment</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-azure-aks-automatic-deployment</guid>
    <category><![CDATA[Noções básicas]]></category>
    <dc:creator><![CDATA[Eduard Martin]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt58d08dac9d3586db/6a17fe983e9e45002eba16e7/4d821659a606e04390b09215e9a0d32eb01f0d1b-854x489.png" length="0" type="image/png"/>
    <pubDate>Fri, 14 Nov 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Configurando o particionamento recursivo para documentos estruturados no Elasticsearch]]></title>
    <description><![CDATA[Aprenda como configurar o particionamento recursivo no Elasticsearch com tamanho de partição, grupos de separadores e listas de separadores personalizadas para indexação ideal de documentos estruturados.]]></description>
    <content:encoded><![CDATA[<p>Desde a versão 8.16, os usuários podem configurar a estratégia de fragmentação usada ao importar documentos longos para campos de texto semântico. A partir da versão 9.1 / 8.19, introduzimos uma nova estratégia de fragmentação recursiva configurável que utiliza uma lista de expressões regulares para dividir o documento em partes. O objetivo do chunking é dividir um documento longo em seções que englobem conteúdo relacionado. Nossas estratégias atuais dividem o texto em uma granularidade de palavras/frases, mas documentos escritos em formatos estruturados (ex.: O Markdown) geralmente contém conteúdo relacionado dentro de seções que são definidas por algumas strings separadoras (ex. cabeçalhos). Para esses tipos de documentos, estamos introduzindo a estratégia de fragmentação recursiva para aproveitar o formato de documentos estruturados e criar fragmentos melhores!</p><h2>O que é fragmentação recursiva?</h2><p>O particionamento recursivo percorrerá uma lista de seções fornecidas, separando padrões para dividir progressivamente um documento em segmentos menores até atingir o tamanho máximo desejado.</p><h3>Como configuro o chunking recursivo?</h3><p>A seguir, estão os valores configuráveis fornecidos pelo usuário para o particionamento recursivo:</p><ul><li><p>(obrigatório) <code>max_chunk_size</code>: O número máximo de palavras em um bloco.</p></li><li><p>Qualquer uma das seguintes opções:</p><ul><li><p><code>separators</code>Uma lista de padrões de strings de expressão regular que serão usados para dividir o documento em partes.</p></li><li><p><code>separator_group</code>: Uma string que será mapeada para uma lista padrão de separadores definida pela Elastic para uso em tipos específicos de documentos. Atualmente, <code>markdown</code> e <code>plaintext</code> estão disponíveis.</p></li></ul></li></ul><h3>Como funciona o particionamento recursivo?</h3><p>O processo de fragmentação recursiva, dado um documento de entrada, um <code>max_chunk_size</code> (medido em palavras) e uma lista de strings separadoras, é o seguinte:</p><ol><li><p>Se o documento de entrada já estiver dentro do tamanho máximo do bloco, retorne um único bloco que abranja toda a entrada.</p></li><li><p>Divida o texto em partes potenciais com base nas ocorrências do separador. Para cada bloco potencial:</p><ol><li><p>Se o fragmento em potencial estiver dentro do tamanho máximo permitido, adicione-o à lista de fragmentos a serem retornados ao usuário.</p></li><li><p>Caso contrário, repita a partir do passo 2, usando apenas o texto do possível bloco e dividindo-o usando o próximo separador da lista. Se não houver mais separadores para tentar, recorra à segmentação baseada em frases.</p></li></ol></li></ol><h2>Exemplos de configuração de fragmentação recursiva</h2><p>Além do tamanho do bloco, a principal configuração para o particionamento recursivo é selecionar quais separadores devem ser usados para dividir seus documentos. Se você não sabe por onde começar, o Elasticsearch oferece alguns grupos de separadores padrão que podem ser usados para casos de uso comuns.</p><h3>Utilizando grupos separadores</h3><p>Para utilizar um grupo separador, basta fornecer o nome do grupo que você deseja usar ao configurar as opções de fragmentação. Por exemplo:</p>"chunking_settings": {
    "strategy": "recursive",
    "max_chunk_size": 25,
    "separator_group": "plaintext"
}<p>Isso lhe dará uma estratégia de fragmentação recursiva que utiliza a lista de separadores <code>["(?&lt;!\\n)\\n\\n(?!\\n)", "(?&lt;!\\n)\\n(?!\\n)")]</code>. Isso funciona bem para aplicações genéricas de texto simples, dividindo o texto em dois caracteres de nova linha, seguidos por um caractere de nova linha.</p><p>Também oferecemos um grupo separador <code>markdown</code> que utilizará a lista de separadores:</p>[
"\n# ",
       "\n## ",
       "\n### ",
       "\n#### ",
       "\n##### ",
       "\n###### ",
       "\n^(?!\\s*$).*\\n-{1,}\\n",
       "\n^(?!\\s*$).*\\n={1,}\\n"
]<p>Esta lista de separadores funcionará bem para casos de uso gerais de Markdown, dividindo o texto em cada um dos 6 níveis de título e nos caracteres de quebra de seção.</p><p>Ao criar um recurso (ponto de extremidade de inferência/campo de texto semântico), a lista de separadores correspondentes ao grupo de separadores no momento será armazenada em suas configurações. Se o grupo separador for atualizado posteriormente, isso não alterará o comportamento dos seus recursos já criados.</p><h3>Utilizando uma lista separadora personalizada</h3><p>Se um dos grupos de separadores predefinidos não for adequado ao seu caso de uso, você pode definir uma lista personalizada de separadores que atenda às suas necessidades. Observe que expressões regulares podem ser fornecidas dentro da lista de separadores. Segue abaixo um exemplo de configurações de fragmentação configuradas com separadores personalizados:</p>"chunking_settings": {
    "strategy": "recursive",
    "max_chunk_size": 25,
    "separators": ["\n\n", "\n", "&lt;my-custom-separator&gt;"]
}<p>A estratégia de fragmentação acima dividirá em 2 caracteres de nova linha, seguidos por 1 caractere de nova linha e, por último, em uma string <code>“&lt;my-custom-separator&gt;”</code>.</p><h2>Um exemplo de fragmentação recursiva em ação.</h2><p>Vejamos um exemplo de fragmentação recursiva em ação. Neste exemplo, usaremos as seguintes configurações de fragmentação com uma lista personalizada de separadores que dividem um documento Markdown usando os dois níveis de cabeçalho superiores:</p>"chunking_settings": {
    "strategy": "recursive",
    "max_chunk_size": 25,
    "separators": ["\n# ", "\n## "]
}<p>Vamos analisar um documento Markdown simples, sem divisões em partes (unchunked):</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdb5f41d1bd43ba50/6a17e831e9ea87c1d8a9c5f3/3a5507f4a1288065097231548e5b18e240508785-1302x1446.png" alt="Um documento Markdown não dividido em partes" /><p>Agora vamos usar as configurações de fragmentação definidas acima para dividir o documento em partes:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfffda162c7b9c87a/6a17e83296142aefa8eb1b0b/a3313c4c40ff39b8dbcdd7c4878c723f088e6c1a-1600x1187.png" alt="Dividindo um documento em partes no Elasticsearch" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt96f65346a8e09e3a/6a17e834445de9157b4d015e/79a2921943191ea631df94c9d465818ec8d3e738-1600x1206.png" alt="Dividir um documento usando o segundo separador - fragmentação de um documento no Elasticsearch" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt28381c8f85aedf07/6a17e836ec0f89801e5a6640/459e695cce7540267422396b9a62ff4ad35f61db-1600x1260.png" alt="Blocos finais em um documento após o agrupamento baseado em frases no Elasticsearch" /><p>Nota: A quebra de linha no final de cada bloco (exceto o Bloco 3) não está destacada, mas está incluída dentro dos limites reais do bloco.</p><h3>Comece a usar o chunking recursivo hoje mesmo!</h3><p>Para obter mais informações sobre como utilizar este recurso, consulte a documentação sobre como configurar as definições de fragmentação.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/recursive-chunking-structured-documents-elasticsearch</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/recursive-chunking-structured-documents-elasticsearch</guid>
    <category><![CDATA[Noções básicas]]></category>
    <category><![CDATA[Na Elastic]]></category>
    <category><![CDATA[AI]]></category>
    <dc:creator><![CDATA[Daniel Rubinstein]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf442dc4941f37be7/6a17e838505ac3eaf8ad8b3d/591872e31880768ca927507654a621addc0d124d-1600x960.png" length="0" type="image/png"/>
    <pubDate>Tue, 11 Nov 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Apresentando a interface de usuário de regras de consulta do Elasticsearch no Kibana.]]></title>
    <description><![CDATA[Aprenda a usar a interface de regras de consulta do Elasticsearch para adicionar ou excluir documentos de consultas de pesquisa usando conjuntos de regras personalizáveis no Kibana, sem afetar o ranking orgânico.]]></description>
    <content:encoded><![CDATA[<p>A função de um mecanismo de busca é retornar resultados relevantes. No entanto, existem necessidades comerciais que vão além disso — como destacar promoções, priorizar produtos sazonais ou exibir itens patrocinados — e os desenvolvedores nem sempre podem fazer isso na consulta de pesquisa.</p><p>Além disso, esses casos de uso geralmente são sensíveis ao tempo, e passar pelas etapas típicas de desenvolvimento (criar uma ramificação de código e depois esperar por um novo lançamento) é um processo demorado.</p><p>E se pudéssemos realizar todo esse processo com apenas uma chamada de API, ou melhor ainda, com apenas alguns cliques no Kibana?</p><h2>Interface do usuário de regras de consulta</h2><p>O Elasticsearch 8.10 introduziu <a href="https://www.elastic.co/blog/introducing-query-rules-elasticsearch-8-10"><strong>as Regras de Consulta</strong></a> e <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/retrievers/rule-retriever"><strong>o Recuperador de Regras</strong></a>. São ferramentas projetadas para inserir <a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-pinned-query"><em>resultados fixados</em></a> nas consultas sem afetar a classificação dos resultados orgânicos com base em regras. Eles apenas adicionam lógica de negócios aos resultados de forma declarativa e simples.</p><p>Alguns casos de uso comuns para regras de consulta são:</p><ul><li><p><strong>Destacar anúncios ou promoções</strong>: Exibir itens em promoção ou patrocinados no topo.</p></li><li><p><strong>Exclusão por contexto ou geolocalização</strong>: Ocultar determinados itens quando as regulamentações locais não permitem que você os mostre.</p></li><li><p><strong>Priorizar resultados-chave</strong>: Garantir que as pesquisas populares ou fixas estejam sempre no topo, independentemente do ranking orgânico.</p></li></ul><p>Para acessar a interface e interagir com essas ferramentas, você precisa clicar no menu lateral do Kibana e ir para <strong>Regras de Consulta</strong>, em <strong>Relevância:</strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltac12541cddd58e36/6a170853a29299941cd00fc2/242e33e89d1a07ffa0e76009c46b3a9236722741-458x1010.png" alt="Acessando regras de consulta no Elasticsearch em termos de relevância." /><p>Assim que o menu de regras de consulta aparecer, clique em <strong>Criar seu primeiro conjunto de regras:</strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltcc28329c0f3c3aa9/6a17085547d49c67e22d893b/30b3a91bbbf243d314cf38298e01ca5cff784430-1600x945.png" alt="Criando seu primeiro conjunto de regras de consulta no Elasticsearch" /><p>Em seguida, você precisa dar um nome ao seu conjunto de regras.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb37d271297a4f148/6a170856a29299782cd00fc6/26c5462f88678867776f933b5655ca0df0d72a16-708x446.png" alt="Como nomear seu conjunto de regras de consulta no Elasticsearch" /><p>O formulário para definir cada regra possui três componentes principais:</p><ul><li><p><strong>Critérios</strong>: As condições que devem ser cumpridas para que a regra se aplique. Por exemplo, “quando o campo query_string contém o valor <em>Christmas</em>” ou “quando o campo country é <em>CO”.</em></p></li><li><p><strong>Ação</strong>: Isto é o que você deseja que aconteça quando as condições forem atendidas. Ele pode ser fixado (fixando um documento nos primeiros resultados) ou excluído (ocultando um documento).</p></li><li><p><strong>Metadados</strong>: São os campos que acompanham a consulta quando ela é executada. Podem incluir informações do usuário (como localização ou idioma), bem como dados de pesquisa (query_string). Esses são os valores usados pelos critérios para decidir se uma regra deve ou não ser aplicada.</p></li></ul><h2>Exemplo: itens populares</h2><p>Vamos imaginar que temos um site de comércio eletrônico com diversos itens. Ao analisarmos as métricas, notamos que um dos itens mais vendidos na categoria de consoles é o "Controle sem fio DualShock 4", especialmente quando os usuários pesquisam pelas palavras-chave "PS4" ou "PlayStation 4". Assim, decidimos colocar este produto no topo dos resultados, sempre que um usuário pesquisar por essas palavras-chave.</p><p>Primeiro, vamos indexar os documentos de cada item usando uma solicitação de API em lote:</p>POST _bulk
{ "index": { "_index": "products", "_id": "1" } }
{ "id": "1", "name": "PlayStation 4 Slim 1TB", "category": "console", "brand": "Sony", "price": 1200 }
{ "index": { "_index": "products", "_id": "2" } }
{ "id": "2", "name": "DualShock 4 Wireless Controller", "category": "accessory", "brand": "Sony", "price": 250 }
{ "index": { "_index": "products", "_id": "3" } }
{ "id": "3", "name": "PlayStation 4 Camera", "category": "accessory", "brand": "Sony", "price": 200 }
{ "index": { "_index": "products", "_id": "4" } }
{ "id": "4", "name": "PlayStation 4 VR Headset", "category": "accessory", "brand": "Sony", "price": 900 }
{ "index": { "_index": "products", "_id": "5" } }
{ "id": "5", "name": "Charging Station for DualShock 4", "category": "accessory", "brand": "Sony", "price": 80 }<p>Se não intervirmos na consulta, o item geralmente aparece em quarto lugar. Eis a pergunta:</p>GET products/_search
{
 "query": {
   "match": {
     "name": "PlayStation 4"
   }
 }
}<p>E aqui estão os resultados.</p>{
 "took": 1,
 "timed_out": false,
 "_shards": {
   "total": 1,
   "successful": 1,
   "skipped": 0,
   "failed": 0
 },
 "hits": {
   "total": {
     "value": 5,
     "relation": "eq"
   },
   "max_score": 0.6973252,
   "hits": [
     {
       "_index": "products",
       "_id": "3",
       "_score": 0.6973252,
       "_source": {
         "id": "3",
         "name": "PlayStation 4 Camera",
         "category": "accessory",
         "brand": "Sony",
         "price": 200
       }
     },
     {
       "_index": "products",
       "_id": "1",
       "_score": 0.6260078,
       "_source": {
         "id": "1",
         "name": "PlayStation 4 Slim 1TB",
         "category": "console",
         "brand": "Sony",
         "price": 1200
       }
     },
     {
       "_index": "products",
       "_id": "4",
       "_score": 0.6260078,
       "_source": {
         "id": "4",
         "name": "PlayStation 4 VR Headset",
         "category": "accessory",
         "brand": "Sony",
         "price": 900
       }
     },
     {
       "_index": "products",
       "_id": "2",
       "_score": 0.08701137,
       "_source": {
         "id": "2",
         "name": "DualShock 4 Wireless Controller",
         "category": "accessory",
         "brand": "Sony",
         "price": 250
       }
     },
     {
       "_index": "products",
       "_id": "5",
       "_score": 0.07893815,
       "_source": {
         "id": "5",
         "name": "Charging Station for DualShock 4",
         "category": "accessory",
         "brand": "Sony",
         "price": 80
       }
     }
   ]
 }
}<p>Vamos criar uma regra de consulta para alterar isso. Primeiro, vamos adicioná-lo ao conjunto de regras assim:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1576d4f4a2e60548/6a170858cdacbfccb07d298d/fdc42646fb3e76a09bca7d19047a76efe343f7a2-1600x650.png" alt="Como editar um conjunto de regras de consulta no Elasticsearch" /><p>Ou <a href="https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-query-rules-put-ruleset">solicitação de API</a> equivalente:</p>PUT _query_rules/my-rules
{
  "rules": [
    {
      "rule_id": "rule-1232",
      "type": "pinned",
      "criteria": [
        {
          "type": "exact",
          "metadata": "query_string",
          "values": [
            "PS4",
            "PlayStation 4"
          ]
        }
      ],
      "actions": {
        "docs": [
          {
            "_index": "products",
            "_id": "2"
          }
        ]
      }
    }
  ]
}<p>Para usar o <strong>conjunto de regras </strong>em nossa consulta, devemos usar um tipo de regra de consulta. Esse tipo de consulta é composto por duas partes principais:</p>GET /products/_search
{
 "retriever": {
   "rule": {
     "retriever": {
       "standard": {
         "query": {
           "match": { "name": "PlayStation 4" }
         }
       }
     },
     "match_criteria": {
       "query_string": "PlayStation 4"
     },
     "ruleset_ids": ["my-rules"]
   }
 }
}<ul><li><p><strong>match_criteria</strong>: São os metadados usados para comparar com a consulta do usuário. Neste exemplo, o conjunto de regras é ativado quando o campo query_string tem o valor “PlayStation 4”.</p></li><li><p><strong>consulta</strong>: a consulta propriamente dita que será usada para pesquisar e obter os resultados orgânicos.</p></li></ul><p>Dessa forma, primeiro você executa a consulta orgânica e, em seguida, o Elasticsearch aplica as regras do seu conjunto de regras:</p>{
 "took": 17,
 "timed_out": false,
 "_shards": {
   "total": 1,
   "successful": 1,
   "skipped": 0,
   "failed": 0
 },
 "hits": {
   "total": {
     "value": 5,
     "relation": "eq"
   },
   "max_score": 1.7014122e+38,
   "hits": [
     {
       "_index": "products",
       "_id": "2",
       "_score": 1.7014122e+38,
       "_source": {
         "id": "2",
         "name": "DualShock 4 Wireless Controller",
         "category": "accessory",
         "brand": "Sony",
         "price": 250
       }
     },
     {
       "_index": "products",
       "_id": "3",
       "_score": 0.6973252,
       "_source": {
         "id": "3",
         "name": "PlayStation 4 Camera",
         "category": "accessory",
         "brand": "Sony",
         "price": 200
       }
     },
     {
       "_index": "products",
       "_id": "1",
       "_score": 0.6260078,
       "_source": {
         "id": "1",
         "name": "PlayStation 4 Slim 1TB",
         "category": "console",
         "brand": "Sony",
         "price": 1200
       }
     },
     {
       "_index": "products",
       "_id": "4",
       "_score": 0.6260078,
       "_source": {
         "id": "4",
         "name": "PlayStation 4 VR Headset",
         "category": "accessory",
         "brand": "Sony",
         "price": 900
       }
     },
     {
       "_index": "products",
       "_id": "5",
       "_score": 0.07893815,
       "_source": {
         "id": "5",
         "name": "Charging Station for DualShock 4",
         "category": "accessory",
         "brand": "Sony",
         "price": 80
       }
     }
   ]
 }
}<h2>Exemplo: metadados baseados no usuário</h2><p>Outra aplicação interessante das Regras de Consulta é usar metadados para exibir documentos específicos com base em informações contextuais do usuário ou da página da web.</p><p>Por exemplo, vamos supor que queremos destacar itens ou ofertas personalizadas com base no nível de fidelidade do usuário, representado por um valor numérico.</p><p>Podemos fazer isso inserindo esses metadados diretamente na consulta, de forma que as regras sejam ativadas quando o valor atender a determinados critérios.</p><p>Primeiro, vamos indexar um documento que somente usuários com um alto nível de fidelidade podem ver:</p>POST _bulk
{ "index": { "_index": "products", "_id": "6" } }
{ "id": "6", "name": "PlayStation Plus Deluxe Card - 12 months", "category": "membership", "brand": "Sony", "price": 300 }<p>Agora, vamos criar uma nova regra dentro do mesmo conjunto de regras para que, quando o nível de lealdade for igual ou superior a 80, o item apareça no topo dos resultados.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt158578005df8c76d/6a17085aab7f086dc0db9de3/58de12dff93305440608f51465462fcc68653a08-1421x496.png" alt="Como editar um conjunto de regras de consulta no Elasticsearch" /><p>Salve a regra e o conjunto de regras.</p><p>Aqui está a solicitação REST equivalente:</p>PUT _query_rules/my-rules
{
  "rules": [
    {
      "rule_id": "pin-premiun-user",
      "type": "pinned",
      "criteria": [
        {
          "type": "gte",
          "metadata": "loyalty_level",
          "values": [
            80
          ]
        }
      ],
      "actions": {
        "docs": [
          {
            "_index": "products",
            "_id": "6"
          }
        ]
      }
    }
  ]
}<p>Agora, ao executar uma consulta, precisamos incluir o novo parâmetro <strong>loyalty_level </strong>nos metadados. Se a condição da regra for atendida, o novo documento aparecerá no topo dos resultados.</p><p>Por exemplo, ao enviar uma consulta onde o nível de lealdade é 80:</p>POST /products/_search
{
  "retriever": {
    "rule": {
      "retriever": {
        "standard": {
          "query": {
            "match": {
              "name": "PlayStation"
            }
          }
        }
      },
      "match_criteria": {
        "query_string": "PlayStation",
        "loyalty_level": 80
      },
      "ruleset_ids": ["my-rules"]
    }
  }
}<p>Veremos o documento de fidelidade acima dos resultados:</p>{
  "took": 31,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 4,
      "relation": "eq"
    },
    "max_score": 1.7014122e+38,
    "hits": [
      {
        "_index": "products",
        "_id": "6",
        "_score": 1.7014122e+38,
        "_source": {
          "id": "6",
          "name": "PlayStation Plus Deluxe Card - 12 months",
          "category": "membership",
          "brand": "Sony",
          "price": 300
        }
      },
      {
        "_index": "products",
        "_id": "3",
        "_score": 0.5054567,
        "_source": {
          "id": "3",
          "name": "PlayStation 4 Camera",
          "category": "accessory",
          "brand": "Sony",
          "price": 200
        }
      },
      {
        "_index": "products",
        "_id": "1",
        "_score": 0.45618832,
        "_source": {
          "id": "1",
          "name": "PlayStation 4 Slim 1TB",
          "category": "console",
          "brand": "Sony",
          "price": 1200
        }
      },
      {
        "_index": "products",
        "_id": "4",
        "_score": 0.45618832,
        "_source": {
          "id": "4",
          "name": "PlayStation 4 VR Headset",
          "category": "accessory",
          "brand": "Sony",
          "price": 900
        }
      }
    ]
  }
}<p>No caso abaixo, como o nível de fidelidade é 70, a regra não é atendida e o item não deve aparecer no topo:</p>POST /products/_search
{
  "retriever": {
    "rule": {
      "retriever": {
        "standard": {
          "query": {
            "match": {
              "name": "PlayStation"
            }
          }
        }
      },
      "match_criteria": {
        "query_string": "PlayStation",
        "loyalty_level": 70
      },
      "ruleset_ids": ["my-rules"]
    }
  }
}<p>Aqui estão os resultados:</p>{
  "took": 7,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 4,
      "relation": "eq"
    },
    "max_score": 0.5054567,
    "hits": [
      {
        "_index": "products",
        "_id": "3",
        "_score": 0.5054567,
        "_source": {
          "id": "3",
          "name": "PlayStation 4 Camera",
          "category": "accessory",
          "brand": "Sony",
          "price": 200
        }
      },
      {
        "_index": "products",
        "_id": "1",
        "_score": 0.45618832,
        "_source": {
          "id": "1",
          "name": "PlayStation 4 Slim 1TB",
          "category": "console",
          "brand": "Sony",
          "price": 1200
        }
      },
      {
        "_index": "products",
        "_id": "4",
        "_score": 0.45618832,
        "_source": {
          "id": "4",
          "name": "PlayStation 4 VR Headset",
          "category": "accessory",
          "brand": "Sony",
          "price": 900
        }
      },
      {
        "_index": "products",
        "_id": "6",
        "_score": 0.3817649,
        "_source": {
          "id": "6",
          "name": "PlayStation Plus Deluxe Card - 12 months",
          "category": "membership",
          "brand": "Sony",
          "price": 300
        }
      }
    ]
  }
}<h2>Exemplo: exclusão imediata</h2><p>Vamos supor que nosso <strong>Controle Sem Fio DualShock 4 (ID 2)</strong> esteja temporariamente indisponível e não possa ser vendido. Assim, em vez de excluir o documento manualmente ou esperar que algum processamento de dados seja iniciado, a equipe comercial decide removê-lo dos resultados da pesquisa enquanto isso.</p><p>Usaremos um processo semelhante ao que acabamos de aplicar aos itens populares, mas desta vez, em vez de selecionar <em>"Fixados"</em>, escolheremos <em>"Excluir"</em>. Essa regra funciona como uma espécie de lista negra. Altere os critérios para <strong>"Sempre"</strong> para que a exclusão funcione sempre que a consulta for executada.</p><p>A regra deve ser assim:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt38564c0b7f4a6ee2/6a17085c1949f78692e7a989/f10971e4f1bc9520105111adfa3a476581a27130-1600x623.png" alt="Exemplo de um conjunto de regras de exclusão imediata no Elasticsearch" /><p>Salve a regra e o conjunto de regras para aplicar as alterações. Aqui está a solicitação REST equivalente:</p>PUT _query_rules/my-rules
{
  "rules": [
    {
      "rule_id": "rule-6358",
      "type": "pinned",
      "criteria": [
        {
          "type": "always"
        }
      ],
      "actions": {
        "docs": [
          {
            "_index": "products",
            "_id": "2"
          }
        ]
      }
    }
  ]
}<p>Agora, ao executar a consulta novamente, você verá que o item não está mais nos resultados, mesmo que a regra anterior fosse fixá-lo. Isso ocorre porque <strong>as exclusões têm prioridade sobre a fixação dos resultados</strong>.</p>{
 "took": 6,
 "timed_out": false,
 "_shards": {
   "total": 1,
   "successful": 1,
   "skipped": 0,
   "failed": 0
 },
 "hits": {
   "total": {
     "value": 4,
     "relation": "eq"
   },
   "max_score": 2.205655,
   "hits": [
     {
       "_index": "products",
       "_id": "3",
       "_score": 2.205655,
       "_source": {
         "id": "3",
         "name": "PlayStation 4 Camera",
         "category": "accessory",
         "brand": "Sony",
         "price": 200
       }
     },
     {
       "_index": "products",
       "_id": "1",
       "_score": 1.9738505,
       "_source": {
         "id": "1",
         "name": "PlayStation 4 Slim 1TB",
         "category": "console",
         "brand": "Sony",
         "price": 1200
       }
     },
     {
       "_index": "products",
       "_id": "4",
       "_score": 1.9738505,
       "_source": {
         "id": "4",
         "name": "PlayStation 4 VR Headset",
         "category": "accessory",
         "brand": "Sony",
         "price": 900
       }
     },
     {
       "_index": "products",
       "_id": "5",
       "_score": 0.69247496,
       "_source": {
         "id": "5",
         "name": "Charging Station for DualShock 4",
         "category": "accessory",
         "brand": "Sony",
         "price": 80
       }
     }
   ]
 }
}<h2>Conclusão</h2><p><strong>As regras de consulta</strong> tornam muito fácil ajustar a relevância sem qualquer alteração de código. A nova <strong>interface</strong> <strong>do Kibana </strong>permite que vocêPara fazer essas alterações em questão de segundos, você e sua equipe terão mais controle sobre os resultados da pesquisa.</p><p>Além do comércio eletrônico, as Regras de Consulta podem ser aplicadas em muitos outros cenários: destacar guias de solução de problemas em portais de suporte, exibir documentos internos importantes em bases de conhecimento, promover notícias de última hora em sites de notícias ou filtrar anúncios de emprego ou conteúdo expirados. Eles podem até mesmo impor regras de conformidade, como ocultar material restrito por função de usuário ou região.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-query-rules-ui-introduction</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-query-rules-ui-introduction</guid>
    <category><![CDATA[Noções básicas]]></category>
    <category><![CDATA[Experiência do Desenvolvedor]]></category>
    <dc:creator><![CDATA[Jhon Guzmán]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt565ed0eb407e098d/6a17085d8b73cb363d189fb1/1fb10bd31c509cc9b9bb4f71f49970f140e6c36f-1600x945.png" length="0" type="image/png"/>
    <pubDate>Fri, 07 Nov 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Como implantar o Elasticsearch no AWS Marketplace]]></title>
    <description><![CDATA[Aprenda como configurar e executar o Elasticsearch usando o Elastic Cloud Service no AWS Marketplace neste guia passo a passo.]]></description>
    <content:encoded><![CDATA[<p>Neste artigo, vamos aprender como implantar o Elasticsearch na AWS usando as ofertas do Marketplace.</p><p>Vamos usar o Elastic Cloud Service na AWS, que é o serviço oficial gerenciado do Elasticsearch Service que simplifica a implantação e orquestração de todos os componentes do Elastic Stack por meio da infraestrutura nativa da AWS.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6c1107b202d48147/6a16f67d92262a04071cc077/f15814051b53b50bec38f9a9f515a1e6dc08a56c-884x440.png" alt="" /><p>Se você quer aprender a instalar e configurar o Elasticsearch na AWS EC2, leia <a href="https://www.elastic.co/search-labs/blog/elasticsearch-on-aws-ec2-deployment-guide">este blog</a>.
</p><h2>O que é o AWS Marketplace?</h2><p><a href="https://aws.amazon.com/marketplace"><strong>Elastic on AWS Marketplace</strong></a> oferece uma experiência de busca e análise totalmente gerenciada, em que a AWS cuida da provisão de infraestrutura, segurança e redimensionamento, enquanto os desenvolvedores se concentram na criação de aplicações de busca. Isso permite que as equipes implantem clusters do Elasticsearch de nível empresarial em minutos com integrações integradas da AWS.</p><h2>Quando usar o Elastic no AWS Marketplace?</h2><p>O Elastic on AWS Marketplace é mais indicado para organizações com infraestrutura AWS existente que buscam implantar o Elasticsearch com serviços gerenciados, security integrado e integrações AWS integradas sem sobrecarga operacional.</p><h2>Como configurar o Elastic Cloud no AWS Marketplace</h2><h3>Passo 1: Acesse o AWS Marketplace</h3><p>1. Faça login no <a href="https://console.aws.com/">AWS</a></p><ul><li><p>Na barra de busca, procure por AWS Marketplace</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd7b4a64a97929ca0/6a16f67e60084b1ee43c4333/fc9928f79482c2c01e33978c88d390a2bfa2a3bf-1600x340.png" alt="" /><p>2. No painel de navegação à esquerda, clique em <strong>Descobrir produtos</strong> e depois busque por Elasticsearch</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta3efc233beb103ab/6a16f680b0367d681572babd/ca4232271cb13ebfe33de406ecaec085033ec8a0-1454x760.png" alt="" /><p>3. Clique em <strong>Elastic Cloud (Elasticsearch Service)</strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd7fe524f5d0cc84e/6a16f682cdacbfabdf7d27c4/e59aa276e55532f2ac3461d0ca983af4d41ad7a6-1600x611.png" alt="" /><h3>Passo 2: Assine o serviço</h3><p>1. Selecione <strong>opções de compra</strong> ou clique em <strong>Experimente gratuitamente</strong></p><p>2. <strong>Revise os detalhes de preços</strong>, <strong>termos e condições</strong> e <strong>detalhes de compra</strong></p><p>3. Clique no botão <strong>Assinar </strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt027c8adb6bfa2b73/6a16f683a292995855d00de4/1c30d12b6b1061e76771d518011e522285f939f1-1600x290.png" alt="" /><p>4. Agora precisamos configurar a conta Elastic. Siga os passos da AWS</p><p>a. Clique no botão Ativar integração</p><p>b. Clique no botão Entrar ou crie uma conta de fornecedor</p><p>c. Clique no botão Executar modelo</p><p>d. Clique no botão Executar software</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4d290ceb4c00c3ca/6a16f685839dfa35f6dcfc9b/879d9f0f01406e1955e1b38a2f6f2192ef040344-852x722.png" alt="" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt20832a47a3a5ce7b/6a16f68767045b0c8b45bf92/fc59be78cf776aa12867f40810598419576cbd39-1600x1143.png" alt="" /><h3>Passo 3. Configure sua nova conta na Elastic</h3><p>1. Crie sua conta Elastic</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2a47e1e23a0be123/6a16f68875879e400ffe15c0/5efeaf0737062a55470b17b67651f220e12183f2-986x905.png" alt="" /><p>2. Valide seu endereço de e-mail</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltaad961a0644018b5/6a16f68a0811ae0734e9feb6/e0cfaac278614e317ce278935040bfa5a58edd13-853x894.png" alt="" /><p>3. Insira seu nome e informações da empresa</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt52f4a502993fa5d4/6a16f68b2b835fb4b9f4afc4/d5658fe66c3b1bcced73e822eae006846f0ddd9e-997x903.png" alt="" /><p>4. Complete uma breve pesquisa da Elastic</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt375dca1904b2f0c1/6a16f68dcdacbf4f8d7d27c8/a3f53c00dadfd22f7d739a920c87d5f387182833-892x805.png" alt="" /><p>5. Selecione a região onde deseja hospedar o Elastic Cloud. Por padrão, sua região AWS real será selecionada</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0c23f8b8b63af517/6a16f68fb0367d6a6072bac1/c1dcdf3bf91c305821daaa25a60aa03be6454c1c-1207x1032.png" alt="" /><p>6. Aguarde o Elastic implantar.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd88a26701fb26db5/6a16f69075879ef0d8fe15cc/50903e57ebea7cc47bdfabf4750b4ba2a7a91148-1370x1266.png" alt="" /><p>7. Sua implantação está conectada à sua assinatura do AWS Marketplace.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt822e8acb553ffac4/6a16f69275879ed57ffe15d0/3bb731e2d5de5053ccecb77e45dbdbcdaf294dba-1600x1288.png" alt="" /><h2>Cancele sua assinatura</h2><p>Para cancelar a sua assinatura</p><p>1. Acesse o <a href="https://console.aws.com/">console da AWS</a></p><p>Busque por AWS Marketplace na barra de pesquisa. Clique em <strong>AWS Marketplace</strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7a19e162d4cb818a/6a16f694839dfa21a6dcfc9f/aeed3d1e67b4cef91934de257a6fd6daa9737a12-1600x554.png" alt="" /><p>2. Clique em <strong>Assinatura do Elastic Cloud</strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta189d9ff9b518243/6a16f695a292991b60d00de8/04e6cc41850226df223dbe2d1b0e4b45265f6c39-1600x564.png" alt="" /><p>3. Clique no botão <strong>Ações</strong> e, em seguida, clique em <strong>Cancelar assinatura</strong>.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt40fc41f3911b8b66/6a16f6971949f70896e7a7a9/e33d334ea6541c637a223de3ebd6209def75a6d3-1600x1039.png" alt="" /><p>4. Confirme o cancelamento e clique em <strong>Sim </strong>e no botão<strong> cancelar assinatura</strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3eb1839197854313/6a16f699ab7f08469fdb9c31/b73b3187168adc7aefdd46f95be33c1bce3da1e4-1103x698.png" alt="" /><p>5. Uma mensagem de confirmação aparecerá no topo da página.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt513bdb916a3bff8e/6a16f69a1949f74c5de7a7ad/c5ba66a23d535e866a8b458e5aca82c5f0b93037-1600x639.png" alt="" /><h2>Próximas etapas</h2><p>Comece sua jornada no Elastic Cloud com um teste gratuito de 7 dias que inclui uma única implantação e três projetos<a href="https://aws.amazon.com/marketplace/pp/prodview-voru33wi6xs7k"> Elastic Cloud (Elasticsearch Service)</a>. Basta fazer login na sua conta AWS e clicar em "Ver Opções de Compra" para começar a usar a Plataforma de IA de Busca da Elastic imediatamente no Elastic<a href="https://aws.amazon.com/marketplace/pp/prodview-voru33wi6xs7k"> Cloud (Elasticsearch Service)</a>. O teste oferece acesso total a soluções de busca, segurança e observabilidade, sem qualquer sobrecarga de gerenciamento de infraestrutura.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/aws-elasticsearch-service-set-up</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/aws-elasticsearch-service-set-up</guid>
    <category><![CDATA[Noções básicas]]></category>
    <dc:creator><![CDATA[Eduard Martin]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltcbf8a044704b64d5/6a16f69ccf4f25d524b2cf3f/a80776d2ef85db26f850d932339fac2d26b90278-1086x620.png" length="0" type="image/png"/>
    <pubDate>Fri, 03 Oct 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Fragmentos e réplicas do Elasticsearch: um guia prático]]></title>
    <description><![CDATA[Domine os conceitos de shards e réplicas do Elasticsearch e aprenda como otimizá-los.]]></description>
    <content:encoded><![CDATA[<p>O Elasticsearch potencializa o Lucene ao construir um sistema distribuído sobre ele, o que resolve os problemas de escalabilidade e tolerância a falhas. Também disponibiliza uma API REST baseada em JSON, tornando a interoperabilidade com outros sistemas muito simples.</p><p>Sistemas distribuídos como o Elasticsearch podem ser muito complexos, com muitos fatores que podem afetar seu desempenho e estabilidade. <strong>Os shards</strong> estão entre os conceitos mais fundamentais do Elasticsearch, e entender como eles funcionam permitirá que você gerencie um cluster Elasticsearch de forma eficaz.</p><p>Este artigo explica o que são shards primários e réplicas, seu impacto em um cluster Elasticsearch e quais ferramentas existem para ajustá-los a diferentes demandas.</p><h2>Entendendo os fragmentos</h2><p>Os dados em um índice Elasticsearch podem crescer a proporções gigantescas. Para manter a organização, cada dado é armazenado em um índice, e os índices são divididos em vários <strong>fragmentos</strong>. Cada fragmento do Elasticsearch é um índice Apache Lucene, sendo que cada índice Lucene individual contém um subconjunto dos documentos presentes no índice do Elasticsearch. Dividir os índices dessa forma mantém o uso de recursos sob controle. Um índice Apache Lucene tem um limite de 2.147.483.519 (2³¹ - 129) documentos.</p><p>Por vezes, os índices precisam ser movidos entre nós para fins de rebalanceamento. Como esse processo pode ser demorado e exigir muitos recursos, os índices não devem crescer demais, o que ajuda a manter o tempo de recuperação em níveis gerenciáveis. Além disso, como os índices são compostos por segmentos do Lucene que precisam ser constantemente mesclados, é importante que os segmentos não fiquem muito grandes. Por esses motivos, o Elasticsearch divide os dados do índice em partes menores e mais gerenciáveis, chamadas de <strong>shards primários</strong>, que podem ser distribuídas mais facilmente por várias máquinas. Os fragmentos <strong>de réplica</strong> são simplesmente uma cópia exata de um fragmento primário correspondente, e abordaremos sua função mais adiante neste artigo.</p><p>Ter o número correto de shards é importante para o desempenho. Portanto, é sensato planejar com antecedência. Quando as consultas são executadas em paralelo em diferentes shards, elas são executadas mais rapidamente do que um índice composto por um único shard, mas somente se cada shard estiver localizado em um nó diferente e houver nós suficientes no cluster. Ao mesmo tempo, porém, os shards consomem memória e espaço em disco, tanto em termos de dados indexados quanto de metadados do cluster. Ter muitos shards (também conhecido como sobresharding) pode tornar as consultas, as solicitações de indexação e as operações de gerenciamento mais lentas, sendo, portanto, fundamental manter o equilíbrio certo.</p><p>O número de shards primários é definido no momento da criação do índice <strong>para aquela instância de índice específica</strong>. Se precisar de um número diferente de shards primários posteriormente, você pode usar as<strong> APIs de redimensionamento</strong> : <a href="https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-indices-split">split</a> (mais shards primários), <a href="https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-indices-shrink">shrink</a> (menos shards primários) ou <a href="https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-indices-clone">clone</a> (o mesmo número de shards primários com novas configurações para réplicas). Essas operações copiam segmentos do Lucene e <strong>evitam uma reindexação completa de todos os documentos</strong>. Ao criar um índice, você pode definir o número de shards primários e de réplicas nas configurações do índice:</p>PUT /sensor
{
   "settings" : {
       "index" : {
           "number_of_shards" : 6,
           "number_of_replicas" : 2
       }
   }
}<p>(Caso não especifique o número de shards ou réplicas, o valor padrão para ambos é 1, a partir do Elasticsearch 7.0). O número ideal de fragmentos deve ser determinado com base na quantidade de dados em um índice. Em geral, <a href="https://www.elastic.co/docs/deploy-manage/production-guidance/optimize-performance/size-shards">um shard ideal deve conter de 10 a 50 GB de dados</a>, com menos de 200 milhões de documentos por shard. Por exemplo, se você espera acumular cerca de 300 GB de logs de aplicativos por dia, ter cerca de 10 shards nesse índice seria razoável, desde que você tenha nós suficientes para hospedá-los.</p><p>Durante sua existência, os fragmentos podem passar por diversos estados, incluindo:</p><ul><li><p><strong>Inicialização:</strong> Estado inicial antes que o fragmento possa ser usado.</p></li><li><p><strong>Iniciado:</strong> Estado em que o fragmento está ativo e pode receber solicitações.</p></li><li><p><strong>Relocação:</strong> Estado que ocorre quando os fragmentos estão em processo de serem movidos para um nó diferente. Isso pode ser necessário em certas condições, por exemplo, quando o nó em que estão instalados está ficando sem espaço em disco.</p></li><li><p><strong>Não atribuído:</strong> O estado de um fragmento que não pôde ser atribuído. Quando isso acontece, é apresentada uma justificativa, por exemplo, se o nó que hospeda o shard não estiver mais no cluster <em>(NODE_LEFT)</em> ou devido à restauração em um índice fechado <em>(EXISTING_INDEX_RESTORED).</em></p></li></ul><p>Para visualizar todos os fragmentos (shards), seus estados e outros metadados, você pode usar a seguinte solicitação:</p>GET _cat/shards<p>Para visualizar os fragmentos de um índice específico, você pode adicionar o nome do índice à URL, por exemplo, sensor:</p>GET _cat/shards/sensor<p>Este comando produz uma saída, como no exemplo a seguir. Por padrão, as colunas exibidas incluem o nome do índice, o nome (ou seja, número) do fragmento, se é um fragmento primário ou uma réplica, seu estado, o número de documentos, o tamanho em disco, bem como o endereço IP e o ID do nó onde o fragmento está localizado.</p>sensor 5 p STARTED    0  283b 127.0.0.1 ziap
sensor 5 r UNASSIGNED                  
sensor 2 p STARTED    1 3.7kb 127.0.0.1 ziap
sensor 2 r UNASSIGNED                  
sensor 3 p STARTED    3 7.2kb 127.0.0.1 ziap
sensor 3 r UNASSIGNED                  
sensor 1 p STARTED    1 3.7kb 127.0.0.1 ziap
sensor 1 r UNASSIGNED                  
sensor 4 p STARTED    2 3.8kb 127.0.0.1 ziap
sensor 4 r UNASSIGNED                  
sensor 0 p STARTED    0  283b 127.0.0.1 ziap
sensor 0 r UNASSIGNED<h2>Entendendo as réplicas</h2><p>Embora cada fragmento contenha uma única cópia dos dados, um índice pode conter várias cópias do fragmento. Existem, portanto, dois tipos de fragmentos: o <strong>fragmento primário</strong> e uma cópia, ou <strong>réplica</strong>. Cada réplica de um shard primário está sempre localizada em um nó diferente, o que garante alta disponibilidade dos seus dados em caso de falha de um nó. Além da redundância e de seu papel na prevenção de perda de dados e tempo de inatividade, as réplicas também podem ajudar a melhorar o desempenho da pesquisa, permitindo que as consultas sejam processadas em paralelo com o shard primário e, portanto, mais rapidamente.</p><p>Existem algumas diferenças importantes no comportamento dos fragmentos primários e das réplicas. Embora ambos sejam capazes de processar consultas, solicitações de indexação (ou seja, A adição de dados ao índice deve primeiro passar pelos shards primários antes de poder ser replicada para os shards de réplica. Conforme mencionado acima, se um shard primário ficar indisponível — por exemplo, devido à desconexão de um nó ou falha de hardware — uma réplica é promovida para assumir sua função.</p><p>Embora as réplicas possam ajudar em caso de falha de um nó, é importante não ter muitas delas, pois consomem memória, espaço em disco e poder computacional durante a indexação. Outra diferença entre os shards primários e as réplicas é que, enquanto o número de shards primários não pode ser alterado após a criação do índice, o número de réplicas pode ser alterado dinamicamente a qualquer momento, atualizando as configurações do índice.</p><p>Outro fator a ser considerado com réplicas é o número de nós disponíveis. As réplicas são sempre colocadas em nós diferentes do shard primário, uma vez que duas cópias dos mesmos dados no mesmo nó não ofereceriam proteção caso o nó falhasse. Consequentemente, para que um sistema suporte <em>n</em> réplicas, é necessário que haja pelo menos <em>n + 1</em> nós no cluster. Por exemplo, se houver dois nós em um cluster e um índice estiver configurado com seis réplicas, apenas uma réplica será alocada. Por outro lado, um sistema com sete nós é perfeitamente capaz de lidar com um shard primário e seis réplicas.</p><h2>Otimizando fragmentos e réplicas</h2><p>Mesmo após a criação de um índice com o equilíbrio correto entre shards primários e réplicas, é necessário monitorá-lo, pois a dinâmica em torno de um índice muda ao longo do tempo. Por exemplo, ao lidar com dados de séries temporais, os índices com dados recentes são geralmente mais ativos do que os mais antigos. Sem ajustar esses índices, todos eles consumiriam a mesma quantidade de recursos, apesar de suas necessidades serem muito diferentes.</p><p>A API de índice de rollover pode ser usada para separar índices mais recentes de índices mais antigos. É possível configurá-lo para criar automaticamente um novo índice quando um determinado limite — como o tamanho do índice no disco, o número de documentos ou sua idade — for atingido. Essa API também é útil para manter o tamanho dos fragmentos sob controle. Como o número de fragmentos não pode ser facilmente alterado após a criação do índice, os fragmentos continuarão acumulando dados se nenhuma condição de rollover for atendida. Para índices mais antigos que exigem acesso pouco frequente, reduzir o tamanho e forçar a fusão de um índice são duas maneiras diferentes de diminuir o espaço ocupado na memória e no disco. O primeiro reduz o número de fragmentos em um índice, enquanto o segundo reduz o número de segmentos do Lucene e libera espaço usado por documentos que foram excluídos.</p><h2>Fragmentos primários e réplicas como base do Elasticsearch</h2><p>O Elasticsearch construiu uma sólida reputação como plataforma distribuída de armazenamento, busca e análise para grandes volumes de dados. Ao operar em tal escala, porém, desafios inevitavelmente surgirão. Por isso, entender como funcionam os shards primários e de réplica é tão importante e fundamental para o Elasticsearch, pois isso pode ajudar a otimizar a confiabilidade e o desempenho da plataforma.</p><p>Saber como funcionam e como otimizá-los é fundamental para obter um cluster Elasticsearch mais robusto e com melhor desempenho. Se você está enfrentando lentidão nas respostas às consultas ou interrupções frequentes, esse conhecimento pode ser a chave para superar esses obstáculos.</p><p>Siga a documentação oficial do Elasticsearch para saber mais sobre <a href="https://www.elastic.co/docs/deploy-manage/distributed-architecture/clusters-nodes-shards">clusters, nós e shards</a>, <a href="https://www.elastic.co/docs/deploy-manage/production-guidance/optimize-performance/size-shards">como dimensionar seus shards</a>, <a href="https://www.elastic.co/docs/deploy-manage/distributed-architecture/shard-allocation-relocation-recovery">alocação de shards e recuperação</a>.</p><p>Este tópico também está disponível como um curso introdutório no <a href="https://youtu.be/sAySPSyL2qE">canal da comunidade Elastic no YouTube.</a></p><p>Por último, mas não menos importante: se você não quiser se preocupar com nós, shards ou réplicas, pode experimentar o <a href="https://www.elastic.co/docs/deploy-manage/deploy/elastic-cloud/serverless">Elastic Cloud Serverless</a>. Esta oferta da Elastic Cloud é totalmente gerenciada pela Elastic e automatizada para escalar de acordo com sua carga de trabalho. Um período de teste gratuito pode ajudá-lo a se familiarizar com outros benefícios da abordagem sem servidor.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-shards-and-replicas-guide</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-shards-and-replicas-guide</guid>
    <category><![CDATA[Noções básicas]]></category>
    <dc:creator><![CDATA[Piotr Przybyl]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt71dd92d939d383a2/6a17e9d53e03d769c44f2cc7/7775c44f01f2516c4ff4cce6d6bbe9e7b2c38908-720x420.jpg" length="0" type="image/jpeg"/>
    <pubDate>Thu, 14 Aug 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Revelando padrões únicos: um guia para agregação de termos relevantes no Elasticsearch.]]></title>
    <description><![CDATA[Aprenda a usar o importante termo "agregação" para descobrir insights em seus dados.]]></description>
    <content:encoded><![CDATA[<p>No Elasticsearch, a <a href="https://www.elastic.co/docs/reference/aggregations/search-aggregations-bucket-significantterms-aggregation">agregação de termos significativos</a> vai além dos <a href="https://www.elastic.co/docs/reference/aggregations/search-aggregations-bucket-terms-aggregation">termos mais comuns</a> para encontrar valores estatisticamente incomuns em um conjunto de dados. Isso nos permite descobrir informações valiosas e padrões não óbvios. Uma agregação de termos significativos fornece uma resposta com dois parâmetros úteis:</p><ul><li><p><strong>bg_count (contagem de fundo): </strong>Número de documentos encontrados no conjunto de dados original</p></li><li><p><strong>doc_count:</strong> Número de documentos encontrados no conjunto de dados resultante.</p></li></ul><p>Por exemplo, em um conjunto de dados de vendas de telefones celulares, podemos procurar termos significativos nas vendas do iPhone 16, como este:</p>GET phone_sales_analysis/_search
{
 "size": 0,
 "query": {
   "term": {
     "phone_model": {
       "value": "iPhone 16"
     }
   }
 },
 "aggs": {
   "significant_cities": {
     "significant_terms": {
       "field": "city_region",
       "size": 1
     }
   }
 }
}<p>Então, a resposta nos dá:</p>{
 "aggregations": {
   "significant_cities": {
     "doc_count": 122,
     "bg_count": 424,
     "buckets": [
       {
         "key": "Houston",
         "doc_count": 12,
         "score": 0.1946481360617346,
         "bg_count": 14
       }

     ]
   }
 }
}<p>Houston não está entre as 10 principais cidades em todo o conjunto de dados, nem é a principal cidade para o iPhone 16. No entanto, a análise de agregação de termos relevantes mostrou que o<em><strong> iPhone 16 está sendo comprado de forma desproporcional nesta cidade</strong></em> em comparação com o restante dos dados. Vamos analisar os números mais detalhadamente:</p><ul><li><p><strong>No nível mais alto:</strong></p><ul><li><p><strong>doc_count: 122 — </strong>A consulta encontrou um total de 122 documentos.</p></li><li><p><strong>bg_count: 424 — </strong>O conjunto de fundo (todos os documentos de vendas) contém 424 documentos.</p></li></ul></li><li><p><strong>Na cesta de Houston:</strong></p><ul><li><p><strong>doc_count: 12 — </strong>Houston aparece em 12 dos 122 resultados da consulta</p></li><li><p><strong>contagem_de_fundo: 14 — </strong>Houston aparece em 14 dos 424 documentos totais no conjunto de dados de fundo.</p></li></ul></li></ul><p>Isso nos indica que, de um total de 424 compras, apenas 14 ocorreram em Houston; ou seja, 3,3% do total de compras. No entanto, se analisarmos apenas as vendas do iPhone 16, veremos que 12 das 122 unidades foram vendidas em Houston, o que representa 9,8%, três vezes mais do que em todo o conjunto de dados; isso é significativo!</p><p>Veja como isso se apresenta em uma visualização: Total de vendas por cidade/região.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blted1af6606708267e/6a17f5d614800960e1b488d5/f31335b0b7793650025f941820f238dd35bfb09f-1486x1066.png" alt="" /><p>Podemos ver que houve 14 vendas em Houston, o que a torna a 14ª cidade com maior número de vendas no conjunto de dados.</p><p>Agora, se aplicarmos um filtro para analisar apenas as vendas do iPhone 16, temos 12 vendas em Houston, tornando-a a segunda cidade com o maior número de vendas desse modelo específico:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd2882d5e87d02406/6a17f5d71d1b83851e93e5b2/6516040db77e6c62af5541a74c723b18008ad3c6-1472x1038.png" alt="" /><h2>Compreendendo os termos significativos de agregação</h2><p>De acordo com a documentação da Elastic, os <a href="https://www.elastic.co/docs/reference/aggregations/search-aggregations-bucket-significantterms-aggregation">termos significativos de agregação</a> são:</p><p><em>"(Encontra) termos que sofreram uma mudança significativa na popularidade, medida entre um conjunto de primeiro plano e um conjunto de segundo plano."</em></p><p>Isso significa que utiliza métricas estatísticas para comparar a frequência de um termo em um subconjunto de dados (o conjunto de primeiro plano) com a frequência do mesmo termo no conjunto de dados principal (o conjunto de fundo). Dessa forma, a pontuação reflete a significância estatística em vez da frequência com que um termo aparece nos dados.</p><p>As principais diferenças entre uma agregação de termos significativos e uma agregação de termos normais são:</p><ul><li><p>A comparação de termos significativos analisa um subconjunto dos dados, enquanto a agregação de termos funciona apenas com o conjunto de dados resultante da consulta.</p></li><li><p>Os resultados da agregação de termos mostram os termos mais comuns no conjunto de dados, enquanto os resultados da análise de termos significativos ignoram os termos comuns para encontrar o que torna o conjunto de dados único.</p></li><li><p>Termos significativos podem ter um impacto maior no desempenho, visto que precisam obter dados do disco em vez da memória, como faz a agregação de termos.</p></li></ul><h2>Aplicação prática (análise do comportamento do consumidor)</h2><h3>Preparando os dados para a análise.</h3><p>Para esta análise, geramos um conjunto de dados sintéticos de vendas de telefones celulares, incluindo preço, especificações do aparelho, dados demográficos do comprador e avaliações. Também geramos embeddings a partir do feedback do usuário para podermos executar uma consulta semântica posteriormente. Utilizamos o <a href="https://huggingface.co/intfloat/multilingual-e5-small">modelo multilíngue e5 small</a>, disponível imediatamente no Elasticsearch.</p><p></p><p>Para usar este conjunto de dados no Elasticsearch:</p><ol><li><p>Faça o upload do arquivo CSV (disponível para download <a href="https://github.com/Alex1795/significant_terms_blog_dataset/blob/main/phone_sales_analysis_dataset.csv">aqui</a>) usando o recurso <a href="https://www.elastic.co/docs/manage-data/ingest/upload-data-files">"Carregar arquivos de dados"</a> do Kibana.</p></li><li><p>Configure um campo semântico, como mostrado <a href="https://www.elastic.co/search-labs/blog/chat-with-pdf-elastic-playground#upload-pdfs-to-kibana">neste blog,</a> chamado "embedding", que utiliza o <code>multilingual-e5-small model</code></p></li><li><p>Finalize a importação com os valores padrão do tipo de campo (palavra-chave para todos os campos, exceto <code>purchase_date</code> e <code>user_feedback)</code>. Certifique-se de adicionar o nome do índice <code>phone_sales_analysis</code> para poder executar as consultas apresentadas aqui como estão.</p></li></ol><p>O principal objetivo desta análise é descobrir <em><strong>"O que diferencia os compradores do iPhone 16 de outros segmentos da população?</strong></em> " e obter uma segmentação desses compradores para fins de marketing. </p><p>Este é um documento de exemplo do conjunto de dados:</p>{
         "customer_type": "Returning",
         "user_feedback": "I have to say, quality is great for the price. The battery life is really good.",
         "upgrade_frequency": "2 years",
         "storage_capacity": "256GB",
         "occupation": "Technology &amp; Data",
         "color": "Phantom Black",
         "gender": "Male",
         "price_paid": 899,
         "previous_brand_loyalty": "Mixed",
         "location_type": "Urban",
         "phone_model": "Samsung Galaxy S24",
         "city_region": "San Francisco Bay Area",
         "@timestamp": "2024-03-15T00:00:00.000-05:00",
         "income_bracket": "75000-100000",
         "purchase_channel": "Online",
         "feedback_sentiment": "positive",
         "education_level": "Bachelor",
         "embedding": "I have to say, quality is great for the price. The battery life is really good.",
         "customer_id": "C001",
         "purchase_date": "2024-03-15",
         "age": 34,
         "trade_in_model": "iPhone 13"
}<h3>Compreendendo os padrões demográficos</h3><p>Aqui, vamos realizar uma análise na população em geral e compará-la com descobertas interessantes das agregações de termos significativos para usuários do iPhone 16.</p><h4>Padrões normais</h4><p>Para entender os padrões normais de compra, podemos agregar dados de todos os documentos em diferentes áreas. Para simplificar, vamos nos concentrar em explorar as ocupações das pessoas que compraram um telefone. Podemos fazer isso com uma solicitação ao Elasticsearch.</p>GET phone_sales_analysis/_search
{
 "aggs": {
   "occupation_distribution": {
     "terms": {
       "size": 5,
       "field": "occupation"
     }
   }
 },
 "size": 0
}<p>Isso nos indica que as principais ocupações no conjunto de dados (por número de registros) são:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltec11e3ae5b9cb3c0/6a17f5d9505ac3f28aad8cba/99136ddddd7abad5d74481158a04501b6915441b-1518x480.png" alt="" /><h4>Padrões de usuários do iPhone 16</h4><p>Para entender o que diferencia as pessoas que compraram um iPhone 16, vamos executar uma agregação de termos no mesmo campo com um filtro para encontrar essas pessoas na consulta, assim:</p>GET phone_sales_analysis/_search
{
  "query": {
    "term": {
      "phone_model": "iPhone 16"
    }
  },
  "aggs": {
    "occupation_distribution": {
      "terms": {
        "size": 5,
        "field": "occupation"
      }
    }
  },
  "size": 0
}<p>Assim, para os usuários do iPhone 16, as principais funções são:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt26a5415e2f30d164/6a17f5da445de9637a4d028a/36ce86475beb03810c6ad81d7c776d1eec736654-1500x484.png" alt="" /><p>Podemos observar que os usuários do iPhone 16 apresentam padrões de ocupação diferentes em comparação com os usuários de outros modelos de telefone. Vamos usar o Kibana para visualizar os resultados com facilidade:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4e0ddb09fe58e454/6a17f5dce317912cfa2d596b/b70ab05bc962a274e1617b6caf20575c489a62d8-1448x1128.png" alt="" /><p></p><p>Neste gráfico, podemos ver que a tendência do iPhone 16 é diferente da tendência da população em geral.</p><p>Podemos pular toda essa análise e ver o que diferencia os usuários do iPhone 16 da população em geral, executando uma agregação de termos significativos:</p>GET phone_sales_analysis/_search
{
  "query": {
    "term": {
      "phone_model": "iPhone 16"
    }
  },
  "aggs": {
    "occupation_distribution": {
      "significant_terms": {
        "size": 5,
        "field": "occupation"
      }
    }
  },
  "size": 0
}<p>Resumindo, obtemos esta resposta:</p><p>Valores das ocupações para o iPhone 16</p><p>contagem de documentos</p><p>contagem de fundo</p><p>distribuição_de_ocupações (nível superior)</p><p>122</p><p>424</p><p>Categoria Médica e de Saúde</p><p>45</p><p>57</p><p>A resposta sugere claramente que os usuários do iPhone 16 têm uma característica incomum (leia-se significativa!). Número de pessoas na área médica e de saúde em comparação com a população em geral. Vamos analisar o que os números na resposta significam:</p><ul><li><p><strong>No nível mais alto:</strong></p><ul><li><p><strong>doc_count: 122 — </strong>A consulta encontrou um total de 122 documentos.</p></li><li><p><strong>bg_count: 424 — </strong>O conjunto de fundo (todos os documentos de vendas) contém 424 documentos.</p></li></ul></li><li><p><strong>Na categoria Medicina e Saúde:</strong></p><ul><li><p><strong>doc_count: 45 — </strong>"Medicina e Saúde" aparece em 45 dos 122 resultados da consulta</p></li><li><p><strong>bg_count: 57 — </strong>"Medical &amp; Healthcare" aparece em 57 dos 424 documentos totais no conjunto de dados de fundo.</p></li></ul></li></ul><p>Dos 424 compradores, 57 trabalham na área médica e de saúde — ou seja, 13,44%. Mas quando analisamos os compradores do iPhone 16, 45 de 122 trabalham na área médica e de saúde — ou seja, 36,88%. Isso significa que temos o dobro de probabilidade de encontrar alguém que trabalhe na área médica e de saúde entre os usuários do iPhone 16!</p><p>Podemos aplicar essa mesma análise a outros campos (idade, localização, faixa de renda, etc.) para encontrar mais informações sobre o que torna os usuários do iPhone 16 únicos. </p><h3>Segmentação de consumidores</h3><p>Podemos usar o conceito de agregação para extrair informações sobre as relações entre produtos, categorias e segmentos de clientes. Para isso, construímos uma agregação principal para a categoria que temos interesse em explorar. Também utilizamos uma subagregação de termos significativos e uma subagregação de termos normais para encontrar informações interessantes sobre essa categoria e compará-las com o que a maioria das pessoas nessa profissão utiliza.</p><p>Por exemplo, vejamos o que as pessoas em algumas áreas de trabalho preferem:</p><ol><li><p>Para tornar a análise mais clara, vamos limitar nossa busca a 3 áreas de atuação: ["Administrativo e Suporte", "Tecnologia e Dados", "Médico e Saúde"]</p></li><li><p>No que diz respeito às agregações, começamos com uma agregação de termos por ocupação.</p></li><li><p>Adicione uma subagregação: termos por modelo de telefone — para descobrir quais modelos os usuários que trabalham em cada área estão comprando.</p></li><li><p>Adicione uma segunda subagregação: termos significativos por modelos telefônicos — para descobrir quais modelos são específicos em cada área de atuação.</p></li></ol>GET phone_sales_analysis/_search
{
 "query": {
   "terms": {
     "occupation": [
       "Administrative &amp; Support",
       "Technology &amp; Data",
       "Medical &amp; Healthcare"
     ]
   }
 },
 "aggs": {
   "occupations": {
     "terms": {
       "size": 15,
       "field": "occupation"
     },
     "aggs": {
       "general_models": {
         "terms": {
           "field": "phone_model"
         }
       },
       "significant_models": {
         "significant_terms": {
           "field": "phone_model"
         }
       }
     }
   }
 },
 "size": 0
}<p>Vamos analisar os resultados da agregação:</p><p><strong>Ocupação</strong>: Administrativo e de Apoio</p><p><strong>Agregação de termos</strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3a325cde37b40504/6a17f5dd4b055dbb68432372/a4ad519c9013867a3f4cee032160eadd8a47804a-1506x398.png" alt="" /><p><strong>Agregação de termos significativos</strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltef514b8bbb7f429c/6a17f5df3e9e456488ba1612/e5604fa8036667bdfe733576a5e7c6153760dd3a-306x220.png" alt="" /><p>A partir desta tabela, podemos inferir que não existem diferenças significativas entre a tendência para esta ocupação e a tendência para toda a população.</p><p><strong>Área de atuação</strong>: Tecnologia e Dados</p><p><strong>Agregação de termos</strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt94189446d8f3100e/6a17f5e142022983b029f76e/13b09039bb7d183276451007d2d69dc190b1d3c0-1508x836.png" alt="" /><p></p><p><strong>Agregação de termos significativos</strong></p><p>Total de documentos: 424</p><p>Documentos nesta ocupação: 71</p><p>modelo de telefone</p><p>contagem de documentos (este modelo nesta ocupação)</p><p>contagem de fundo (este modelo em todos os documentos)</p><p>% em todos os documentos</p><p>% nesta ocupação</p><p>Google Pixel 8</p><p>12</p><p>22</p><p>5,19%</p><p>16,90%</p><p>OnePlus 11</p><p>9</p><p>14</p><p>3,30%</p><p>12,68%</p><p>OnePlus 12 Pro</p><p>3</p><p>3</p><p>0,71%</p><p>4,23%</p><p>Google Pixel 8 Pro</p><p>9</p><p>21</p><p>4,95%</p><p>12,68%</p><p>Nada Telefone 2</p><p>5</p><p>8</p><p>1,89%</p><p>7,04%</p><p>Samsung Galaxy Z Fold5</p><p>4</p><p>6</p><p>1,42%</p><p>5,63%</p><p>OnePlus 12</p><p>8</p><p>20</p><p>4,72%</p><p>11,27%</p><p><strong>Área de atuação</strong>: Medicina e Saúde</p><p><strong>Agregação de termos</strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt270b0a861a16488a/6a17f5e23e03d76a934f2df0/b008e996742fc0bb48dc6bacff17cfbc56cf0d73-1492x398.png" alt="" /><p><strong>Agregação de termos significativos</strong></p><p>Total de documentos: 424</p><p>Documentos nesta ocupação: 57</p><p>modelo de telefone</p><p>contagem de documentos (este modelo nesta ocupação)</p><p>contagem de fundo (este modelo em todos os documentos)</p><p>% em todos os documentos</p><p>% nesta ocupação</p><p>iPhone 16</p><p>45</p><p>122</p><p>28,77%</p><p>78,95%</p><p>iPhone 15 Pro Max</p><p>3</p><p>13</p><p>3,07%</p><p>5,26%</p><p>iPhone 15</p><p>7</p><p>40</p><p>9,43%</p><p>12,28%</p><p>Vejamos o que esses dados nos contam:</p><ul><li><p>Profissionais da área médica e de saúde preferem o iPhone 16 e, de modo geral, são muito inclinados a usar telefones da Apple.</p></li><li><p>Profissionais de tecnologia e dados preferem celulares Android de última geração, mas não necessariamente usam a marca Samsung. Existe também uma tendência considerável para iPhones nesta categoria.</p></li><li><p>Profissionais administrativos e de suporte preferem celulares Samsung e Google, mas não há uma tendência forte e única entre eles.</p></li></ul><h3>Agregação de termos relevantes e busca híbrida</h3><p>A busca híbrida combina a busca por texto com resultados semânticos para proporcionar uma experiência de busca aprimorada. Nesse contexto, uma agregação de termos significativa pode fornecer insights sobre os resultados de uma busca contextualizada, respondendo à pergunta: <strong>O que torna este conjunto de dados especial em comparação com todos os outros documentos?</strong>Para demonstrar essa funcionalidade, vejamos quais modelos são mais frequentes quando os usuários mencionam um bom desempenho: </p><ul><li><p>Vamos construir uma consulta semântica onde encontramos o feedback de usuário mais relevante para a entrada "bom desempenho" no campo de incorporação.</p></li><li><p>Também utilizaremos uma pesquisa de texto com os mesmos termos no campo de texto user_feedback.</p></li><li><p>Também adicionaremos uma consulta de termos relevantes para encontrar modelos de telefone que sejam mais frequentes nesses resultados do que no conjunto de dados completo.
</p></li></ul>GET phone_sales_analysis/_search
{
 "retriever": {
   "rrf": {
     "retrievers": [
       {
         "standard": {
           "query": {
             "bool": {
               "must": [
                 {
                   "match": {
                     "user_feedback": {
                       "query": "good performance",
                       "operator": "and"
                     }
                   }
                 }
               ]
             }
           }
         }
       },
       {
         "standard": {
           "query": {
             "semantic": {
               "field": "embedding",
               "query": "good performance"
             }
           }
         }
       }
     ],
    "rank_window_size": 20
   }
 },
 "aggs": {
   "Models": {
     "significant_terms": {
       "field": "phone_model"
     }
   }
 }
}<p>Vejamos um exemplo dos documentos correspondentes:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1c3dc221896c8832/6a17f5e4445de91eac4d028e/4cb488097a382f0c28c21540db4f593d23633473-1600x162.png" alt="" /><p>Esta é a resposta que recebemos:</p>{
  "took": 388,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 20,
      "relation": "eq"
    },
    "max_score": 0.016393442,
    "hits": [...]
  },
  "aggregations": {
    "Models": {
      "doc_count": 20,
      "bg_count": 424,
      "buckets": [
        {
          "key": "iPhone 15",
          "doc_count": 5,
          "score": 0.4125,
          "bg_count": 40
        }
      ]
    }
  }
}<p></p><p>Isso nos mostra que, embora o iPhone 15 seja encontrado 40 vezes em um total de 424 documentos (9,4% dos documentos), ele aparece 5 vezes nos 20 documentos que corresponderam à busca semântica "bom desempenho" (25% dos documentos). Assim, podemos concluir que: a probabilidade de um iPhone 15 ser mencionado como tendo um bom desempenho é 2,7 vezes maior do que por acaso.</p><h2>Conclusão</h2><p>A agregação de termos relevantes pode revelar detalhes únicos de um conjunto de dados, comparando-o com o universo de documentos. Isso pode revelar relações inesperadas em nossos dados, indo além da contagem de ocorrências. Podemos aplicar termos significativos em diversos casos de uso que possibilitam funcionalidades muito interessantes, por exemplo:</p><ul><li><p><a href="https://www.elastic.co/blog/significant-terms-aggregation#credit">Ao trabalhar na detecção de fraudes, procure padrões </a>— identifique transações comuns em cartões de crédito roubados.</p></li><li><p>Análises da qualidade da marca a partir de avaliações de usuários — identifique uma marca com um número desproporcional de avaliações negativas.</p></li><li><p><a href="https://www.elastic.co/docs/reference/aggregations/search-aggregations-bucket-significantterms-aggregation#_use_on_free_text_fields">Identificar </a>documentos classificados incorretamente — identificar documentos que pertencem a uma categoria (filtro de termos) e que usam palavras incomuns para essa categoria em sua descrição (agregação de termos relevantes).</p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/significant-terms-aggregation-elasticsearch</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/significant-terms-aggregation-elasticsearch</guid>
    <category><![CDATA[Noções básicas]]></category>
    <category><![CDATA[DSL de consulta]]></category>
    <dc:creator><![CDATA[Alexander Dávila]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta4d95b6134c2a110/6a17f5e6505ac3fd3cad8cbf/13adbc901837835bb56abf15e377127b017cfac8-1536x1024.png" length="0" type="image/png"/>
    <pubDate>Mon, 07 Jul 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Como implantar o Elasticsearch no GCP GKE Autopilot]]></title>
    <description><![CDATA[Aprenda como implantar um cluster Elasticsearch no GCP usando o GKE Autopilot e o ECK para uma configuração parcialmente gerenciada do Elasticsearch.]]></description>
    <content:encoded><![CDATA[<p>Neste artigo, vamos aprender como implantar o Elasticsearch no Google Cloud Kubernetes (GKE) usando o Autopilot.</p><p>Para o Elasticsearch, usaremos <a href="https://www.elastic.co/docs/deploy-manage/deploy/cloud-on-k8s">Elastic Cloud on Kubernetes </a>(ECK), que é o operador oficial do Elasticsearch para Kubernetes e simplifica a orquestração de implantações do Kubernetes de todos os componentes do Elastic Stack.</p><p>Para saber mais sobre como implantar clusters do Elasticsearch em diferentes infraestruturas do GCP, você pode ler nossos artigos de introdução ao <a href="https://www.elastic.co/search-labs/blog/elasticsearch-gpc-google-compute-engine">Google Cloud Compute</a> e <a href="https://www.elastic.co/search-labs/blog/deploy-elastic-gcp-marketplace">Google Cloud Marketplace</a>.</p><h2>Esforço de implantação do Elasticsearch</h2><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt61969357430c94f8/6a17f6d125daab024708a3ae/56b54d718dcff9af9050873c41fdf738074851da-1428x582.png" alt="Esforço de implantação do ECK do Elasticsearch." /><h3>O que é o GKE Autopilot?</h3><p>O <a href="https://cloud.google.com/kubernetes-engine/docs/concepts/autopilot-overview?hl=es-419"><strong>Google Kubernetes Engine (GKE) Autopilot</strong></a> oferece uma experiência Kubernetes totalmente gerenciada, na qual o Google cuida da configuração do cluster, do gerenciamento de nós, da segurança e do redimensionamento, enquanto os desenvolvedores se concentram na implantação de aplicativos, permitindo que as equipes passem do código à produção em minutos com as práticas recomendadas integradas.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt91e10f44290aeac4/6a17f6d33e9e451f67ba1638/bbf6de63fa0a199326352f521cb22654818799f6-1600x958.png" alt="Contêineres do GKE Autopilot." /><h2>Quando usar o ECK no Google Cloud?</h2><p>O Elastic Cloud on Kubernetes (ECK) é mais indicado para organizações com infraestrutura Kubernetes existente que desejam implantar o Elasticsearch com recursos avançados, como funções dedicadas para nós, alta disponibilidade e automação.</p><h2>Como configurar o ECK na Google Cloud?</h2><p>1. Faça login no <a href="https://console.cloud.google.com">Google Cloud Console</a>.</p><p>2. No <strong>canto superior direito </strong>, cliqueno botão <strong>Cloud Shell</strong> para acessar o console e implantar o cluster GKE a partir daí. Alternativamente, você pode usar o <a href="https://cloud.google.com/cli">gcloud CLI</a>.</p><p><em><strong>Lembre-se de atualizar o id do projeto com o seu durante o tutorial.</strong></em></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc69e47bf97e4be31/6a17f6d5505ac3bbe6ad8cdb/999b03861d4fe44f360ab4c7e2616e1dc10cf182-1558x1248.png" alt="Como configurar o Elasticsearch no GKE Autopilot da GCP." /><p>3. Ative a <a href="https://console.cloud.google.com/flows/enableapi?apiid=container.googleapis.com">Google Kubernetes Engine API</a>.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1a4d95465f563ece/6a17f6d7e8fbced6393a1af3/03827d3dc0e987c019e7747d33e7c01920047beb-911x246.png" alt="Ativando a API do Google Kubernetes Engine." /><p>Clique em <em><strong>Avançar.</strong></em></p><p>Agora, a API do Kubernetes Engine deve aparecer como habilitada ao pesquisar pela API do Kubernetes Engine.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6ba41b82d995347f/6a17f6d8505ac3036bad8cdf/d5cd46f0333086bcb31b80cf9c08a469b449ec0f-640x250.png" alt="A API do Kubernetes Engine." /><p>4. No Cloud Shell, crie um cluster Autopilot. Vamos chamá-lo de autopilot-cluster-1 e também substituir autopilot-test pelo id do seu projeto.</p>gcloud beta container --project "autopilot-test-457216" clusters create-auto "autopilot-cluster-1" --region "us-central1" --release-channel "regular" --tier "standard" --enable-ip-access --no-enable-google-cloud-access --network "projects/autopilot-test-457216/global/networks/default" --subnetwork "projects/autopilot-test-457216/regions/us-central1/subnetworks/default" --cluster-ipv4-cidr "/17" --binauthz-evaluation-mode=DISABLED<p>5. Espere até que esteja pronto. Leva cerca de 10 minutos para ser criado.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4e821e77d5db5d71/6a17f6da148009381cb48900/81fbc45ba56d0f16ba42724cb8ae45e60b327dbc-1581x258.png" alt="Imagem de um conjunto de clusters Autopilot." /><p>Uma mensagem de confirmação será exibida após a configuração correta do cluster.</p><p>6. Configure o acesso na linha de comando do kubectl.</p>gcloud container clusters get-credentials autopilot-cluster-1 --region us-central1 --project autopilot-test-457216<p>Você deverá ver:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf1c828e5059c8ec8/6a17f6dcabe0f215e5dfebb7/b0beba1ee00ce9029f586ee32693fc2aa58c7f65-3442x142.png" alt="" /><p><em>Entrada kubeconfig gerada para autopilot-cluster-1.</em></p><p>7. Instale o operador <a href="https://www.elastic.co/docs/deploy-manage/deploy/cloud-on-k8s">Elastic Cloud on Kubernetes</a> (ECK).</p># Install ECK Custom Resource Definitions
kubectl create -f https://download.elastic.co/downloads/eck/2.16.1/crds.yaml

# Install the ECK operator
kubectl apply -f https://download.elastic.co/downloads/eck/2.16.1/operator.yaml<p>8. Vamos criar um nó único do Elasticsearch com os valores padrão.</p><p>Se quiser conferir algumas receitas de diferentes instalações, você pode visitar <a href="https://www.elastic.co/docs/deploy-manage/deploy/cloud-on-k8s/recipes">este link</a>.</p><p>Lembre-se de que, se você não especificar um <code>storageClass</code>, o ECK usará o definido por padrão, que para o GKE é <code>standard-rwo</code>, que usa o <a href="https://cloud.google.com/kubernetes-engine/docs/how-to/persistent-volumes/gce-pd-csi-driver?cloudshell=true">driver CSI de disco persistente do Compute Engine</a>, e criará um volume de 1 GB com ele.</p>cat &lt;&lt;EOF | kubectl apply -f -
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: quickstart
spec:
  version: 9.0.0
  nodeSets:
  - name: default
    count: 1
    config:
      node.store.allow_mmap: false
EOF<p>Desativamos <code>nmap</code> porque a máquina padrão do GKE tem um valor de <code>vm.max_map_count</code> muito baixo. Desabilitá-lo não é recomendado para produção, mas aumenta o valor da <code>vm.max_map_count</code>. Você pode ler mais sobre como fazer isso <a href="https://www.elastic.co/docs/deploy-manage/deploy/cloud-on-k8s/virtual-memory">aqui</a>.</p><p>9. Vamos também implantar um cluster Kibana de nó único. Para o Kibana, vamos adicionar um LoadBalancer que nos dará um IP externo que podemos usar para acessar o Kibana a partir do nosso dispositivo.</p>cat &lt;&lt;EOF | kubectl apply -f -
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
  name: quickstart
spec:
  version: 9.0.0
  http:
    service:
      metadata:
        annotations:
          cloud.google.com/l4-rbs: "enabled"
      spec:
        type: LoadBalancer
  count: 1
  elasticsearchRef:
    name: quickstart
EOF<p>Observe a anotação: </p><p><code>cloud.google.com/l4-rbs: "enabled"</code></p><p><em><strong>É muito importante porque diz ao Autopilot que forneça um LoadBalancer voltado para o público. Se não estiver ativado, o LoadBalancer será interno.</strong></em></p><p>10. Verifique se seus pods estão funcionando.</p>kubectl get pods<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt627dd8f482340bc2/6a17f6de3e03d779a44f2e16/99da1270581a137683770efdb9c6e1577ec9fc01-3150x442.png" alt="" /><p>11. Você também pode <code>run kubectl get elasticsearch</code> e <code>kubectl get kibana</code> para obter estatísticas mais específicas, como versão, nós e integridade do Elasticsearch.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt32d179d1c4f785b3/6a17f6e04b055db05a432392/86234f307970fd5f78b8acd41496e8cc89ff82d3-3414x326.png" alt="" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt75b60dc0e4ad9636/6a17f6e296142a27eaeb1ca6/29160286ccc88928734c8ea11b1923db8e85d49d-3142x318.png" alt="" /><p>12. Acesse seus serviços.</p>kubectl get svc<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3806ad91791373a2/6a17f6e46df731bc800a10ab/ed1a07314b84a99b4aa1fec3db4b9badeb9587ee-3446x610.png" alt="" /><p>Isso mostrará o URL externo do Kibana em EXTERNAL-IP. Pode levar alguns minutos para a provisão do LoadBalancer. <em><strong>Copie o valor de EXTERNAL-IP.</strong></em></p><p>13 Obtenha a senha do Elasticsearch para o usuário 'elastic':</p>kubectl get secret quickstart-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5ab53ce5a685491b/6a17f6e63e03d74fcc4f2e1a/ab5054219216ebc15fc0d96e27605aaf13b720c6-3448x210.png" alt="" /><p>14. <strong>Acesse o Kibana</strong> por meio do seu navegador:</p><ul><li><p>URL: https://&lt;EXTERNAL_IP&gt;:5601</p></li><li><p>Username:elastic</p></li><li><p>Senha: 28Pao50lr2GpyguX470L2uj5 (do passo anterior)</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd86d22f797132c21/6a17f6e7e8fbce62b43a1afb/47cbe88dc14db64db3a256f3f7504cc86a843475-463x503.png" alt="Tela de boas-vindas do Elastic." /><p>15. Acessando a partir do seu navegador, você verá a tela de boas-vindas.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6f44dc23e6f1f625/6a17f6e9be6086ea71004948/a75c151c0144b7efe2b730698c0ed0156fa9b16a-1600x1005.png" alt="Página inicial do Elasticsearch." /><p>Se você quiser alterar as especificações do cluster do Elasticsearch, como mudar ou redimensionar nós, pode aplicar o manifesto yml novamente com as novas configurações:</p>cat &lt;&lt;EOF | kubectl apply -f -
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: quickstart
spec:
  version: 9.0.0
  nodeSets:
    - name: default
      count: 2
      config:
        node.store.allow_mmap: false
      podTemplate:
        spec:
          containers:
            - name: elasticsearch
              resources:
                requests:
                  memory: 1.5Gi
                  cpu: 2
                limits:
                  memory: 1.5Gi
                  cpu: 2
EOF<p>Neste exemplo, adicionaremos mais um nó e modificaremos a RAM e a CPU. Como você pode ver, agora <code>kubectl get elasticsearch</code> mostra 2 nós:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt33a7ba0be483195a/6a17f6ebe8fbcea7da3a1aff/48b475622cc48890bff8105d151f2cbde28d7021-3418x298.png" alt="" /><p>O mesmo vale para Kibana:</p>cat &lt;&lt;EOF | kubectl apply -f -
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
  name: quickstart
spec:
  version: 9.0.0
  http:
    service:
      metadata:
        annotations:
          cloud.google.com/l4-rbs: "enabled"
      spec:
        type: LoadBalancer
  count: 1
  elasticsearchRef:
    name: quickstart
  podTemplate:
    spec:
      containers:
        - name: kibana
          env:
            - name: NODE_OPTIONS
              value: "--max-old-space-size=1024"
          resources:
            requests:
              memory: 0.5Gi
              cpu: 0.5
            limits:
              memory: 1Gi
              cpu: 1
EOF<p>Podemos ajustar o CPU/RAM do container e também o uso de memória do <a href="https://nodejs.org/">Node.js </a>(<a href="https://nodejs.org/api/cli.html#--max-old-space-sizesize-in-mib">max-old-space-size</a>).</p><p>Lembre-se de que <a href="https://www.elastic.co/docs/deploy-manage/deploy/cloud-on-k8s/volume-claim-templates">as reivindicações de volume existentes não podem ser reduzidas</a>. Após aplicar a atualização, o operador fará as alterações com o menor tempo de interrupção.</p><p>Lembre-se de excluir o cluster quando terminar os testes para evitar custos desnecessários.</p>gcloud container clusters delete autopilot-cluster-1<h2>Próximas etapas</h2><p>Se você quiser saber mais sobre o Kubernetes e o Google Kubernetes Engine, consulte estes artigos:</p><ul><li><p><a href="https://www.elastic.co/docs/deploy-manage/deploy/cloud-on-k8s">Elastic Cloud on Kubernetes | Elastic Docs</a></p></li><li><p><a href="https://cloud.google.com/blog/products/containers-kubernetes/introducing-gke-autopilot">Apresentando o GKE Autopilot | Blog do Google Cloud</a></p></li><li><p><a href="https://cloud.google.com/kubernetes-engine/docs/concepts/autopilot-overview">Visão geral do Autopilot | Google Kubernetes Engine (GKE)</a></p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/eck-gke-autopilot</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/eck-gke-autopilot</guid>
    <category><![CDATA[Noções básicas]]></category>
    <dc:creator><![CDATA[Eduard Martin]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltea045d2d12606d11/6a17f6edb1e113c86179f3e7/d9c462fe63011356671479ccfedd435eec1ede52-1200x628.png" length="0" type="image/png"/>
    <pubDate>Thu, 19 Jun 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Elasticsearch em JavaScript da maneira correta, parte II]]></title>
    <description><![CDATA[Conheça as práticas recomendadas de produção e como executar o cliente Elasticsearch Node.js em ambientes serverless para reduzir erros na codificação. ]]></description>
    <content:encoded><![CDATA[<p>Esta é a segunda parte da nossa série sobre Elasticsearch em JavaScript. Na<a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-i"> primeira parte,</a> aprendemos como configurar nosso ambiente corretamente, configurar o cliente Node.js, indexar dados e realizar buscas. Nesta segunda parte, aprenderemos como implementar as melhores práticas de produção e executar o cliente Elasticsearch <a href="http://node.js">Node.js</a> em ambientes Serverless.</p><p>Analisaremos:</p><ul><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-ii#production-best-practices">Melhores práticas de produção</a></p><ul><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-ii#error-handling">Tratamento de erros</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-ii#testing">Teste</a></p></li></ul></li><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-ii#serverless-environments">Ambientes sem servidor</a></p><ul><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-ii#running-the-client-on-elastic-serverless">Executando o cliente no Elastic Serverless</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-ii#running-the-client-on-function-as-a-service-environment">Executando o cliente em um ambiente de função como serviço.</a></p></li></ul></li></ul><p><em>Você pode conferir o código-fonte com os exemplos </em><a href="https://github.com/Delacrobix/JS-client-best-practices_article"><em><strong>aqui</strong></em></a><em><strong>.</strong></em></p><h2>Melhores práticas de produção</h2><h3>Tratamento de erros no Elasticsearch</h3><p>Uma funcionalidade útil do cliente Elasticsearch em Node.js é que ele expõe objetos para os possíveis erros no Elasticsearch, permitindo que você os valide e trate de diferentes maneiras.</p><p>Para <a href="https://www.elastic.co/docs/reference/elasticsearch/clients/javascript/connecting#client-error-handling">ver todos</a>, execute o seguinte comando: </p>const { errors } = require('@elastic/elasticsearch')
console.log(errors)<p>Vamos voltar ao exemplo de pesquisa e tratar de alguns dos possíveis erros:</p>app.get("/search/lexic", async (req, res) =&gt; {
 ....
  } catch (error) {
    if (error instanceof errors.ResponseError) {
      let errorMessage =
        "Response error!, query malformed or server down, contact the administrator!";

      if (error.body.error.type === "parsing_exception") {
        errorMessage = "Query malformed, make sure mappings are set correctly";
      }

      res.status(error.meta.statusCode).json({
        erroStatus: error.meta.statusCode,
        success: false,
        results: null,
        error: errorMessage,
      });
    }

    res.status(500).json({
      success: false,
      results: null,
      error: error.message,
    });
  }
});<p><code>ResponseError</code> em particular, ocorrerá quando a resposta for <code>4xx</code> ou <code>5xx</code>, o que significa que a solicitação está incorreta ou o servidor não está disponível.</p><p>Podemos testar esse tipo de erro gerando consultas incorretas, como tentar <strong>fazer uma consulta de termo em um campo do tipo texto:</strong></p><p>Erro padrão:</p> {
    "success": false,
    "results": null,
    "error": "parsing_exception\n\tRoot causes:\n\t\tparsing_exception: [terms] query does not support [visit_details]"
}<p>Erro personalizado: </p>{
    "erroStatus": 400,
    "success": false,
    "results": null,
    "error": "Response error!, query malformed or server down; contact the administrator!"
}<p>Também podemos capturar e lidar com cada tipo de erro de uma determinada maneira. Por exemplo, podemos adicionar lógica de repetição em um <code>TimeoutError</code>.</p>app.get("/search/semantic", async (req, res) =&gt; {
    try {
  ...
  } catch (error) {
    if (error instanceof errors.TimeoutError) {


     // Retry logic...

      res.status(error.meta.statusCode).json({
        erroStatus: error.meta.statusCode,
        success: false,
        results: null,
        error:
          "The request took more than 10s after 3 retries. Try again later.",
      });
    }
  }
});<h3>Teste</h3><p>Os testes são essenciais para garantir a estabilidade do aplicativo. Para testar o código de forma isolada do Elasticsearch, podemos usar a biblioteca <a href="https://github.com/elastic/elasticsearch-js-mock">elasticsearch-js-mock</a> ao criar nosso cluster.</p><p>Esta biblioteca permite instanciar um cliente muito semelhante ao real, mas que responderá à nossa configuração substituindo apenas a camada HTTP do cliente por uma camada simulada, mantendo o restante igual ao original.</p><p>Vamos instalar a biblioteca mocks e <a href="https://github.com/avajs/ava">o AVA</a> para testes automatizados.</p><p><code>npm install @elastic/elasticsearch-mock</code></p><p><code>npm install --save-dev ava</code></p><p>Vamos configurar o arquivo <code>package.json</code> para executar os testes. Certifique-se de que esteja assim:</p>"type": "module",
	"scripts": {
		"test": "ava"
	},
	"devDependencies": {
		"ava": "^5.0.0"
	}<p>Vamos agora criar um arquivo <code>test.js</code> e instalar nosso cliente de simulação:</p>const { Client } = require('@elastic/elasticsearch')
const Mock = require('@elastic/elasticsearch-mock')

const mock = new Mock()
const client = new Client({
  node: 'http://localhost:9200',
  Connection: mock.getConnection()
})<p>Agora, adicione uma simulação para pesquisa semântica:</p>function createSemanticSearchMock(query, indexName) {
  mock.add(
    {
      method: "POST",
      path: `/${indexName}/_search`,
      body: {
        query: {
          semantic: {
            field: "semantic_field",
            query: query,
          },
        },
      },
    },
    () =&gt; {
      return {
        hits: {
          total: { value: 2, relation: "eq" },
          hits: [
            {
              _id: "1",
              _score: 0.9,
              _source: {
                owner_name: "Alice Johnson",
                pet_name: "Buddy",
                species: "Dog",
                breed: "Golden Retriever",
                vaccination_history: ["Rabies", "Parvovirus", "Distemper"],
                visit_details:
                  "Annual check-up and nail trimming. Healthy and active.",
              },
            },
            {
              _id: "2",
              _score: 0.7,
              _source: {
                owner_name: "Daniel Kim",
                pet_name: "Mochi",
                species: "Rabbit",
                breed: "Mixed",
                vaccination_history: [],
                visit_details:
                  "Nail trimming and general health check. No issues.",
              },
            },
          ],
        },
      };
    }
  );
}<p>Agora podemos criar um teste para o nosso código, garantindo que a parte do Elasticsearch sempre retorne os mesmos resultados:</p>import test from 'ava';

test("performSemanticSearch must return formatted results correctly", async (t) =&gt; {
  const indexName = "vet-visits";
  const query = "Which pets had nail trimming?";

  createSemanticSearchMock(query, indexName);

  async function performSemanticSearch(esClient, q, indexName = "vet-visits") {
    try {
      const result = await esClient.search({
        index: indexName,
        body: {
          query: {
            semantic: {
              field: "semantic_field",
              query: q,
            },
          },
        },
      });

      return {
        success: true,
        results: result.hits.hits,
      };
    } catch (error) {
      if (error instanceof errors.TimeoutError) {
        return {
          success: false,
          results: null,
          error: error.body.error.reason,
        };
      }

      return {
        success: false,
        results: null,
        error: error.message,
      };
    }
  }

  const result = await performSemanticSearch(esClient, query, indexName);

  t.true(result.success, "The search must be successful");
  t.true(Array.isArray(result.results), "The results must be an array");

  if (result.results.length &gt; 0) {
    t.true(
      "_source" in result.results[0],
      "Each result must have a _source property"
    );
    t.true(
      "pet_name" in result.results[0]._source,
      "Results must include the pet_name field"
    );
    t.true(
      "visit_details" in result.results[0]._source,
      "Results must include the visit_details field"
    );
  }
});<p>Vamos executar os testes.</p><p><code>npm run test</code></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt36304e286146f362/6a170559d7c02237b2de638f/42feae845ae8eae03c37ad7ad114e8db35984812-1186x302.png" alt="" /><p>Pronto! A partir de agora, podemos testar nosso aplicativo focando 100% no código e não em fatores externos.</p><h2>Ambientes sem servidor</h2><h3>Como executar o cliente no Elastic Serverless</h3><p>Já abordamos a execução do Elasticsearch na nuvem ou em infraestrutura local; no entanto, o cliente Node.js também oferece suporte a conexões com o <a href="https://www.elastic.co/guide/en/serverless/current/intro.html">Elastic Cloud Serverless</a>.</p><p>O Elastic Cloud Serverless permite que você crie um projeto onde não precisa se preocupar com a infraestrutura, já que a Elastic cuida disso internamente, e você só precisa se preocupar com os dados que deseja indexar e por quanto tempo deseja ter acesso a eles.</p><p>Do ponto de vista da utilização, o Serverless separa o processamento do armazenamento, proporcionando recursos de escalonamento automático tanto para <a href="https://www.elastic.co/search-labs/blog/elasticsearch-serverless-tier-autoscaling">pesquisa</a> quanto para <a href="https://www.elastic.co/search-labs/blog/elasticsearch-ingest-autoscaling">indexação</a>. Isso permite que você cultive apenas os recursos de que realmente precisa.</p><p>O cliente realiza as seguintes adaptações para se conectar ao Serverless:</p><ul><li><p>Desativa a detecção de pacotes e ignora quaisquer opções relacionadas a ela.</p></li><li><p>Ignora todos os nós passados na configuração, exceto o primeiro, e ignora quaisquer opções de filtragem e seleção de nós.</p></li><li><p>Habilita a compressão e o método `TLSv1_2_method` (igual à configuração para o Elastic Cloud).</p></li><li><p>Adiciona um cabeçalho HTTP `elastic-api-version` a todas as requisições.</p></li><li><p>Utiliza `CloudConnectionPool` por padrão em vez de `WeightedConnectionPool`.</p></li><li><p>Desativa os cabeçalhos `content-type` e `accept` fornecidos pelo fornecedor, em favor dos tipos MIME padrão.</p></li></ul><p>Para conectar seu projeto sem servidor, você precisa usar o parâmetro serverMode: serverless.</p>const { Client } = require('@elastic/elasticsearch')
const client = new Client({
  node: 'ELASTICSEARCH_ENDPOINT',
  auth: { apiKey: 'ELASTICSEARCH_API_KEY' },
  serverMode: "serverless",
});<h3>Como executar o cliente em um ambiente de função como serviço</h3><p>No exemplo, usamos um servidor Node.js, mas você também pode se conectar usando um ambiente de função como serviço com funções como AWS Lambda, GCP Run, etc.</p>'use strict'

const { Client } = require('@elastic/elasticsearch')

const client = new Client({
  // client initialisation
})

exports.handler = async function (event, context) {
  // use the client
}<p>Outro exemplo é conectar-se a serviços como o Vercel, que também é serverless. Você pode conferir este <a href="https://github.com/elastic/elasticsearch-js/blob/main/docs/examples/proxy/README.md">exemplo completo</a> de como fazer isso, mas a parte mais relevante do <a href="https://github.com/elastic/elasticsearch-js/blob/main/docs/examples/proxy/api/search.js">endpoint de pesquisa</a> se parece com isto:</p>const response = await client.search(
  {
    index: INDEX,
    // You could directly send from the browser
    // the Elasticsearch's query DSL, but it will
    // expose you to the risk that a malicious user
    // could overload your cluster by crafting
    // expensive queries.
    query: {
      match: { field: req.body.text },
    },
  },
  {
    headers: {
      Authorization: `ApiKey ${token}`,
    },
  }
);<p>Este endpoint reside na pasta /api e é executado a partir do lado do servidor, de forma que o cliente só tenha controle sobre o parâmetro “texto” que corresponde ao termo de pesquisa.</p><p>A implicação de usar a função como serviço é que, ao contrário de um servidor que funciona 24 horas por dia, 7 dias por semana, as funções apenas ativam a máquina que executa a função e, assim que ela termina, a máquina entra em modo de repouso para consumir menos recursos.</p><p>Essa configuração pode ser conveniente se o aplicativo não receber muitas solicitações; caso contrário, os custos podem ser elevados. Você também precisa levar em consideração o <a href="https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtime-environment.html">ciclo de vida das funções</a> e os tempos de execução (que, em alguns casos, podem ser de apenas alguns segundos).</p><h2>Conclusão</h2><p>Neste artigo, aprendemos como lidar com erros, o que é crucial em ambientes de produção. Também abordamos os testes da nossa aplicação enquanto simulávamos o serviço Elasticsearch, o que proporciona testes confiáveis independentemente do estado do cluster e nos permite focar no nosso código.</p><p>Por fim, demonstramos como criar uma infraestrutura totalmente sem servidor, provisionando tanto o Elastic Cloud Serverless quanto um aplicativo Vercel.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-ii</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-ii</guid>
    <category><![CDATA[Javascript]]></category>
    <category><![CDATA[Noções básicas]]></category>
    <dc:creator><![CDATA[Jeffrey Rengifo]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc58be329ffebcd60/6a17043e47d49c0bc62d88ab/70fb0ff949f6db9ac9b8a28ecb4329ab915ebf46-720x420.png" length="0" type="image/png"/>
    <pubDate>Mon, 19 May 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Como otimizar o espaço em disco e o uso do Elasticsearch]]></title>
    <description><![CDATA[Saiba como evitar e lidar com casos em que o disco do Elasticsearch está muito cheio (uso excessivo) e quando a capacidade do disco é subutilizada para otimizar os custos do cluster.]]></description>
    <content:encoded><![CDATA[<p>O gerenciamento de disco é importante em qualquer banco de dados, e o Elasticsearch não é exceção. Se você não tiver espaço em disco suficiente disponível, o Elasticsearch deixará de alocar shards para o nó. Isso acabará por impedi-lo de gravar dados no cluster, com o risco potencial de perda de dados em sua aplicação. Por outro lado, se você tiver muito espaço em disco, estará pagando por mais recursos do que precisa.</p><h2>Informações básicas sobre marcas d'água</h2><p>Existem vários limites de "marca d'água" no seu cluster Elasticsearch que ajudam a monitorar o espaço em disco disponível. À medida que o disco de um nó se enche, o primeiro limite a ser ultrapassado será o "limite mínimo de espaço em disco". O segundo limite será então o “limite de marca d'água de disco alto”. Finalmente, será atingida a “fase de inundação do disco”. Assim que esse limite for ultrapassado, o cluster bloqueará a gravação em TODOS os índices que possuam um shard (primário ou réplica) no nó que atingiu o limite. As leituras (buscas) ainda serão possíveis.</p><h2>Como prevenir e lidar com casos em que o disco está muito cheio (sobreutilização)</h2><p>Existem vários métodos para lidar com casos em que o disco do Elasticsearch está muito cheio:</p><ol><li><p><strong>Excluir</strong> <strong>dados antigos:</strong> Normalmente, os dados não devem ser mantidos indefinidamente. Uma forma de prevenir e resolver o problema de disco cheio é garantir que, quando os dados atingirem uma certa idade, sejam arquivados e excluídos de forma confiável. Uma maneira de fazer isso é usar <a href="https://www.elastic.co/docs/manage-data/lifecycle/index-lifecycle-management">o ILM</a>.</p></li><li><p><strong>Adicionar capacidade de armazenamento:</strong> Se não for possível excluir os dados, talvez seja necessário adicionar mais nós de dados ou aumentar o tamanho dos discos para reter todos os dados sem afetar negativamente o desempenho. Se precisar adicionar capacidade de armazenamento ao cluster, considere se precisa adicionar apenas capacidade de armazenamento ou se deve adicionar também recursos de RAM e CPU em proporção adequada (consulte a seção sobre <a href="https://www.elastic.co/search-labs/blog/optimize-elasticsearch-disk-space-and-usage#the-relationship-between-disk-size,-ram-and-cpu">proporção de tamanho do disco, RAM e CPU</a> abaixo).</p></li></ol><h2>Como adicionar capacidade de armazenamento ao seu cluster Elasticsearch</h2><ol><li><p><strong>Aumente o número de nós de dados: </strong>Lembre-se de que os novos nós devem ter o mesmo tamanho que os nós existentes e a mesma versão do Elasticsearch.</p></li><li><p><strong>Aumentar o tamanho dos nós existentes: </strong>Em ambientes baseados em nuvem, geralmente é fácil aumentar o tamanho do disco e a RAM/CPU nos nós existentes.</p></li><li><p><strong>Aumentar apenas o tamanho do disco: </strong>Em ambientes baseados em nuvem, geralmente é relativamente fácil aumentar o tamanho do disco.</p></li><li><p><a href="https://www.elastic.co/docs/deploy-manage/tools/snapshot-and-restore"><strong>Instantâneo</strong></a><a href="https://www.elastic.co/docs/deploy-manage/tools/snapshot-and-restore"> </a><a href="https://www.elastic.co/docs/deploy-manage/tools/snapshot-and-restore"><strong>e</strong></a><a href="https://www.elastic.co/docs/deploy-manage/tools/snapshot-and-restore"> </a><a href="https://www.elastic.co/docs/deploy-manage/tools/snapshot-and-restore"><strong>Restauração</strong></a><strong>:</strong> Se você deseja permitir que dados antigos sejam recuperados sob demanda em um processo automatizado a partir de backups, você pode criar snapshots de índices antigos, excluí-los e restaurar os dados temporariamente sob demanda a partir desses snapshots. </p></li><li><p><strong>Reduzir o número de réplicas por fragmento:</strong> Outra opção para reduzir os dados é diminuir o número de réplicas de cada fragmento. Para alta disponibilidade, o ideal é ter uma réplica por fragmento, mas quando os dados ficam mais antigos, pode ser possível trabalhar sem réplicas. Isso geralmente funciona se os dados forem persistentes ou se você tiver um backup para restaurar, se necessário.</p></li><li><p><strong>Criar alertas:</strong> Para evitar que os discos fiquem cheios no futuro e agir de forma proativa, você deve criar alertas com base no uso do disco que o notificarão quando o disco começar a ficar cheio. </p></li></ol><h2>Como prevenir e lidar com casos em que a capacidade do disco está subutilizada</h2><p>Se a capacidade do seu disco estiver subutilizada, existem várias opções para reduzir o volume de armazenamento no seu cluster.</p><h3>Como reduzir o volume de armazenamento em um cluster Elasticsearch</h3><p>Existem vários métodos para reduzir o volume de armazenamento de um cluster.</p><p><strong>1. Reduzir o número de nós de dados</strong></p><p>Se você deseja reduzir o armazenamento de dados e também reduzir os recursos de RAM e CPU na mesma proporção, então esta é a estratégia mais fácil. A desativação de nós desnecessários provavelmente proporcionará a maior economia de custos.</p><p>Antes de desativar o nó, você deve:</p><ul><li><p>Certifique-se de que o nó a ser desativado não seja necessário como nó MESTRE. Você deve sempre ter pelo menos três nós com a função de nó MESTRE.</p></li><li><p>Migre os fragmentos de dados para fora do nó a ser desativado.</p></li></ul><p><strong>2. Substitua os nós existentes por nós menores.</strong></p><p>Se não for possível reduzir ainda mais o número de nós (normalmente, 3 seria uma configuração mínima), então você pode querer diminuir o tamanho dos nós existentes. Lembre-se de que é recomendável garantir que todos os nós de dados tenham a mesma quantidade de memória RAM e tamanho de disco, já que o balanceamento dos shards é feito com base no número de shards por nó.</p><p>O processo seria o seguinte:</p><ul><li><p>Adicione novos nós menores ao cluster.</p></li><li><p>Migre os fragmentos para longe dos nós que serão desativados.</p></li><li><p>Desligue os nós antigos.</p></li></ul><p><strong>3. Reduzir o tamanho do disco nos nós</strong></p><p>Se você deseja reduzir APENAS o tamanho do disco nos nós, sem alterar a RAM ou a CPU geral do cluster, então você pode reduzir o tamanho do disco para cada nó individualmente. Reduzir o tamanho do disco em um nó do Elasticsearch não é um processo trivial.</p><p>A maneira mais fácil de fazer isso geralmente seria:</p><ul><li><p>Migrar fragmentos do nó</p></li><li><p>Pare o nó</p></li><li><p>Monte um novo volume de dados no nó com o tamanho apropriado.</p></li><li><p>Copie todos os dados do volume de disco antigo para o novo volume.</p></li><li><p>Desprenda o volume antigo A.</p></li><li><p>Inicie o nó e migre os fragmentos de volta para o nó.</p></li></ul><p>Isso exige que você tenha capacidade suficiente nos outros nós para armazenar temporariamente os fragmentos extras do nó durante esse processo. Em muitos casos, o custo de gerenciamento desse processo pode exceder a economia potencial no uso de disco. Por esse motivo, pode ser mais simples substituir o nó por completo por um novo nó com o tamanho de disco desejado (consulte “Substituir nós existentes por nós menores” acima).</p><p>Ao pagar por recursos desnecessários, os custos podem ser reduzidos otimizando a utilização desses recursos.</p><h2>A relação entre o tamanho do disco, a RAM e a CPU.</h2><p>A proporção ideal entre capacidade de disco e RAM no seu cluster dependerá do seu caso de uso específico. Por esse motivo, ao considerar alterações na sua capacidade de armazenamento, você também deve avaliar se as proporções atuais de disco/RAM/CPU estão adequadamente equilibradas e se, consequentemente, você precisa adicionar/reduzir RAM/CPU na mesma proporção.</p><p>Os requisitos de RAM e CPU dependem do volume de atividade <a href="https://opster.com/guides/elasticsearch/glossary/elasticsearch-indexing/">de indexação</a> , do número e tipo de consultas, bem como da quantidade de dados que está sendo pesquisada e agregada. Isso geralmente é proporcional à quantidade de dados armazenados no cluster e, portanto, também deve estar relacionado ao tamanho do disco.</p><p>A proporção entre a capacidade do disco e a RAM pode variar dependendo do uso. Veja alguns exemplos aqui:</p><p></p><p>Atividade do índice</p><p>Retenção</p><p>Atividade de pesquisa</p><p>Capacidade do disco</p><p>BATER</p><p>Aplicativo de busca empresarial</p><p>Ingestão moderada de toras</p><p>Longo</p><p>Luz</p><p>2TB</p><p>32 GB</p><p>Monitoramento de aplicativos</p><p>Ingestão intensiva de toras</p><p>Curto</p><p>Luz</p><p>1TB</p><p>32 GB</p><p>Comércio eletrônico</p><p>Indexação de dados leves</p><p>Indeterminado</p><p>Pesado</p><p>500 GB</p><p>32 GB</p><p><em>Lembre-se de que modificar a configuração das máquinas de nó deve ser feito com cuidado, pois pode causar indisponibilidade do nó e você precisa garantir que os shards não comecem a migrar para seus outros nós já sobrecarregados.</em></p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/optimize-elasticsearch-disk-space-and-usage</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/optimize-elasticsearch-disk-space-and-usage</guid>
    <category><![CDATA[Noções básicas]]></category>
    <dc:creator><![CDATA[Kofi Bartlett]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt087c3d95b6cb59c5/6a17dbda445de986f54cffd9/5d41a078dd03e4480a0ff4e9591c8618b9bab4d0-720x420.png" length="0" type="image/png"/>
    <pubDate>Fri, 16 May 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Elasticsearch em JavaScript da maneira correta, parte I]]></title>
    <description><![CDATA[Explicando como criar um backend Elasticsearch pronto para produção em JavaScript.  

Saiba como usar o Elasticsearch com JavaScript para criar um servidor com diferentes endpoints de busca para consultar documentos do Elasticsearch, seguindo as melhores práticas de cliente/servidor.]]></description>
    <content:encoded><![CDATA[<p>Este é o primeiro artigo de uma série que aborda como usar o Elasticsearch com JavaScript. Nesta série, você aprenderá o básico de como usar o Elasticsearch em um ambiente JavaScript e revisará os recursos mais relevantes e as melhores práticas para criar um aplicativo de busca. Ao final, você saberá tudo o que precisa para executar o Elasticsearch usando JavaScript.</p><p>Nesta primeira parte, vamos analisar:</p><ul><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-i#environment">Ambiente</a></p><ul><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-i#frontend,-backend,-or-serverless?">Frontend, backend ou serverless?</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-i#connecting-the-client">Conectando o cliente</a></p></li></ul></li><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-i#indexing-documents">Documentos de indexação</a></p><ul><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-i#elasticsearch-client">Cliente Elasticsearch</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-i#semantic-mappings">Mapeamentos semânticos</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-i#bulk-helper">Auxiliar em massa</a></p></li></ul></li><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-i#searching-data">Dados de pesquisa</a></p><ul><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-i#lexical-query-(/search/lexic?q=%3Cquery-term%3E)">Consulta Lexical</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-i#semantic-query-(/search/semantic?q=%3Cquery-term%3E)">Consulta semântica</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-i#hybrid-query-(/search/hybrid?q=%3Cquery-term%3E)">Consulta híbrida</a></p></li></ul></li></ul><p><em>Você pode conferir o código-fonte com os exemplos </em><a href="https://github.com/Delacrobix/JS-client-best-practices_article"><em><strong>aqui</strong></em></a><em><strong>.</strong></em></p><h3>O que é o cliente Elasticsearch para Node.js?</h3><p>O <a href="https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/index.html">cliente Elasticsearch para Node.js</a> é uma biblioteca JavaScript que converte as chamadas HTTP REST da API do Elasticsearch em código JavaScript. Isso facilita o manuseio e permite o uso de ferramentas auxiliares que simplificam tarefas como a indexação de documentos em lotes.</p><h2>Ambiente</h2><h3>Frontend, backend ou serverless?</h3><p>Para criar nosso aplicativo de busca usando o cliente JavaScript, precisamos de pelo menos dois componentes: um cluster Elasticsearch e um ambiente de execução JavaScript para executar o cliente.</p><p>O cliente JavaScript é compatível com todas as soluções Elasticsearch (Cloud, on-premise e Serverless), e não há grandes diferenças entre elas, já que o cliente lida com todas as variações internamente, então você não precisa se preocupar com qual usar.</p><p>O ambiente de execução JavaScript, no entanto, deve ser executado a partir do <strong>servidor</strong> e <strong>não diretamente do navegador.</strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd3ec469c83e3a71a/6a17e3d5445de91da44d00b6/92ce6cfd923c8008fa44f617a58193642d9d5879-661x410.png" alt="Elasticsearch em ambiente JavaScript." /><p>Isso ocorre porque, ao acessar o Elasticsearch pelo navegador, o usuário pode obter informações confidenciais, como a chave da API do cluster, o host ou a própria consulta. A Elasticsearch recomenda <strong>nunca expor o cluster diretamente à internet </strong>e usar uma camada intermediária que abstraia todas essas informações, de forma que o usuário possa ver apenas os parâmetros. Você pode ler mais sobre este tópico <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/es-security-principles.html#security-protect-cluster-traffic">aqui</a>.</p><p>Sugerimos usar um esquema como este:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4d7f215f2e70230a/6a17e3d6fbc5f83de6491a13/a08769f08ec73fe57bf2e961cfdfbb1cdd57919d-972x429.png" alt="Configurando o cliente Node.js do Elasticsearch." /><p>Nesse caso, o cliente envia apenas os termos de pesquisa e uma chave de autenticação para o seu servidor, enquanto o seu servidor mantém o controle total da consulta e da comunicação com o Elasticsearch.</p><h3>Conectando o cliente</h3><p>Comece criando uma chave de API seguindo <a href="https://www.elastic.co/search-labs/tutorials/install-elasticsearch/elastic-cloud">estes passos</a>.</p><p>Seguindo o exemplo anterior, criaremos um servidor Express simples e nos conectaremos a ele usando um cliente de um servidor Node.js.</p><p>Vamos inicializar o projeto com o NPM e instalar o cliente Elasticsearch e <a href="https://expressjs.com/">o Express.</a> Esta última é uma biblioteca para iniciar servidores em Node.js. Usando o Express, podemos interagir com nosso backend via HTTP.</p><p>Vamos inicializar o projeto:</p><p><code>npm init -y</code></p><p>Instalar dependências:</p><p><code>npm install @elastic/elasticsearch express split2 dotenv</code></p><p>Deixe-me explicar melhor:</p><ul><li><p><a href="https://www.npmjs.com/package/@elastic/elasticsearch"><em><strong>@elastic/elasticsearch</strong></em></a>: É o cliente oficial do Node.js.</p></li><li><p><a href="https://www.npmjs.com/package/express"><em><strong>Express</strong></em></a>: Isso nos permitirá criar um servidor Node.js leve para expor o Elasticsearch.</p></li><li><p><a href="https://www.npmjs.com/package/split2"><em><strong>split2</strong></em></a>: Divide linhas de texto em um fluxo. Útil para processar nossos arquivos ndjson linha por linha.</p></li><li><p><a href="https://www.npmjs.com/package/dotenv"><em><strong>dotenv</strong></em></a>: Permite gerenciar variáveis de ambiente usando um arquivo .env. arquivo</p></li></ul><p>Crie um arquivo .env Abra o arquivo na raiz do projeto e adicione as seguintes linhas:</p>ELASTICSEARCH_ENDPOINT="Your Elasticsearch endpoint"
ELASTICSEARCH_API_KEY="Your Elasticssearch API"<p>Dessa forma, podemos importar essas variáveis usando o pacote <code>dotenv</code> .</p><p>Crie um arquivo <code>server.js</code> :</p>const express = require("express");
const bodyParser = require("body-parser");
const { Client } = require("@elastic/elasticsearch");
 
require("dotenv").config(); //environment variables setup

const ELASTICSEARCH_ENDPOINT = process.env.ELASTICSEARCH_ENDPOINT;
const ELASTICSEARCH_API_KEY = process.env.ELASTICSEARCH_API_KEY;
const PORT = 3000;


const app = express();

app.listen(PORT, () =&gt; {
  console.log("Server running on port", PORT);
});
app.use(bodyParser.json());


let esClient = new Client({
  node: ELASTICSEARCH_ENDPOINT,
  auth: { apiKey: ELASTICSEARCH_API_KEY },  
});

app.get("/ping", async (req, res) =&gt; {
  try {
    const result = await esClient.info();

    res.status(200).json({
      success: true,
      clusterInfo: result,
    });
  } catch (error) {
    console.error("Error getting Elasticsearch info:", error);

    res.status(500).json({
      success: false,
      clusterInfo: null,
      error: error.message,
    });
  }
});<p>Este código configura um servidor Express.js básico que escuta na porta 3000 e se conecta a um cluster Elasticsearch usando uma chave de API para autenticação. Inclui um endpoint /ping que, quando acessado por meio de uma solicitação GET, consulta o cluster Elasticsearch para obter informações básicas usando o método <code>.info()</code> do cliente Elasticsearch. </p><p>Se a consulta for bem-sucedida, ela retorna as informações do cluster em formato JSON; caso contrário, retorna uma mensagem de erro. O servidor também utiliza o middleware body-parser para lidar com os corpos das requisições JSON.</p><p>Execute o arquivo para iniciar o servidor:</p><p><code>node server.js</code></p><p>A resposta deve ser semelhante a esta:</p>Server running on port 3000<p>E agora, vamos consultar o endpoint <code>/ping</code> para verificar o status do nosso cluster Elasticsearch.</p>curl http://localhost:3000/ping
{
    "success": true,
    "clusterInfo": {
        "name": "instance-0000000000",
        "cluster_name": "61b7e19eec204d59855f5e019acd2689",
        "cluster_uuid": "BIfvfLM0RJWRK_bDCY5ldg",
        "version": {
            "number": "9.0.0",
            "build_flavor": "default",
            "build_type": "docker",
            "build_hash": "112859b85d50de2a7e63f73c8fc70b99eea24291",
            "build_date": "2025-04-08T15:13:46.049795831Z",
            "build_snapshot": false,
            "lucene_version": "10.1.0",
            "minimum_wire_compatibility_version": "8.18.0",
            "minimum_index_compatibility_version": "8.0.0"
        },
        "tagline": "You Know, for Search"
    }
}<h2>Documentos de indexação</h2><p>Uma vez conectados, podemos indexar documentos usando mapeamentos como <a href="https://www.elastic.co/search-labs/blog/semantic-search-simplified-semantic-text">semantic_text</a> para pesquisa semântica e text para consultas de texto completo. Com esses dois tipos de campo, também podemos fazer <a href="https://www.elastic.co/what-is/hybrid-search">buscas híbridas</a>.</p><p>Criaremos um novo arquivo <code>load.js</code> para gerar os mapeamentos e carregar os documentos.</p><h3>Cliente Elasticsearch</h3><p>Primeiro precisamos instanciar e autenticar o cliente:</p>const { Client } = require("@elastic/elasticsearch");

const ELASTICSEARCH_ENDPOINT = "cluster/project_endpoint";
const ELASTICSEARCH_API_KEY = "apiKey";

const esClient = new Client({
  node: ELASTICSEARCH_ENDPOINT,
  auth: { apiKey: ELASTICSEARCH_API_KEY },
});<h3>Mapeamentos semânticos</h3><p>Criaremos um índice com dados sobre um hospital veterinário. Armazenaremos as informações do dono, do animal de estimação e os detalhes da visita.</p><p>Os dados nos quais desejamos realizar uma busca de texto completo, como nomes e descrições, serão armazenados como texto. Os dados das categorias, como a espécie ou raça do animal, serão armazenados como palavras-chave.</p><p>Além disso, copiaremos os valores de todos os campos para um campo semantic_text para podermos executar também uma pesquisa semântica nessas informações.</p>const INDEX_NAME = "vet-visits";

const createMappings = async (indexName, mapping) =&gt; {
  try {
    const body = await esClient.indices.create({
      index: indexName,
      body: {
        mappings: mapping,
      },
    });

    console.log("Index created successfully:", body);
  } catch (error) {
    console.error("Error creating mapping:", error);
  }
};

await createMappings(INDEX_NAME, {
  properties: {
    owner_name: {
      type: "text",
      copy_to: "semantic_field",
    },
    pet_name: {
      type: "text",
      copy_to: "semantic_field",
    },
    species: {
      type: "keyword",
      copy_to: "semantic_field",
    },
    breed: {
      type: "keyword",
      copy_to: "semantic_field",
    },
    vaccination_history: {
      type: "keyword",
      copy_to: "semantic_field",
    },
    visit_details: {
      type: "text",
      copy_to: "semantic_field",
    },
    semantic_field: {
      type: "semantic_text",
    },
  },
});<h3>Auxiliar em massa</h3><p>Outra vantagem do cliente é que podemos usar a <a href="https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/client-helpers.html#bulk-helper">função auxiliar</a> de indexação em lotes. A função auxiliar de processamento em lote nos permite lidar facilmente com aspectos como concorrência, novas tentativas e o que fazer com cada documento que passa pela função, seja com sucesso ou com falha.</p><p>Uma característica interessante dessa ferramenta auxiliar é a possibilidade de trabalhar com fluxos de dados. Essa função permite enviar um arquivo linha por linha, em vez de armazenar o arquivo inteiro na memória e enviá-lo para o Elasticsearch de uma só vez.</p><p>Para enviar os dados para o Elasticsearch, crie um arquivo chamado data.ndjson na raiz do projeto e adicione as informações abaixo (alternativamente, você pode baixar o arquivo com o conjunto de dados <a href="https://github.com/Delacrobix/JS-client-best-practices_article/blob/main/data.ndjson">aqui</a>):</p>{"owner_name":"Alice Johnson","pet_name":"Buddy","species":"Dog","breed":"Golden Retriever","vaccination_history":["Rabies","Parvovirus","Distemper"],"visit_details":"Annual check-up and nail trimming. Healthy and active."}
{"owner_name":"Marco Rivera","pet_name":"Milo","species":"Cat","breed":"Siamese","vaccination_history":["Rabies","Feline Leukemia"],"visit_details":"Slight eye irritation, prescribed eye drops."}
{"owner_name":"Sandra Lee","pet_name":"Pickles","species":"Guinea Pig","breed":"Mixed","vaccination_history":[],"visit_details":"Loss of appetite, recommended dietary changes."}
{"owner_name":"Jake Thompson","pet_name":"Luna","species":"Dog","breed":"Labrador Mix","vaccination_history":["Rabies","Bordetella"],"visit_details":"Mild ear infection, cleaning and antibiotics given."}
{"owner_name":"Emily Chen","pet_name":"Ziggy","species":"Cat","breed":"Mixed","vaccination_history":["Rabies","Feline Calicivirus"],"visit_details":"Vaccination update and routine physical."}
{"owner_name":"Tomás Herrera","pet_name":"Rex","species":"Dog","breed":"German Shepherd","vaccination_history":["Rabies","Parvovirus","Leptospirosis"],"visit_details":"Follow-up for previous leg strain, improving well."}
{"owner_name":"Nina Park","pet_name":"Coco","species":"Ferret","breed":"Mixed","vaccination_history":["Rabies"],"visit_details":"Slight weight loss; advised new diet."}
{"owner_name":"Leo Martínez","pet_name":"Simba","species":"Cat","breed":"Maine Coon","vaccination_history":["Rabies","Feline Panleukopenia"],"visit_details":"Dental cleaning. Minor tartar buildup removed."}
{"owner_name":"Rachel Green","pet_name":"Rocky","species":"Dog","breed":"Bulldog Mix","vaccination_history":["Rabies","Parvovirus"],"visit_details":"Skin rash, antihistamines prescribed."}
{"owner_name":"Daniel Kim","pet_name":"Mochi","species":"Rabbit","breed":"Mixed","vaccination_history":[],"visit_details":"Nail trimming and general health check. No issues."}<p>Usamos o split2 para transmitir as linhas do arquivo enquanto o auxiliar de processamento em lote as envia para o Elasticsearch.</p>const { createReadStream } = require("fs");
const split = require("split2");
 
const indexData = async (filePath, indexName) =&gt; {
  try {
    console.log(`Indexing data from ${filePath} into ${indexName}...`);

    const result = await esClient.helpers.bulk({
      datasource: createReadStream(filePath).pipe(split()),

      onDocument: () =&gt; {
        return {
          index: { _index: indexName },
        };
      },
      onDrop(doc) {
        console.error("Error processing document:", doc);
      },
    });

    console.log("Bulk indexing successful elements:", result.items.length);
  } catch (error) {
    console.error("Error indexing data:", error);
    throw error;
  }
};

await indexData("./data.ndjson", INDEX_NAME);<p>O código acima lê um arquivo .ndjson. indexa cada objeto JSON em um índice Elasticsearch especificado usando o método <code>helpers.bulk</code> . Ele transmite o arquivo usando <code>createReadStream</code> e <code>split2</code>, configura metadados de indexação para cada documento e registra quaisquer documentos que não puderem ser processados. Após a conclusão, registra o número de itens indexados com sucesso.</p><p>Alternativamente à função <code>indexData</code> , você pode fazer o upload do arquivo diretamente pela interface do usuário usando o Kibana e usar a <a href="https://www.elastic.co/docs/manage-data/ingest/upload-data-files">interface de upload de arquivos de dados.</a></p><p>Executamos o arquivo para enviar os documentos para o nosso cluster Elasticsearch.</p><p><code>node load.js</code></p>Creating mappings for index vet-visits...
Index created successfully: { acknowledged: true, shards_acknowledged: true, index: 'vet-visits' }
Indexing data from ./data.ndjson into vet-visits...
Bulk indexing completed. Total documents: 10, Failed: 0<h2>Buscando dados no Elasticsearch</h2><p>Voltando ao nosso arquivo <code>server.js</code> , criaremos diferentes endpoints para realizar buscas lexicais, semânticas ou híbridas.</p><p>Em resumo, esses tipos de pesquisa não são mutuamente exclusivos, mas dependerão do tipo de pergunta que você precisa responder.</p><p>Tipo de consulta</p><p>Caso de uso</p><p>Exemplo de pergunta</p><p>Consulta lexical</p><p>As palavras ou radicais presentes na pergunta provavelmente aparecerão nos documentos indexados. Similaridade entre tokens na pergunta e nos documentos.</p><p>Estou procurando uma camiseta esportiva azul.</p><p>Consulta semântica</p><p>É improvável que as palavras da pergunta apareçam nos documentos. Similaridade conceitual entre a pergunta e os documentos.</p><p>Estou procurando roupas para clima frio.</p><p>Busca híbrida</p><p>A questão contém componentes lexicais e/ou semânticos. Similaridade semântica e de tokens entre a pergunta e os documentos.</p><p>Estou procurando um vestido tamanho P para um casamento na praia.</p><p>As partes <em><strong>lexicais </strong></em>da pergunta provavelmente fazem parte de títulos e descrições, ou nomes de categorias, enquanto as partes <em><strong>semânticas </strong></em>são conceitos relacionados a esses campos. <em><strong>"Azul"</strong></em> provavelmente será o nome de uma categoria ou parte de uma descrição, e <em><strong>"casamento na praia"</strong></em> provavelmente não será, mas pode estar semanticamente relacionado a roupas de linho.</p><h3>Consulta lexical (/search/lexic?q=)&lt;query_term&gt;</h3><p>A busca lexical, também chamada de busca de texto completo, significa pesquisar com base na similaridade de tokens; ou seja, após uma análise, os documentos que incluem os tokens da busca serão retornados.</p><p>Você pode conferir nosso tutorial prático de busca lexical <a href="https://www.elastic.co/demo-gallery/lexical-search">aqui</a>.</p>app.get("/search/lexic", async (req, res) =&gt; {
  const { q } = req.query;

  const INDEX_NAME = "vet-visits";

  try {
    const result = await esClient.search({
      index: INDEX_NAME,
      size: 5,
      body: {
        query: {
          multi_match: {
            query: q,
            fields: ["owner_name", "pet_name", "visit_details"],
          },
        },
      },
    });

    res.status(200).json({
      success: true,
      results: result.hits.hits
    });
  } catch (error) {
    console.error("Error performing search:", error);

    res.status(500).json({
      success: false,
      results: null,
      error: error.message,
    });
  }
});<p>Testamos com: <em><strong>corte de unhas</strong></em></p>curl http://localhost:3000/search/lexic?q=nail%20trimming<p>Responder:</p>{
    "success": true,
    "results": [
        {
            "_index": "vet-visits",
            "_id": "-RY6RJYBLe2GoFQ6-9n9",
            "_score": 2.7075968,
            "_source": {
                "pet_name": "Mochi",
                "owner_name": "Daniel Kim",
                "species": "Rabbit",
                "visit_details": "Nail trimming and general health check. No issues.",
                "breed": "Mixed",
                "vaccination_history": []
            }
        },
        {
            "_index": "vet-visits",
            "_id": "8BY6RJYBLe2GoFQ6-9n9",
            "_score": 2.560356,
            "_source": {
                "pet_name": "Buddy",
                "owner_name": "Alice Johnson",
                "species": "Dog",
                "visit_details": "Annual check-up and nail trimming. Healthy and active.",
                "breed": "Golden Retriever",
                "vaccination_history": [
                    "Rabies",
                    "Parvovirus",
                    "Distemper"
                ]
            }
        }
    ]
}<h3>Consulta semântica&lt;query_term&gt; (/search/semantic?q=)</h3><p>A busca semântica, diferentemente da busca lexical, encontra resultados que são semelhantes ao significado dos termos de busca por meio de busca vetorial.</p><p>Você pode conferir nosso tutorial prático de busca semântica <a href="https://www.elastic.co/demo-gallery/semantic-search">aqui</a>.</p>app.get("/search/semantic", async (req, res) =&gt; {
  const { q } = req.query;

  const INDEX_NAME = "vet-visits";

  try {
    const result = await esClient.search({
      index: INDEX_NAME,
      size: 5,
      body: {
        query: {
          semantic: {
            field: "semantic_field",
            query: q
          },
        },
      },
    });

    res.status(200).json({
      success: true,
      results: result.hits.hits,
    });
  } catch (error) {
    console.error("Error performing search:", error);

    res.status(500).json({
      success: false,
      results: null,
      error: error.message,
    });
  }
});<p>Fizemos o teste com a seguinte pergunta: <em><strong>Quem fez pedicure?</strong></em></p>curl http://localhost:3000/search/semantic?q=Who%20got%20a%20pedicure?<p>Responder:</p>{
    "success": true,
    "results": [
        {
            "_index": "vet-visits",
            "_id": "-RY6RJYBLe2GoFQ6-9n9",
            "_score": 4.861466,
            "_source": {
                "owner_name": "Daniel Kim",
                "pet_name": "Mochi",
                "species": "Rabbit",
                "breed": "Mixed",
                "vaccination_history": [],
                "visit_details": "Nail trimming and general health check. No issues."
            }
        },
        {
            "_index": "vet-visits",
            "_id": "8BY6RJYBLe2GoFQ6-9n9",
            "_score": 4.7152824,
            "_source": {
                "pet_name": "Buddy",
                "owner_name": "Alice Johnson",
                "species": "Dog",
                "visit_details": "Annual check-up and nail trimming. Healthy and active.",
                "breed": "Golden Retriever",
                "vaccination_history": [
                    "Rabies",
                    "Parvovirus",
                    "Distemper"
                ]
            }
        },
        {
            "_index": "vet-visits",
            "_id": "9RY6RJYBLe2GoFQ6-9n9",
            "_score": 1.6717153,
            "_source": {
                "pet_name": "Rex",
                "owner_name": "Tomás Herrera",
                "species": "Dog",
                "visit_details": "Follow-up for previous leg strain, improving well.",
                "breed": "German Shepherd",
                "vaccination_history": [
                    "Rabies",
                    "Parvovirus",
                    "Leptospirosis"
                ]
            }
        },
        {
            "_index": "vet-visits",
            "_id": "9xY6RJYBLe2GoFQ6-9n9",
            "_score": 1.5600781,
            "_source": {
                "pet_name": "Simba",
                "owner_name": "Leo Martínez",
                "species": "Cat",
                "visit_details": "Dental cleaning. Minor tartar buildup removed.",
                "breed": "Maine Coon",
                "vaccination_history": [
                    "Rabies",
                    "Feline Panleukopenia"
                ]
            }
        },
        {
            "_index": "vet-visits",
            "_id": "-BY6RJYBLe2GoFQ6-9n9",
            "_score": 1.2696637,
            "_source": {
                "pet_name": "Rocky",
                "owner_name": "Rachel Green",
                "species": "Dog",
                "visit_details": "Skin rash, antihistamines prescribed.",
                "breed": "Bulldog Mix",
                "vaccination_history": [
                    "Rabies",
                    "Parvovirus"
                ]
            }
        }
    ]
}<h3>Consulta híbrida (/search/hybrid?q=)&lt;query_term&gt;</h3><p>A busca híbrida permite combinar a busca semântica e a busca lexical, obtendo assim o melhor dos dois mundos: a precisão da busca por token, juntamente com a proximidade de significado da busca semântica.</p>app.get("/search/hybrid", async (req, res) =&gt; {
  const { q } = req.query;

  const INDEX_NAME = "vet-visits";

  try {
    const result = await esClient.search({
      index: INDEX_NAME,
      body: {
        retriever: {
          rrf: {
            retrievers: [
              {
                standard: {
                  query: {
                    bool: {
                      must: {
                         multi_match: {
             query: q,
            fields: ["owner_name", "pet_name", "visit_details"],
          },
                      },
                    },
                  },
                },
              },
              {
                standard: {
                  query: {
                    bool: {
                      must: {
                        semantic: {
                          field: "semantic_field",
                          query: q,
                        },
                      },
                    },
                  },
                },
              },
            ],
          },
        },
        size: 5,
      },
    });

    res.status(200).json({
      success: true,
      results: result.hits.hits,
    });
  } catch (error) {
    console.error("Error performing search:", error);

    res.status(500).json({
      success: false,
      results: null,
      error: error.message,
    });
  }
});<p>Fizemos o teste com a pergunta: “<em><strong>Quem fez pedicure ou tratamento dentário?”</strong></em></p>curl http://localhost:3000/search/hybrid?q=who%20got%20a%20pedicure%20or%20dental%20treatment<p>Resposta.</p>{
    "success": true,
    "results": [
        {
            "_index": "vet-visits",
            "_id": "9xY6RJYBLe2GoFQ6-9n9",
            "_score": 0.032522473,
            "_source": {
                "pet_name": "Simba",
                "owner_name": "Leo Martínez",
                "species": "Cat",
                "visit_details": "Dental cleaning. Minor tartar buildup removed.",
                "breed": "Maine Coon",
                "vaccination_history": [
                    "Rabies",
                    "Feline Panleukopenia"
                ]
            }
        },
        {
            "_index": "vet-visits",
            "_id": "-RY6RJYBLe2GoFQ6-9n9",
            "_score": 0.016393442,
            "_source": {
                "pet_name": "Mochi",
                "owner_name": "Daniel Kim",
                "species": "Rabbit",
                "visit_details": "Nail trimming and general health check. No issues.",
                "breed": "Mixed",
                "vaccination_history": []
            }
        },
        {
            "_index": "vet-visits",
            "_id": "8BY6RJYBLe2GoFQ6-9n9",
            "_score": 0.015873017,
            "_source": {
                "pet_name": "Buddy",
                "owner_name": "Alice Johnson",
                "species": "Dog",
                "visit_details": "Annual check-up and nail trimming. Healthy and active.",
                "breed": "Golden Retriever",
                "vaccination_history": [
                    "Rabies",
                    "Parvovirus",
                    "Distemper"
                ]
            }
        },
        {
            "_index": "vet-visits",
            "_id": "9RY6RJYBLe2GoFQ6-9n9",
            "_score": 0.015625,
            "_source": {
                "pet_name": "Rex",
                "owner_name": "Tomás Herrera",
                "species": "Dog",
                "visit_details": "Follow-up for previous leg strain, improving well.",
                "breed": "German Shepherd",
                "vaccination_history": [
                    "Rabies",
                    "Parvovirus",
                    "Leptospirosis"
                ]
            }
        },
        {
            "_index": "vet-visits",
            "_id": "8xY6RJYBLe2GoFQ6-9n9",
            "_score": 0.015384615,
            "_source": {
                "pet_name": "Luna",
                "owner_name": "Jake Thompson",
                "species": "Dog",
                "visit_details": "Mild ear infection, cleaning and antibiotics given.",
                "breed": "Labrador Mix",
                "vaccination_history": [
                    "Rabies",
                    "Bordetella"
                ]
            }
        }
    ]
}<h2>Conclusão</h2><p>Nesta primeira parte da nossa série, explicamos como configurar nosso ambiente e criar um servidor com diferentes endpoints de pesquisa para consultar os documentos do Elasticsearch, seguindo as melhores práticas de cliente/servidor. Confira <a href="https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-i">a segunda parte</a> da nossa série, na qual você aprenderá as melhores práticas de produção e como executar o cliente Elasticsearch Node.js em ambientes Serverless.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-i</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/how-to-use-elasticsearch-in-javascript-part-i</guid>
    <category><![CDATA[Javascript]]></category>
    <category><![CDATA[Noções básicas]]></category>
    <dc:creator><![CDATA[Jeffrey Rengifo]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt16d00c8a548b32e8/6a17e3d8fbc5f8c740491a19/72200540ed258779d87e53a72ea189f8a138540c-1600x901.png" length="0" type="image/png"/>
    <pubDate>Thu, 15 May 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Como configurar o número de réplicas em um índice do Elasticsearch]]></title>
    <description><![CDATA[Aprenda a configurar o number_of_replicas em um índice do Elasticsearch para melhorar o desempenho na busca e proporcionar resiliência contra falhas de nós. 
]]></description>
    <content:encoded><![CDATA[<p>O Elasticsearch foi projetado para ser um sistema distribuído capaz de lidar com grandes volumes de dados e fornecer alta disponibilidade. Uma das principais funcionalidades que permitem isso é o conceito de replicação de índice, que é controlado pela configuração <code>number_of_replicas</code> . Este artigo irá abordar em detalhes essa configuração, suas implicações e como configurá-la corretamente.</p><h2>O papel das réplicas no Elasticsearch</h2><p>No Elasticsearch, um índice é uma coleção de documentos que são particionados em vários shards primários. Cada fragmento primário é um índice Apache Lucene independente, e os documentos dentro de um índice são distribuídos entre todos os fragmentos primários. Para garantir alta disponibilidade e redundância de dados, o Elasticsearch permite que cada shard tenha uma ou mais cópias, conhecidas como réplicas.

A configuração <code>number_of_replicas</code> controla o número de shards de réplica (cópias) que o Elasticsearch cria para cada shard primário em um índice. Por padrão, o Elasticsearch cria uma réplica para cada shard primário, mas isso pode ser alterado de acordo com os requisitos do seu sistema.</p><h2>Configurando o número de réplicas</h2><p>A configuração <code>number_of_replicas</code> pode ser definida no momento da criação do índice ou atualizada posteriormente. Veja como você pode configurar isso durante a criação do índice:</p>PUT /my_index
{
  "settings": {
    "number_of_replicas": 2
  }
}<p>Neste exemplo, o Elasticsearch criará duas réplicas para cada shard primário no índice <code>my_index</code> .</p><p>Para atualizar a configuração <code>number_of_replicas</code> de um índice existente, você pode usar a API <code>_settings</code> :</p>PUT /my_index/_settings
{
  "number_of_replicas": 3
}<p>Este comando atualizará o índice <code>my_index</code> para ter três réplicas para cada fragmento primário.</p><h2>Implicações da configuração number_of_replicas</h2><p>A configuração <code>number_of_replicas</code> tem um impacto significativo no desempenho e na resiliência do seu <a href="https://opster.com/guides/elasticsearch/glossary/elasticsearch-cluster/">cluster</a> Elasticsearch. Aqui estão alguns pontos importantes a serem considerados:</p><ol><li><p><strong>Redundância e disponibilidade de dados:</strong> Aumentar o <code>number_of_replicas</code> melhora a disponibilidade dos seus dados, criando mais cópias de cada fragmento. Se um nó falhar, o Elasticsearch ainda poderá fornecer dados a partir dos fragmentos de réplica nos <a href="https://opster.com/guides/elasticsearch/glossary/elasticsearch-node/">nós</a> restantes.</p></li><li><p><strong>Desempenho de busca:</strong> Fragmentos de réplica podem atender solicitações de leitura, portanto, ter mais réplicas pode melhorar o desempenho de busca, distribuindo a carga por mais fragmentos.</p></li><li><p><strong>Desempenho de gravação:</strong> No entanto, cada operação de gravação deve ser realizada em todas as cópias de um fragmento. Portanto, um <code>number_of_replicas</code> mais alto pode diminuir o desempenho <a href="https://opster.com/guides/elasticsearch/glossary/elasticsearch-indexing/">da indexação</a> , pois aumenta o número de operações que devem ser realizadas para cada gravação.</p></li><li><p><strong>Requisitos de armazenamento:</strong> Mais réplicas significam mais espaço de armazenamento. Você deve garantir que seu cluster tenha capacidade suficiente para armazenar as réplicas adicionais.</p></li><li><p><strong>Resiliência à falha do nó:</strong> O <code>number_of_replicas</code> deve ser definido considerando o número de nós em seu cluster. Se o <code>number_of_replicas</code> for igual ou maior que o número de nós, seu cluster pode tolerar a falha de vários nós sem perda de dados.</p></li></ol><h2>Melhores práticas para definir o número de réplicas</h2><p>A configuração ideal <code>number_of_replicas</code> depende dos requisitos específicos do seu sistema. No entanto, aqui estão algumas boas práticas gerais:</p><ul><li><p>Para um cluster de nó único, <code>number_of_replicas</code> deve ser definido como 0, pois não há outros nós para armazenar réplicas.</p></li><li><p>Para um cluster com vários nós, <code>number_of_replicas</code> deve ser definido como pelo menos 1 para garantir redundância de dados e alta disponibilidade.</p></li><li><p>Se o desempenho da pesquisa for uma prioridade, considere aumentar o <code>number_of_replicas</code>. No entanto, tenha em mente a relação de compromisso entre o desempenho de gravação e os requisitos de armazenamento.</p></li><li><p>Certifique-se sempre de que seu cluster tenha capacidade suficiente para armazenar as réplicas adicionais.</p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-index-number-of_replicas</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-index-number-of_replicas</guid>
    <category><![CDATA[Noções básicas]]></category>
    <dc:creator><![CDATA[Kofi Bartlett]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd041e871a8935448/6a17de320b0bedf404dd34ab/23b96aaa1a38b1f4747b4a87695d816f24c0cf70-720x421.jpg" length="0" type="image/jpeg"/>
    <pubDate>Wed, 14 May 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Excluindo um campo de um documento no Elasticsearch]]></title>
    <description><![CDATA[Saiba como excluir campos de documentos do Elasticsearch usando a API de atualização, scripts ou reindexação para remoções únicas e em massa.]]></description>
    <content:encoded><![CDATA[<p>No Elasticsearch, é comum precisar excluir um campo de um documento. Isso pode ser útil quando você deseja remover informações desnecessárias ou desatualizadas do seu índice. Neste artigo, discutiremos diferentes métodos para excluir um campo de um documento no Elasticsearch, juntamente com exemplos e instruções passo a passo. </p><h2>Método 1: Usando a API de atualização</h2><p>A <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/update-document">API de atualização</a> fornece um script que modifica a origem de um documento para atualizar o documento. Você pode usar essa API para apagar o campo de um documento, bastando deixar o campo como "null". Veja como fazer isso:</p><p>1. Identifique o índice, o tipo de documento (se estiver usando o Elasticsearch 6.x ou anterior) e o ID do documento que você deseja atualizar.</p><p>2. Utilize a API de atualização com um script que defina o campo como nulo ou, melhor ainda, que o remova do documento de origem. O exemplo a seguir demonstra como excluir o campo “field_to_delete” de um documento com ID “1” no índice “my_index”:</p>POST /my_index/_update/1
{
  "script": "ctx._source.remove('field_to_delete')"
}<p>3. Execute a solicitação. Se a operação for bem-sucedida, o Elasticsearch retornará uma resposta indicando que o documento foi atualizado.</p><p>Nota: Este método apenas remove o campo do documento especificado. O campo ainda existirá no mapeamento e em outros documentos do índice.</p><h2>Método 2: Reindexação com uma fonte modificada</h2><p>Para apagar um campo de todos os documentos em um índice, você pode usar a <a href="https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-reindex">API de reindexação</a> para criar um novo índice com a fonte modificada. Veja como:</p><p>1. Crie um novo índice com as mesmas configurações e mapeamentos do índice original. Você pode usar a API Get Index para recuperar as configurações e os mapeamentos do índice original.</p><p>2. Utilize a API Reindex para copiar documentos do índice original para o novo índice, removendo o campo da origem. O exemplo a seguir demonstra como excluir o campo “field_to_delete” de todos os documentos no índice “my_index”:</p>POST /_reindex
{
  "source": {
    "index": "my_index"
  },
  "dest": {
    "index": "new_index"
  },
  "script": {
    "source": "ctx._source.remove('field_to_delete')"
  }
}<p>
3. Verifique se o novo índice contém os documentos corretos com o campo removido.</p><p>4. Se tudo estiver correto, você pode excluir o índice original e, se necessário, adicionar um alias ao novo índice com o mesmo nome do índice original.</p><h2>Método 3: atualizando o mapeamento e reindexando</h2><p>Se você deseja excluir um campo do mapeamento e todos os documentos em um índice, pode atualizar o mapeamento e, em seguida, reindexar os documentos. Eis como fazer isso:</p><p>1. Crie um novo índice com as mesmas configurações do índice original.</p><p>2. Recupere os mapeamentos do índice original usando a API Get Mapping.</p><p>3. Modifique os mapeamentos removendo o campo que deseja excluir.</p><p>4. Aplique os mapeamentos modificados ao novo índice usando a API Put Mapping.</p><p>5. Utilize a API Reindex para copiar documentos do índice original para o novo índice, conforme descrito no Método 2.</p><p>6. Verifique se o novo índice contém os documentos corretos com o campo removido e se o campo não está presente no mapeamento.</p><p>7. Se tudo estiver correto, você pode apagar o índice original e, se necessário, adicionar um alias ao novo índice com o nome do índice original.</p><h2>Conclusão</h2><p>Neste artigo, discutimos três métodos para excluir um campo de um documento no Elasticsearch: usando a API de atualização, reindexando com uma fonte modificada e atualizando o mapeamento e reindexando. Cada método tem seus próprios casos de uso e vantagens e desvantagens, portanto, escolha aquele que melhor se adapta às suas necessidades. Lembre-se sempre de testar as alterações e verificar os resultados antes de aplicá-las em ambientes de produção.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-delete-field-from-document</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-delete-field-from-document</guid>
    <category><![CDATA[Noções básicas]]></category>
    <dc:creator><![CDATA[Kofi Bartlett]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8deb617c89943b69/6a17e26c4b055d209e43212f/89278eb7309b7f3018c61be2b514d1fd25b9564d-720x420.jpg" length="0" type="image/jpeg"/>
    <pubDate>Fri, 09 May 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Como unir dois índices no Elasticsearch]]></title>
    <description><![CDATA[Explicando como usar os termos consulta, filtro Elasticsearch do Logstash, processador de enriquecimento e ES|QL para unir dois índices no Elasticsearch.]]></description>
    <content:encoded><![CDATA[<p>No Elasticsearch, unir dois índices não é tão simples quanto em bancos de dados relacionais SQL tradicionais. No entanto, é possível obter resultados semelhantes usando certas técnicas e recursos fornecidos pelo Elasticsearch.</p><p>Historicamente, muitas pessoas usavam o<a href="https://www.elastic.co/pt/docs/reference/elasticsearch/mapping-reference/nested"> tipo de campo</a> <a href="https://www.elastic.co/pt/docs/reference/elasticsearch/mapping-reference/nested"><code>nested</code></a>como um mecanismo para unir diferentes índices. No entanto, era limitado devido a consultas caras e suporte incompleto no Kibana, especificamente visualizações do Lens.</p><p>Este artigo se aprofundará no processo de junção de dois índices no Elasticsearch, com foco nas seguintes abordagens: </p><ol><li><p>Usando a consulta <code>terms</code></p></li><li><p>Usando o processador <code>enrich</code> em pipelines de ingestão</p></li><li><p>Plug-in de filtro Logstash <code>elasticsearch</code></p></li><li><p>ES|QL <code>ENRICH</code></p></li><li><p>ES|QL <code>LOOKUP JOIN</code></p></li></ol><h2>Usando os termos consulta</h2><p>A <a href="https://www.elastic.co/pt/docs/reference/query-languages/query-dsl/query-dsl-terms-query">consulta de termos</a> é uma das maneiras mais eficazes de unir dois índices no Elasticsearch. Esta consulta é usada para recuperar documentos que contêm um ou mais termos exatos em um campo específico. Aqui discutimos como usá-lo para unir dois índices.</p><p>Primeiro, você precisa recuperar os dados necessários do primeiro índice. Isso pode ser feito usando uma simples solicitação GET e extraindo os valores do atributo <code>_source</code> .</p># Simple GET request
GET first_index/_search<p>Depois de obter os dados do primeiro índice, você pode usá-los para consultar o segundo índice. Isso é feito usando a consulta <code>terms</code> , onde você especifica o campo e os valores que deseja corresponder.</p><p>Aqui está um exemplo:</p>GET second_index/_search
{
  "query": {
    "terms": {
      "field_in_second_index": ["value1_from_first_index", "value2_from_first_index"]
    }
  }
}<p>
Neste exemplo, <code>field_in_second_index</code> é o campo no segundo índice que você deseja corresponder aos valores do primeiro índice. <code>value1_from_first_index</code> e <code>value2_from_first_index</code> são os valores do primeiro índice que você deseja corresponder no segundo índice.</p><p>A consulta de termos também fornece suporte para executar as duas etapas acima de uma só vez usando uma técnica chamada <a href="https://www.elastic.co/pt/docs/reference/query-languages/query-dsl/query-dsl-terms-query#query-dsl-terms-lookup">pesquisa de termos</a>. O Elasticsearch se encarregará de recuperar de forma transparente os valores correspondentes de outro índice. Por exemplo, se você tiver um índice de equipes contendo uma lista de jogadores:</p>PUT teams/_doc/team1
{
  "players":   ["john", "bill", "michael"]
}
PUT teams/_doc/team2
{
  "players":   ["aaron", "joe", "donald"]
}<p>É possível consultar um índice de pessoas para todas as pessoas que jogam no time1, conforme mostrado abaixo:</p>GET people/_search?pretty
{
  "query": {
    "terms": {
        "name" : {
            "index" : "teams",
            "id" : "team1",
            "path" : "players"
        }
    }
  }
}<p>No exemplo acima, o Elasticsearch recuperará de forma transparente os nomes dos jogadores do documento com id team1 no índice de equipes (ou seja, “john”, “bill” e “michael”) e encontrar todos os documentos no índice de pessoas que contenham qualquer um desses valores no campo de nome.</p><p>Para os curiosos, a consulta SQL equivalente seria:</p><h2>Usando o processador de enriquecimento</h2><p>O<a href="https://www.elastic.co/pt/docs/reference/enrich-processor/enrich-processor"> processador</a> <a href="https://www.elastic.co/pt/docs/reference/enrich-processor/enrich-processor"><code>enrich</code></a>é outra ferramenta poderosa que pode ser usada para unir dois índices no Elasticsearch. Este processador enriquece os dados de documentos recebidos adicionando dados de um índice de enriquecimento predefinido.</p><p>Veja como você pode usar o processador de enriquecimento para unir dois índices:</p><p>1. Primeiro, você precisa criar uma política de enriquecimento. Esta política define qual índice usar para enriquecimento, qual campo corresponder e qual(is) campo(s) usar para enriquecimento de documentos recebidos.</p><p>Aqui está um exemplo:</p>PUT _enrich/policy/my_enrich_policy
{
  "match": {
    "indices": "first_index",
    "match_field": "field_in_first_index",
    "enrich_fields": ["field_to_enrich"]
  }
}<p>2. Depois que a política for criada, você precisa executá-la para criar o índice de enriquecimento a partir da sua política recém-criada:</p>PUT _enrich/policy/my_enrich_policy/_execute<p>Isso criará um novo índice enriquecido oculto que será usado durante o enriquecimento. Dependendo do tamanho do índice de origem, esta operação pode levar algum tempo. Certifique-se de que a política de enriquecimento esteja totalmente criada antes de prosseguir para a próxima etapa.</p><p>3. Após a criação da política de enriquecimento, você pode usar o processador de enriquecimento em um pipeline de ingestão para enriquecer os dados de documentos recebidos:</p>PUT _ingest/pipeline/my_pipeline
{
  "processors": [
    {
      "enrich": {
        "policy_name": "my_enrich_policy",
        "field": "field_in_second_index",
        "target_field": "enriched_field"
      }
    }
  ]
}<p>Neste exemplo, <code>field_in_second_index</code> é o campo no segundo índice que precisa corresponder ao <code>match_field</code> do primeiro índice. <code>enriched_field</code> é o novo campo no segundo índice que conterá os dados enriquecidos do <code>enrich_fields</code> no primeiro índice.</p><p>Uma desvantagem dessa abordagem é que, se os dados mudarem em <code>first_index</code>, a política de enriquecimento precisará ser reexecutada. O índice enriquecido não é atualizado ou sincronizado automaticamente a partir do índice de origem do qual foi criado. Entretanto, se <code>first_index</code> for relativamente estável, então essa abordagem funciona bem.</p><h2>Plug-in de filtro ElasticSearch do Logstash</h2><p>Se estiver usando o Logstash, outra opção semelhante ao processador <code>enrich</code> descrito acima é usar o plug-in de filtro <code>elasticsearch</code> para adicionar campos relevantes ao evento com base em uma consulta especificada. A configuração do nosso pipeline Logstash residiria em um arquivo <code>.conf</code> , como <code>my-pipeline.conf</code>.</p><p>Vamos imaginar que nosso pipeline está extraindo logs do Elasticsearch usando o<a href="https://www.elastic.co/pt/docs/reference/logstash/plugins/plugins-inputs-elasticsearch"> plugin de entrada</a> <a href="https://www.elastic.co/pt/docs/reference/logstash/plugins/plugins-inputs-elasticsearch"><code>elasticsearch</code></a> , com uma consulta para restringir a seleção:</p>input {
  # Read all documents from Elasticsearch matching the given query
  elasticsearch {
    hosts =&gt; "localhost"
    query =&gt; '{ "query": { "match": { "statuscode": 200 } }, "sort": [ "_doc" ] }'
  }
}<p>Se quisermos enriquecer essas mensagens com informações de um determinado índice, podemos usar o<a href="https://www.elastic.co/pt/docs/reference/logstash/plugins/plugins-filters-elasticsearch"> plugin de filtro</a> <a href="https://www.elastic.co/pt/docs/reference/logstash/plugins/plugins-filters-elasticsearch"><code>elasticsearch</code></a>na seção <code>filter</code> para enriquecer nossos logs:</p>filter {
   elasticsearch {
      hosts =&gt; ["localhost"]
      index =&gt; "index_name"
      query =&gt; "type:start AND operation:%{[opid]}"
      fields =&gt; { "@timestamp" =&gt; "started" }
   }
}<p>O código acima encontrará os documentos do índice <code>index_name</code> onde <code>type</code> é o início e o campo de operação corresponde ao <code>opid</code> especificado e, em seguida, copiará o valor do campo <code>@timestamp</code> em um novo campo chamado <code>started</code>.</p><p>Os documentos enriquecidos seriam então enviados para a fonte de saída apropriada, neste caso para o Elasticsearch usando o<a href="https://www.elastic.co/pt/docs/reference/logstash/plugins/plugins-outputs-elasticsearch"> plugin de saída</a> <a href="https://www.elastic.co/pt/docs/reference/logstash/plugins/plugins-outputs-elasticsearch"><code>elasticsearch</code></a> :</p>output {
    elasticsearch {
        hosts =&gt; "localhost"
        data_stream =&gt; "true"
    }
}<p>Se você já estiver usando o Logstash, esta opção pode ser útil para consolidar sua lógica de enriquecimento em um único lugar e processá-la conforme novos eventos chegam. No entanto, se você não fizer isso, isso adicionará complexidade à sua solução e será outro componente que você precisa executar e manter.</p><h2>ES|QL ENRIQUECER</h2><p>A introdução do <a href="https://www.elastic.co/pt/docs/explore-analyze/query-filter/languages/esql">ES|QL</a>, que foi disponibilizado gratuitamente na versão 8.14, é uma linguagem de consulta canalizada suportada pelo Elasticsearch que permite a filtragem, transformação e análise de dados. Usar o comando de processamento ENRICH nos permite adicionar dados de índices existentes usando uma política de enriquecimento.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbeb8992bde773461/6a17f6b663baff00c9741dd4/03aadddc08afffff3f6526c9c052999c97fa09dd-1600x989.png" alt="esql enriquecer" /><p>Tomando a mesma política <code>my_enrich_policy</code> do exemplo original do processador de enriquecimento, o exemplo ES|QL ficaria assim:</p><p>Também é possível substituir os campos de correspondência e enriquecimento, que em nosso exemplo são <code>field_in_first_index</code> e <code>field_to_enrich</code> respectivamente:</p><p>Embora a limitação óbvia seja que você precisa especificar uma política de enriquecimento primeiro, o ES|QL oferece a flexibilidade de ajustar os campos conforme necessário.</p><h2>ES|QL LOOKUP JOIN</h2><p>O Elasticsearch 8.18 apresenta uma nova maneira de unir índices no Elasticsearch, o comando <code>LOOKUP JOIN</code> . Este comando opera como um LEFT OUTER JOIN no estilo SQL usando o novo <a href="https://www.elastic.co/pt/docs/reference/elasticsearch/index-settings/index-modules#index-mode-setting">modo de índice de pesquisa</a> no lado direito da junção.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt783ffb3f9802f92d/6a17f6b8e9ea870608a9c788/1d73495979c4d6bb675c4c966ea86d9a72dc1c48-510x605.png" alt="ES|QL LOOKUP JOIN" /><p>Revisitando nosso exemplo anterior, a nova consulta é a seguinte, onde <code>match_field</code> precisa estar presente em <code>first_index</code> e <code>second_index</code>:</p><p>A vantagem do LOOKUP JOIN sobre as outras abordagens é que ele não requer nenhuma política <code>enrich</code> e, portanto, o processamento adicional associado à configuração da política. É útil ao trabalhar com dados de enriquecimento que mudam frequentemente, diferentemente das outras abordagens discutidas neste artigo.</p><h2>Conclusão</h2><p>Concluindo, embora o Elasticsearch não suporte operações de junção tradicionais, ele fornece vários recursos que podem ser usados para obter resultados semelhantes. Especificamente, abordamos como realizar operações de junção usando:</p><ol><li><p>A consulta <code>terms</code></p></li><li><p>O processador <code>enrich</code> em pipelines de ingestão</p></li><li><p>Plug-in de filtro Logstash <code>elasticsearch</code></p></li><li><p>ES|QL <code>ENRICH</code></p></li><li><p>ES|QL <code>LOOKUP JOIN</code></p></li></ol><p>É importante observar que esses métodos têm suas limitações e devem ser usados criteriosamente com base nos requisitos específicos e na natureza dos dados.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-join-two-indexes</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-join-two-indexes</guid>
    <category><![CDATA[Noções básicas]]></category>
    <dc:creator><![CDATA[Carly Richmond]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt74822b3b7cb2a41a/6a17f6b97f6f156288c09cc7/0d4736d10fa3e12e6233cd59993299c7bd48911b-680x450.png" length="0" type="image/png"/>
    <pubDate>Wed, 07 May 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Entendendo a pontuação do Elasticsearch e a API Explain.]]></title>
    <description><![CDATA[Saiba mais sobre os mecanismos de pontuação do Elasticsearch e a função prática de pontuação para auditar a relevância da busca e melhorar a classificação de documentos com a API Explain.]]></description>
    <content:encoded><![CDATA[<p>O Elasticsearch é um mecanismo de busca poderoso que fornece resultados de pesquisa rápidos e relevantes, calculando uma pontuação para cada documento no índice. Essa pontuação é um fator crucial para determinar a ordem dos resultados da pesquisa. Neste artigo, vamos nos aprofundar no mecanismo de pontuação do Elasticsearch e explorar a API Explain, que ajuda a compreender o processo de pontuação.</p><h2>Mecanismos de pontuação no Elasticsearch</h2><p>O Elasticsearch utiliza, por padrão, um modelo de pontuação chamado Practical Scoring Function (BM25). Este modelo é baseado na teoria probabilística de recuperação de informação e leva em consideração fatores como frequência de termos, frequência inversa de documentos e normalização do comprimento do campo. Vamos discutir brevemente esses fatores:</p><ol><li><p><strong>Frequência do termo (TF):</strong> Representa o número de vezes que um termo aparece em um documento. Uma maior frequência de um termo indica uma relação mais forte entre o termo e o documento.</p></li><li><p><strong>Frequência Inversa de Documentos (IDF):</strong> Este fator mede a importância de um termo em toda a coleção de documentos. Um termo que aparece em muitos documentos é considerado menos importante, enquanto um termo que aparece em menos documentos é considerado mais importante.</p></li><li><p><strong>Normalização do comprimento do campo</strong>: Este fator leva em consideração o comprimento do campo no qual o termo aparece. Campos mais curtos recebem maior peso, pois o termo é considerado mais significativo em um campo mais curto.</p></li></ol><h2>Usando a API Explain</h2><p>A API Explain do Elasticsearch é uma ferramenta valiosa para entender o processo de pontuação. Fornece uma explicação detalhada de como a pontuação de um documento específico foi calculada. Para usar a API Explain, você precisa enviar uma solicitação GET para o seguinte endpoint:</p>GET /&lt;index&gt;/_explain/&lt;document_id&gt;<p>No corpo da solicitação, você precisa fornecer a consulta para a qual deseja entender a pontuação. Eis um exemplo:</p>{
  "query": {
    "match": {
      "title": "elasticsearch"
    }
  }
}<p>A resposta da API Explain incluirá uma descrição detalhada do processo de pontuação, incluindo os fatores individuais (TF, IDF e normalização do comprimento do campo) e suas contribuições para a pontuação final. Eis um exemplo de resposta:</p>{
  "_index": "example_index",
  "_type": "_doc",
  "_id": "1",
  "matched": true,
  "explanation": {
    "value": 1.2,
    "description": "weight(title:elasticsearch in 0) [PerFieldSimilarity], result of:",
    "details": [
      {
        "value": 1.2,
        "description": "score(doc=0,freq=1.0 = termFreq=1.0\n), product of:",
        "details": [
          {
            "value": 2.2,
            "description": "idf, computed as log(1 + (docCount - docFreq + 0.5) / (docFreq + 0.5)) from:",
            "details": [
              {
                "value": 1,
                "description": "docFreq",
                "details": []
              },
              {
                "value": 1,
                "description": "docCount",
                "details": []
              }
            ]
          },
          {
            "value": 0.5,
            "description": "tfNorm, computed as (freq * (k1 + 1)) / (freq + k1 * (1 - b + b * fieldLength / avgFieldLength)) from:",
            "details": [
              {
                "value": 1,
                "description": "termFreq=1.0",
                "details": []
              },
              {
                "value": 1.2,
                "description": "parameter k1",
                "details": []
              },
              {
                "value": 0.75,
                "description": "parameter b",
                "details": []
              },
              {
                "value": 1,
                "description": "avgFieldLength",
                "details": []
              },
              {
                "value": 1,
                "description": "fieldLength",
                "details": []
              }
            ]
          }
        ]
      }
    ]
  }
}<p>Neste exemplo, a resposta mostra que a pontuação de 1,2 é um produto do valor IDF (2,2) e do valor tfNorm (0,5). A explicação detalhada ajuda a compreender os fatores que contribuem para a pontuação e pode ser útil para refinar a relevância da pesquisa.</p><h2>Conclusão</h2><p>A pontuação do Elasticsearch é um aspecto crucial para fornecer resultados de pesquisa relevantes. Ao entender os mecanismos de pontuação e usar a API Explain, você pode obter insights sobre os fatores que afetam os resultados da pesquisa e otimizar suas consultas de pesquisa para obter maior relevância e desempenho.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-scoring-and-explain-api</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-scoring-and-explain-api</guid>
    <category><![CDATA[Noções básicas]]></category>
    <dc:creator><![CDATA[Kofi Bartlett]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbe7de1872f1527e3/6a17de303e9e452974ba1374/a70c5403064d5bbceff66a17373332362227f13c-720x420.jpg" length="0" type="image/jpeg"/>
    <pubDate>Mon, 05 May 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Pesquisa no Elasticsearch por dois campos]]></title>
    <description><![CDATA[Explore técnicas de busca por dois campos, incluindo consultas de múltiplas correspondências, consultas booleanas e reforço de campos em tempo de consulta.]]></description>
    <content:encoded><![CDATA[<p>A busca em múltiplos campos no Elasticsearch é um requisito comum em muitas aplicações. Neste artigo, exploraremos técnicas avançadas para realizar buscas por dois campos, incluindo consultas com múltiplas correspondências, consultas booleanas e otimização de campos em tempo de consulta. Essas técnicas ajudarão você a criar resultados de pesquisa mais precisos e relevantes para seus usuários.</p><h2>Técnicas avançadas para realizar buscas por dois campos</h2><h3>1. Consulta com múltiplas correspondências</h3><p>Uma consulta de correspondência múltipla permite pesquisar uma única sequência de consulta em vários campos. Isso é útil quando você deseja encontrar documentos que contenham a string de consulta fornecida em qualquer um dos dois campos. Aqui está um exemplo de uma consulta de correspondência múltipla que busca o termo “exemplo” nos campos “título” ou “descrição”:</p>{
  "query": {
    "multi_match": {
      "query": "example",
      "fields": ["title", "description"]
    }
  }
}<h3>2. Consulta booleana</h3><p>Uma consulta booleana permite combinar várias consultas usando lógica booleana. Você pode usar a cláusula “should” para pesquisar documentos que correspondam à consulta em qualquer um dos dois campos. Aqui está um exemplo de uma consulta booleana que busca o termo “exemplo” nos campos “título” e “descrição”:</p>{
  "query": {
    "bool": {
      "should": [
        {"match": {"title": "example"}},
        {"match": {"description": "example"}}
      ]
    }
  }
}<h3>3. Reforço de campos em tempo de consulta</h3><p>Às vezes, você pode querer dar mais importância a um campo em detrimento de outro durante a pesquisa. Você pode conseguir isso aplicando um fator de reforço ao campo no momento da consulta. Um valor de reforço mais alto dá mais peso ao campo, tornando-o mais propenso a influenciar a pontuação final da pesquisa. Aqui está um exemplo de uma consulta com múltiplas correspondências e um fator de reforço aplicado ao campo "título":</p>{
  "query": {
    "multi_match": {
      "query": "example",
      "fields": ["title^3", "description"]
    }
  }
}<p>Neste exemplo, o campo "título" tem um fator de reforço de 3, tornando-o três vezes mais importante que o campo "descrição" na determinação da pontuação de pesquisa.</p><h3>4. Combinando consultas com diferentes fatores de otimização</h3><p>Você também pode combinar várias consultas com diferentes fatores de reforço usando uma consulta booleana. Isso permite ajustar a importância de cada campo nos resultados da pesquisa. Aqui está um exemplo de uma consulta booleana com diferentes fatores de ponderação aplicados aos campos “título” e “descrição”:</p>{
  "query": {
    "bool": {
      "should": [
        {"match": {"title": {"query": "example", "boost": 3}}},
        {"match": {"description": {"query": "example", "boost": 1}}}
      ]
    }
  }
}<p>Neste exemplo, o campo "título" tem um fator de reforço de 3, enquanto o campo "descrição" tem um fator de reforço de 1.</p><h2>Conclusão</h2><p>A busca por dois campos no Elasticsearch pode ser realizada usando técnicas avançadas como consultas de correspondência múltipla, consultas booleanas e otimização de campos em tempo de consulta. Ao combinar essas técnicas, você pode criar resultados de pesquisa mais precisos e relevantes para seus usuários. Experimente diferentes combinações de consultas e fatores de otimização para encontrar a configuração de pesquisa ideal para o seu caso de uso específico.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-search-by-two-fields</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-search-by-two-fields</guid>
    <category><![CDATA[Noções básicas]]></category>
    <category><![CDATA[DSL de consulta]]></category>
    <dc:creator><![CDATA[Kofi Bartlett]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltda47d75430c4fa7c/6a17f5cae3179149242d5963/d5d04bbcfc3925f48f3487ea4c7e0dd2205316d0-720x420.jpg" length="0" type="image/jpeg"/>
    <pubDate>Wed, 30 Apr 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Como implementar a Quantização Binária Aprimorada (BBQ) em seu caso de uso.]]></title>
    <description><![CDATA[Descubra por que você implementaria a Quantização Binária Aprimorada (BBQ) em seu caso de uso e como fazê-lo.]]></description>
    <content:encoded><![CDATA[<p>A pesquisa vetorial fornece a base para implementar a pesquisa semântica para texto ou a pesquisa por similaridade para imagens, vídeos ou áudio. Com a pesquisa vetorial, os vetores são representações matemáticas de dados que podem ser enormes e, às vezes, lentas. A Quantização Binária Melhorada (doravante denominada BBQ) funciona como um método de compressão para vetores. Ele permite que você encontre as correspondências certas enquanto reduz os vetores para torná-los mais rápidos de pesquisar e processar. Este artigo abordará BBQ e rescore_vector, um campo disponível apenas para índices quantizados que repontuam vetores automaticamente.</p><p>Todas as consultas e saídas completas mencionadas neste artigo podem ser encontradas em nosso <a href="https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/how-and-why-bbq">repositório de código do Elasticsearch Labs</a>.</p><h2>Por que implementar a Quantização Binária Aprimorada (BBQ) no seu caso de uso?</h2>Observação: para uma compreensão mais aprofundada de como funciona a matemática por trás do churrasco, confira a <a href="https://www.elastic.co/pt/search-labs/blog/bbq-implementation-into-use-case#further-learning">seção “Aprendizado adicional”</a> abaixo. Para os propósitos deste blog, o foco está na implementação.<p>Embora a matemática seja fascinante, é crucial entender completamente por que suas buscas vetoriais permanecem precisas. Em última análise, tudo se resume à compressão, já que, com os algoritmos de busca vetorial atuais, o limite é a velocidade de leitura dos dados. Portanto, se você conseguir armazenar todos esses dados na memória, obterá um aumento significativo de velocidade em comparação com a leitura do armazenamento (<a href="https://sre.google/static/pdf/rule-of-thumb-latency-numbers-letter.pdf">a memória é aproximadamente 200 vezes mais rápida que os SSDs</a>).</p><p>Há algumas coisas que você precisa ter em mente:</p><ul><li><p>Índices baseados em gráficos como <a href="https://arxiv.org/pdf/1603.09320">HNSW</a> (Hierarchical Navigable Small World) são os mais rápidos para recuperação de vetores.</p><ul><li><p>HNSW: Um algoritmo de busca aproximado do vizinho mais próximo que constrói uma estrutura de gráfico multicamadas para permitir buscas eficientes de similaridade de alta dimensão.</p></li></ul></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt760bd95c206bfa8f/6a17e2ad505ac393f7ad8a95/590f3b3c72a76023a38a0436cd9ff90a9f80e936-1964x1262.png" alt="HNSW: Um algoritmo de busca aproximado do vizinho mais próximo que constrói uma estrutura de gráfico multicamadas para permitir buscas eficientes de similaridade de alta dimensão." /><ul><li><p>O HNSW é fundamentalmente limitado em velocidade pela velocidade de leitura de dados da memória ou, no pior caso, do armazenamento.</p><ul><li><p>O ideal é que você consiga carregar todos os seus vetores armazenados na memória.</p></li></ul></li><li><p>Os modelos de incorporação geralmente produzem vetores com precisão float32, 4 bytes por número de ponto flutuante.</p></li><li><p>E, finalmente, dependendo de quantos vetores e/ou dimensões você tem, você pode rapidamente ficar sem memória para manter todos os seus vetores.</p></li></ul><p>Considerando isso como certo, você verá que um problema surge rapidamente quando você começa a ingerir milhões ou até bilhões de vetores, cada um com potencialmente centenas ou até milhares de dimensões. A seção intitulada “<a href="https://www.elastic.co/pt/search-labs/blog/bbq-implementation-into-use-case#approximate-numbers-on-the-compression-ratios">Números aproximados sobre as taxas de compressão</a>” fornece alguns números aproximados.</p><h2>O que você precisa para começar?</h2><p>Para começar, você precisará do seguinte:</p><ul><li><p>Se estiver usando o Elastic Cloud ou no local, você precisará de uma versão do Elasticsearch superior a 8.18. Embora o BBQ tenha sido introduzido na versão 8.16, neste artigo, você usará <code>vector_rescore</code>, que foi introduzido na versão 8.18.</p></li><li><p>Além disso, você também precisará garantir que haja um <a href="https://www.elastic.co/pt/guide/en/elasticsearch/reference/8.18/ml-settings.html">nó de aprendizado de máquina (ML)</a> no seu cluster. (Observação: um nó de ML com no mínimo 4 GB é necessário para carregar o modelo, mas você provavelmente precisará de nós muito maiores para cargas de trabalho de produção completas.)</p></li><li><p>Se estiver usando o Serverless, você precisará selecionar uma instância otimizada para vetores.</p></li><li><p>Você também precisará de um nível básico de conhecimento sobre bancos de dados vetoriais. Se você ainda não estiver familiarizado com os conceitos de pesquisa vetorial no Elastic, talvez seja interessante primeiro conferir os seguintes recursos:</p><ul><li><p><a href="https://www.elastic.co/pt/search-labs/blog/elastic-vector-database-practical-example">Navegando em um banco de dados de vetores elásticos</a></p></li><li><p><a href="https://www.elastic.co/pt/blog/retrieval-augmented-generation-explained">As grandes ideias por trás da geração aumentada de recuperação</a></p></li></ul></li></ul><h2>Implementação de Quantização Binária Aprimorada (BBQ)</h2><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt18df00df95ff2ca7/6a17e2af414c6411989450df/4d388078495566f0527e931e0c2e38facdce83c6-1503x748.png" alt="Implementação do Elasticsearch BBQ." /><p>Para manter este blog simples, você usará funções integradas quando elas estiverem disponíveis. Neste caso, você tem o modelo de incorporação vetorial <a href="https://www.elastic.co/pt/guide/en/machine-learning/8.17/ml-nlp-e5.html"><code>.multilingual-e5-small</code></a> que será executado diretamente dentro do Elasticsearch em um nó de aprendizado de máquina. Observe que você pode substituir o modelo <code>text_embedding</code> pelo incorporador de sua escolha (<a href="https://www.elastic.co/pt/guide/en/elasticsearch/reference/8.18/infer-service-openai.html">OpenAI</a>, <a href="https://www.elastic.co/pt/guide/en/elasticsearch/reference/8.18/infer-service-google-ai-studio.html">Google AI Studio</a>, <a href="https://www.elastic.co/pt/guide/en/elasticsearch/reference/8.18/infer-service-cohere.html">Cohere</a> e muitos outros). Se o seu modelo preferido ainda não estiver integrado, você também pode <a href="https://www.elastic.co/pt/guide/en/elasticsearch/reference/8.18/bring-your-own-vectors.html">trazer seus próprios embeddings de vetores densos</a>.)</p><p>Primeiro, você precisará criar um ponto final de inferência para gerar vetores para um determinado trecho de texto. Você executará todos esses comandos no Kibana <a href="https://www.elastic.co/pt/guide/en/kibana/8.18/console-kibana.html">Dev Tools Console</a>. Este comando fará o download do <code>.multilingual-e5-small</code>. Se ainda não existir, ele configurará seu endpoint; isso pode levar um minuto para ser executado. Você pode ver a saída esperada no arquivo <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/01-create-an-inference-endpoint-output.json">01-create-an-inference-endpoint-output.json</a> na pasta Saídas. </p>PUT _inference/text_embedding/my_e5_model
{
  "service": "elasticsearch",
  "service_settings": {
    "num_threads": 1,
    "model_id": ".multilingual-e5-small",
    "adaptive_allocations": {
      "enabled": true,
      "min_number_of_allocations": 1
    }
  }
}<p>Quando isso retornar, seu modelo será configurado e você poderá testar se ele funciona conforme o esperado com o seguinte comando. Você pode ver a saída esperada no arquivo <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/02-embed-text-output.json">02-embed-text-output.json</a> na pasta Saídas.</p>POST _inference/text_embedding/my_e5_model
{
  "input": "my awesome piece of text"
}<p>Se você tiver problemas com seu modelo treinado não sendo alocado a nenhum nó, talvez seja necessário iniciar seu modelo manualmente.</p>POST _ml/trained_models/.multilingual-e5-small/deployment/_start<p>Agora vamos criar um novo mapeamento com 2 propriedades, um campo de texto padrão (<code>my_field</code>) e um campo vetorial denso (<code>my_vector</code>) com 384 dimensões para corresponder à saída do modelo de incorporação. Você também substituirá o <code>index_options.type to bbq_hnsw</code>. Você pode ver a saída esperada no arquivo <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/03-create-byte-qauntized-index-output.json">03-create-byte-qauntized-index-output.json</a> na pasta Saídas.</p>PUT bbq-my-byte-quantized-index
{
  "mappings": {
    "properties": {
      "my_field": {
        "type": "text"
      },
      "my_vector": {
        "type": "dense_vector",
        "dims": 384,
        "index_options": {
          "type": "bbq_hnsw"
        }
      }
    }
  }
}<p>Para garantir que o Elasticsearch gere seus vetores, você pode usar um <a href="https://www.elastic.co/pt/guide/en/elasticsearch/reference/8.18/ingest.html">Ingest Pipeline</a>. Este pipeline exigirá 3 coisas: o ponto final, (<code>model_id</code>), o <code>input_field</code> para o qual você deseja criar vetores e o <code>output_field</code> para armazenar esses vetores. O primeiro comando abaixo criará um pipeline de ingestão de inferência, que usa o <a href="https://www.elastic.co/pt/guide/en/elasticsearch/reference/current/inference-apis.html">serviço de inferência </a>nos bastidores, e o segundo testará se o pipeline está funcionando corretamente. Você pode ver a saída esperada no arquivo <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/04-create-and-simulate-ingest-pipeline-output.json">04-create-and-simulate-ingest-pipeline-output.json</a> na pasta Outputs. </p>PUT _ingest/pipeline/my_inference_pipeline
{
  "processors": [
    {
      "inference": {
        "model_id": "my_e5_model",
        "input_output": [
          {
            "input_field": "my_field",
            "output_field": "my_vector"
          }
        ]
      }
    }
  ]
}

POST _ingest/pipeline/my_inference_pipeline/_simulate
{
  "docs": [
    {
      "_source": {
        "my_field": "my awesome text field"
      }
    }
  ]
}<p>Agora você está pronto para adicionar alguns documentos com os dois primeiros comandos abaixo e testar se suas pesquisas funcionam com o terceiro comando. Você pode verificar a saída esperada no arquivo <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/05-bbq-index-output.json">05-bbq-index-output.json</a> na pasta Outputs. </p>PUT bbq-my-byte-quantized-index/_doc/1?pipeline=my_inference_pipeline
{
    "my_field": "my awesome text field"
}

PUT bbq-my-byte-quantized-index/_doc/2?pipeline=my_inference_pipeline
{
    "my_field": "some other sentence"
}

GET bbq-my-byte-quantized-index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "knn": {
            "field": "my_vector",
            "query_vector_builder": {
              "text_embedding": {
                "model_id": "my_e5_model",
                "model_text": "my awesome search field"
              }
            },
            "k": 10,
            "num_candidates": 100
          }
        }
      ]
    }
  },
  "_source": [
    "my_field"
  ]
}<p>Conforme recomendado <a href="https://www.elastic.co/pt/search-labs/blog/better-binary-quantization-lucene-elasticsearch#lucene-benchmarking">nesta publicação</a>, a repontuação e a sobreamostragem são recomendadas quando você dimensiona para quantidades não triviais de dados porque elas ajudam a manter alta precisão de recall enquanto se beneficiam das vantagens da compressão. A partir da versão 8.18 do Elasticsearch, você pode fazer isso dessa maneira usando <a href="https://www.elastic.co/pt/guide/en/elasticsearch/reference/8.18/knn-search.html#dense-vector-knn-search-rescoring">rescore_vector</a>. A saída esperada está no arquivo <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/06-bbq-search-8-18-output.json">06-bbq-search-8-18-output.json</a> na pasta Outputs.</p>GET bbq-my-byte-quantized-index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "knn": {
            "field": "my_vector",
            "query_vector_builder": {
              "text_embedding": {
                "model_id": "my_e5_model",
                "model_text": "my awesome search field"
              }
            },
            "rescore_vector": {
              "oversample": 3
            },
            "k": 10,
            "num_candidates": 100
          }
        }
      ]
    }
  },
  "_source": [
    "my_field"
  ]
}<p>Como essas pontuações se comparam àquelas que você obteria com dados brutos? Se você fizer tudo acima novamente, mas com <code>index_options.type: hnsw</code>, verá que as pontuações são muito comparáveis. Você pode ver a saída esperada no arquivo <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/07-raw-vector-output.json">07-raw-vector-output.json</a> na pasta Outputs.</p>PUT my-raw-vector-index
{
  "mappings": {
    "properties": {
      "my_field": {
        "type": "text"
      },
      "my_vector": {
        "type": "dense_vector",
        "dims": 384,
        "index_options": {
          "type": "hnsw"
        }
      }
    }
  }
}

PUT my-raw-vector-index/_doc/1?pipeline=my_inference_pipeline
{
    "my_field": "my awesome text field"
}

PUT my-raw-vector-index/_doc/2?pipeline=my_inference_pipeline
{
    "my_field": "some other sentence"
}

GET my-raw-vector-index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "knn": {
            "field": "my_vector",
            "query_vector_builder": {
              "text_embedding": {
                "model_id": "my_e5_model",
                "model_text": "my awesome search field"
              }
            },
            "k": 10,
            "num_candidates": 100
          }
        }
      ]
    }
  },
  "_source": [
    "my_field"
  ]
}<h2>Números aproximados sobre as taxas de compressão</h2><p>Os requisitos de armazenamento e memória podem rapidamente se tornar um desafio significativo ao trabalhar com pesquisa vetorial. A análise a seguir ilustra como diferentes técnicas de quantização reduzem drasticamente o consumo de memória de dados vetoriais.</p><p>Vetores (V)</p><p>Dimensões (D)</p><p>cru (V x D x 4)</p><p>int8 (V x (D x 1 + 4))</p><p>int4 (V x (D x 0,5 + 4))</p><p>churrasco (V x (D x 0,125 + 4))</p><p>10.000.000</p><p>384</p><p>14,31 GB</p><p>3,61 GB</p><p>1,83 GB</p><p>0,58 GB</p><p>50.000.000</p><p>384</p><p>71,53 GB</p><p>18,07 GB</p><p>9,13 GB</p><p>2,89 GB</p><p>100.000.000</p><p>384</p><p>143,05 GB</p><p>36,14 GB</p><p>18,25 GB</p><p>5,77 GB</p><h2>Conclusão</h2><p>BBQ é uma otimização que você pode aplicar aos seus dados vetoriais para compressão sem sacrificar a precisão. Ele funciona convertendo vetores em bits, permitindo que você pesquise os dados de forma eficaz e capacitando você a dimensionar seus fluxos de trabalho de IA para acelerar pesquisas e otimizar o armazenamento de dados.</p><h2>Aprendizagem adicional</h2><p>Se você estiver interessado em aprender mais sobre churrasco, não deixe de conferir os seguintes recursos:</p><ul><li><p><a href="https://www.elastic.co/pt/search-labs/blog/better-binary-quantization-lucene-elasticsearch">Quantização Binária (BBQ) em Lucene e Elasticsearch</a></p></li><li><p><a href="https://www.elastic.co/pt/search-labs/blog/bit-vectors-elasticsearch-bbq-vs-pq">Melhor Quantização Binária (BBQ) vs. Quantização de Produto</a></p></li><li><p><a href="https://www.elastic.co/pt/search-labs/blog/optimized-scalar-quantization-elasticsearch">Quantização Escalar Otimizada: Quantização Binária Ainda Melhor</a></p></li><li><p><a href="https://www.youtube.com/watch?v=04NzMt2Nigc">Melhor Quantização Binária (BBQ): De Bytes a BBQ, O Segredo para uma Melhor Busca Vetorial por Ben Trent</a></p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/bbq-implementation-into-use-case</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/bbq-implementation-into-use-case</guid>
    <category><![CDATA[Banco de dados vetorial]]></category>
    <category><![CDATA[Noções básicas]]></category>
    <dc:creator><![CDATA[Sachin Frayne,Jessica Garson]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3dd0495b536b2615/6a17e2b0414c6488459450e3/66842055367cdd795532b01c167f2a4b03dc65e3-1200x628.png" length="0" type="image/png"/>
    <pubDate>Wed, 23 Apr 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Utilização do tamanho do heap do Elasticsearch e coleta de lixo da JVM]]></title>
    <description><![CDATA[Explorando o uso do tamanho do heap do Elasticsearch e a coleta de lixo da JVM, incluindo as melhores práticas e como resolver problemas quando o uso da memória heap está muito alto ou quando o desempenho da JVM não é ideal.]]></description>
    <content:encoded><![CDATA[<p>O tamanho do heap é a quantidade de RAM alocada para a Máquina Virtual Java de um nó do Elasticsearch.</p><p>A partir da versão 7.11, o Elasticsearch define automaticamente, por padrão, o tamanho do heap da JVM com base nas funções e na memória total de um nó. Para a maioria dos ambientes de produção, recomenda-se o uso do dimensionamento padrão. No entanto, se você quiser definir manualmente o tamanho do heap da JVM, como regra geral, você deve definir -Xms e -Xmx com o MESMO valor, que deve ser 50% da sua RAM total disponível, sujeito a um máximo de (aproximadamente) 31 GB.</p><p>Um tamanho de heap maior dará ao seu nó mais memória para operações de indexação e pesquisa. No entanto, seu nó também requer memória para cache, portanto, usar 50% mantém um equilíbrio saudável entre os dois. Pelo mesmo motivo, em produção, você deve evitar usar outros processos que consomem muita memória no mesmo nó que o Elasticsearch.</p><p>Normalmente, a utilização da memória heap seguirá um padrão em dente de serra, oscilando entre cerca de 30 e 70% da capacidade máxima da heap. Isso ocorre porque a JVM aumenta gradualmente a porcentagem de uso do heap até que o processo de coleta de lixo libere memória novamente. O uso elevado da memória heap ocorre quando o processo de coleta de lixo não consegue acompanhar. Um indicador de alto uso da memória heap é quando a coleta de lixo é incapaz de reduzir o uso da memória heap para cerca de 30%.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt03908d8eea824755/6a17dbe63e03d71e314f2b3e/0a17a67cc589a3c1fbf9e918eadc119df7bd7619-858x278.png" alt="" /><p>Na imagem acima, você pode ver um padrão típico de dente de serra no heap da JVM.</p><p>Você também verá que existem dois tipos de coleta de lixo: coleta de lixo jovem e coleta de lixo antiga.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0d527a7905c78a45/6a17dbe84b055d09484320c2/8df5c24c4894404de4617be7a13683c9027d607d-875x281.png" alt="" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt681db7f60d9dbe40/6a17dbe97f6f152b9bc099f0/e01eb2537310b052580411153b8eddc187d97687-890x264.png" alt="" /><p>Em uma JVM saudável, a coleta de lixo deve idealmente atender às seguintes condições:</p><ul><li><p>O GC jovem é processado rapidamente (em 50 ms).</p></li><li><p>O coletor de lixo jovem não é executado com frequência (cerca de 10 segundos).</p></li><li><p>O GC antigo é processado rapidamente (em menos de 1 segundo).</p></li><li><p>A coleta de lixo antiga não é executada com frequência (uma vez a cada 10 minutos ou mais).</p></li></ul><h3><strong>Como resolver problemas quando o uso da memória heap está muito alto ou quando o desempenho da JVM não está ideal</strong></h3><p>Existem diversos motivos pelos quais o uso da memória heap pode aumentar:</p><h4><strong>Sobrefragmentação</strong></h4><p>Consulte o documento sobre sobreparticionamento <a href="https://www.elastic.co/docs/deploy-manage/production-guidance/optimize-performance/size-shards#sizing-shard-guidelines">aqui</a>.</p><h4><strong>Tamanhos de agregação grandes</strong></h4><p>Para evitar tamanhos de agregação muito grandes, mantenha o número de buckets de agregação (tamanho) em suas consultas no mínimo.</p>GET /_search
{
   "aggs" : {
       "products" : {
           "terms" : {
               "field" : "product",
               "size" : 5
                          }
       }
   }
}<p>Você pode usar o registro de consultas lentas (logs lentos) e implementá-lo em um índice específico usando o seguinte.</p>PUT /my_index/_settings
{
   "index.search.slowlog.threshold.query.warn": "10s",
   "index.search.slowlog.threshold.query.info": "5s",
   "index.search.slowlog.threshold.query.debug": "2s",
   "index.search.slowlog.threshold.query.trace": "500ms",
   "index.search.slowlog.threshold.fetch.warn": "1s",
   "index.search.slowlog.threshold.fetch.info": "800ms",
   "index.search.slowlog.threshold.fetch.debug": "500ms",
   "index.search.slowlog.threshold.fetch.trace": "200ms",
   "index.search.slowlog.level": "info"
}<p>Consultas que demoram muito para retornar resultados provavelmente são as que consomem mais recursos.</p><h4><strong>Tamanho excessivo do índice de volume</strong></h4><p>Se você estiver enviando solicitações grandes, isso pode ser a causa de um alto consumo de memória heap. Tente reduzir o tamanho das solicitações de indexação em lote.</p><h4><strong>Problemas de mapeamento</strong></h4><p>Em particular, se você usar “fielddata: true”, isso pode consumir grande parte da memória heap da sua JVM.</p><h4><strong>Tamanho do heap configurado incorretamente</strong></h4><p>O tamanho do heap pode ser definido manualmente por:</p><p>Definindo a variável de ambiente:</p>ES_JAVA_OPTS="-Xms2g -Xmx2g"<p>Edite o arquivo jvm.options no diretório de configuração do Elasticsearch:</p>-Xms2g
-Xmx2g<p>A configuração da variável de ambiente tem prioridade sobre a configuração do arquivo.</p><p>É necessário reiniciar o nó para que a configuração seja considerada.</p><h4><strong>A nova proporção da JVM foi configurada incorretamente.</strong></h4><p>Geralmente NÃO é necessário configurar isso, pois o Elasticsearch define esse valor por padrão. Este parâmetro define a proporção de espaço disponível para objetos de “nova geração” e de “geração antiga” na JVM.</p><p>Se você perceber que as coletas de lixo antigas estão se tornando muito frequentes, pode tentar definir esse valor especificamente no arquivo jvm.options no diretório de configuração do Elasticsearch.</p>-XX:NewRatio=3<h3><strong>Quais são as melhores práticas para gerenciar o uso do tamanho do heap e a coleta de lixo da JVM em um cluster Elasticsearch de grande porte?</strong></h3><p>As melhores práticas para gerenciar o uso do tamanho do heap e a coleta de lixo da JVM em um cluster Elasticsearch de grande porte consistem em garantir que o tamanho do heap seja definido para, no máximo, 50% da RAM disponível e que as configurações de coleta de lixo da JVM sejam otimizadas para o caso de uso específico. É importante monitorar o tamanho do heap e as métricas de coleta de lixo para garantir que o cluster esteja funcionando de forma otimizada. Especificamente, é importante monitorar o tamanho do heap da JVM, o tempo de coleta de lixo e as pausas na coleta de lixo. Além disso, é importante monitorar o número de ciclos de coleta de lixo e o tempo gasto nessa atividade. Ao monitorar essas métricas, é possível identificar quaisquer problemas potenciais com o tamanho do heap ou com as configurações de coleta de lixo e tomar medidas corretivas, se necessário.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-heap-size-jvm-garbage-collection</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-heap-size-jvm-garbage-collection</guid>
    <category><![CDATA[Noções básicas]]></category>
    <dc:creator><![CDATA[Kofi Bartlett]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc58290fbc9f4efb9/6a1705f97d8d67cae970e632/b162c28623b9070fd1980bcd891b9dd1e868f2f0-720x421.jpg" length="0" type="image/jpeg"/>
    <pubDate>Tue, 22 Apr 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Como aumentar o número de shards primários no Elasticsearch]]></title>
    <description><![CDATA[Aprenda como aumentar o número de shards principais no Elasticsearch usando as APIs split e reindex para ter o redimensionamento ideal de shards.]]></description>
    <content:encoded><![CDATA[<p>Não é possível aumentar o número de shards primários de um índice existente, o que significa que um índice precisa ser recriado se você quiser aumentar a quantidade de shards primários. Geralmente, existem dois métodos utilizados nessas situações: a API _reindex e a API _split.</p><p>A API _split costuma ser um método mais rápido do que a API _reindex. <strong>A indexação</strong> <strong>deve ser interrompida</strong> antes de ambas as operações; caso contrário, as contagens de documentos em source_index e target_index serão diferentes.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt46dd6abe0e6fe1eb/6a17e368148009d6a7b486d3/aa0ae010c2f5691ca00440fb453ed6b47bacd24f-1200x628.png" alt="Aumentando o número de shards no Elasticsearch ao recriar um índice" /><h2>Método 1 – usando a API dividida</h2><p>A API de divisão é usada para criar um novo índice com o número desejado de shards primários, copiando as configurações e mapeando um índice existente. O número desejado de fragmentos primários pode ser definido durante a criação. As seguintes configurações devem ser verificadas antes de implementar a API dividida:</p><ol><li><p>O índice de origem deve ser somente leitura. Isso significa que o processo de indexação precisa ser interrompido.</p></li><li><p>O número de shards primários no índice de destino deve ser um múltiplo do número de shards primários no índice de origem. Por exemplo, se o índice de origem tiver 5 shards primários, o número de shards primários do índice de destino pode ser definido como 10, 15, 20 e assim por diante.</p></li></ol><p>Observação: Se apenas o número do fragmento primário precisar ser alterado, a API de divisão é preferível, pois é muito mais rápida do que a API de reindexação.</p><h3>Implementando a API dividida</h3><p>Criar um índice de teste:</p>POST test_split_source/_doc
{
  "test": "test"
}<p>O índice de origem deve ser somente leitura para poder ser dividido:</p>PUT test_split_source/_settings
{
  "index.blocks.write": true
}<p>As configurações e os mapeamentos serão copiados automaticamente do índice de origem:</p>POST /test_split_source/_split/test_split_target
{
  "settings": {
    "index.number_of_shards": 3
  }
}<p>Você pode verificar o progresso com:</p>GET _cat/recovery/test_split_target?v&amp;h=index,shard,time,stage,files_percent,files_total<p>Como as configurações e os mapeamentos são copiados dos índices de origem, o índice de destino é somente leitura. Vamos habilitar a operação de escrita para o índice de destino:</p>PUT test_split_target/_settings
{
    "index.blocks.write": null
}<p>Verifique a contagem de documentos (docs.count) nos índices de origem e destino antes de excluir o índice original:</p>GET _cat/indices/test_split*?v&amp;h=index,pri,rep,docs.count<p>O nome do índice e o nome do alias não podem ser iguais. Você precisa excluir o índice de origem e adicionar o nome do índice de origem como um alias para o índice de destino:</p>DELETE test_split_source
PUT /test_split_target/_alias/test_split_source<p>Após adicionar o alias <strong>test_split_source</strong> ao índice <strong>test_split_target</strong> , você deve testá-lo com:</p>GET test_split_source
POST test_split_source/_doc
{
  "test": "test"
}<h2>Método 2 – usando a API de reindexação</h2><p>Ao criar um novo índice com a API Reindex, é possível definir qualquer número de shards primários. Após a criação de um novo índice com o número desejado de shards primários, todos os dados do índice de origem podem ser reindexados para esse novo índice.</p><p>Além dos recursos de API dividida, os dados podem ser manipulados usando o ingest_pipeline no AP de reindexação. Com o pipeline de ingestão, somente os campos especificados que correspondem ao filtro serão indexados no índice de destino usando a consulta. O conteúdo dos dados pode ser alterado usando um script simples, e vários índices podem ser mesclados em um único índice.</p><h3>Implementando a API de reindexação</h3><p>Criar um reindexador de teste:</p>POST test_reindex_source/_doc
{
    "test": "test"
}<p>Copie as configurações e os mapeamentos do índice de origem:</p>GET test_reindex_source<p>Crie um índice de destino com configurações, mapeamentos e a quantidade desejada de fragmentos (shards):</p>PUT test_reindex_target
{
  "mappings" : {},
  "settings": {
    "number_of_shards": 10,
    "number_of_replicas": 0,
    "refresh_interval": -1
  }
}<p>*Nota: definir number_of_replicas: 0 e refresh_interval: -1 aumentará a velocidade de reindexação.</p><p>Inicie o processo de reindexação. Definir requests_per_second=-1 e slices=auto ajustará a velocidade de reindexação.</p>POST _reindex?requests_per_second=-1&amp;slices=auto&amp;wait_for_completion=false
{
  "source": {
    "index": "test_reindex_source"
  },
  "dest": {
    "index": "test_reindex_target"
  }
}<p>Você verá o task_id ao executar a API de reindexação. Copie isso e verifique com a API _tasks:</p>GET _tasks/&lt;task_id&gt;<p>Atualize as configurações após a conclusão da reindexação:</p>PUT test_reindex_target/_settings
{
  "number_of_replicas": 1,
  "refresh_interval": "1s"
}<p>Antes de excluir o índice original, verifique o número de documentos (docs.count) nos índices de origem e destino; eles devem ser iguais.</p>GET _cat/indices/test_reindex_*?v&amp;h=index,pri,rep,docs.count<p>O nome do índice e o nome do alias não podem ser iguais. Exclua o índice de origem e adicione o nome do índice de origem como um alias para o índice de destino:</p>DELETE test_reindex_source
PUT /test_reindex_target/_alias/test_reindex_source<p>Após adicionar o alias test_split_source ao índice test_split_target, teste-o usando:</p>GET test_reindex_source<h2>Resumo</h2><p>Se você deseja aumentar o número de shards primários de um índice existente, precisa recriar as configurações e os mapeamentos para um novo índice. Existem dois métodos principais para fazer isso: a API de reindexação e a API de divisão. A indexação ativa deve ser interrompida antes de usar qualquer um dos métodos.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-increase-primary-shard-count</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-increase-primary-shard-count</guid>
    <category><![CDATA[Noções básicas]]></category>
    <dc:creator><![CDATA[Kofi Bartlett]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta8aa774fc00d7233/6a17e223dbb4ff68b3fb5611/7034b76019a0cba52c25eda29fceb18afc96ed0b-720x420.png" length="0" type="image/png"/>
    <pubDate>Thu, 17 Apr 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Como migrar dados entre diferentes versões do Elasticsearch e entre clusters]]></title>
    <description><![CDATA[Explorando métodos para transferência de dados entre versões e clusters do Elasticsearch.]]></description>
    <content:encoded><![CDATA[<p>Quando você deseja atualizar um cluster do Elasticsearch, às vezes é mais fácil criar um novo cluster separado e transferir dados do cluster antigo para o novo. Isso oferece aos usuários a vantagem de poder testar todos os seus dados e configurações no novo cluster com todos os seus aplicativos, sem qualquer risco de tempo de inatividade ou perda de dados.</p><p>As desvantagens dessa abordagem são que ela requer alguma duplicação de hardware e pode criar dificuldades ao tentar transferir e sincronizar todos os dados sem problemas.</p><p>Também pode ser necessário realizar um procedimento semelhante se você precisar migrar aplicativos de um data center para outro.</p><p>Neste artigo, discutiremos e detalharemos três maneiras de transferir dados entre clusters do Elasticsearch.</p><p><strong>Como migrar dados entre clusters do Elasticsearch?</strong></p><p>Há 3 maneiras de transferir dados entre clusters do Elasticsearch:</p><ol><li><p><a href="https://www.elastic.co/pt/search-labs/blog/elasticsearch-migrate-data-versions-clusters#1.-reindexing-data-from-a-remote-cluster">Reindexação de um cluster remoto</a></p></li><li><p><a href="https://www.elastic.co/pt/search-labs/blog/elasticsearch-migrate-data-versions-clusters#2.-transferring-data-using-snapshots">Transferindo dados usando snapshots</a></p></li><li><p><a href="https://www.elastic.co/pt/search-labs/blog/elasticsearch-migrate-data-versions-clusters#3.-transferring-data-using-logstash">Transferindo dados usando Logstash</a></p></li></ol><p>Usar snapshots geralmente é a maneira mais rápida e confiável de transferir dados. No entanto, tenha em mente que você só pode restaurar um snapshot em um cluster de uma versão igual ou superior e nunca com uma diferença de mais de uma versão principal. Isso significa que você pode restaurar um snapshot 6.x em um cluster 7.x, mas não em um cluster 8.x.</p><p>Se precisar aumentar em mais de uma versão principal, você precisará reindexar ou usar o Logstash.</p><p>Agora, vamos analisar detalhadamente cada uma das três opções para transferir dados entre clusters do Elasticsearch.</p><h2>1. Reindexando dados de um cluster remoto</h2><p>Antes de começar a reindexar, lembre-se de que você precisará configurar mapeamentos apropriados para todos os índices no novo cluster. Para fazer isso, você deve criar os índices diretamente com os mapeamentos apropriados ou usar modelos de índice.</p><h3>Reindexação remota — configuração necessária</h3><p>Para reindexar remotamente, você deve adicionar a configuração abaixo ao arquivo elasticsesearch.yml do cluster que está recebendo os dados, que, em sistemas Linux, geralmente está localizado aqui: /etc/elasticsearch/elasticsearch.yml. A configuração a ser adicionada é a seguinte:</p>reindex.remote.whitelist: "192.168.1.11:9200"<p>Se estiver usando SSL, você deve adicionar o certificado CA a cada nó e incluir o seguinte no comando para cada nó em elasticsearch.yml:</p>reindex.ssl.certificate_authorities: “/path/to/ca.pem”<p>Como alternativa, você pode adicionar a linha abaixo a todos os nós do Elasticsearch para desabilitar a verificação SSL. Entretanto, essa abordagem é menos recomendada, pois não é tão segura quanto a opção anterior:</p>reindex.remote.whitelist: "192.168.1.11:9200"
reindex.ssl.verification_mode: none
systemctl restart elasticsearch service <p>Você precisará fazer essas modificações em cada nó e executar uma reinicialização contínua. Para mais informações sobre como fazer isso, consulte <a href="https://www.elastic.co/pt/guide/en/elasticsearch/reference/8.17/restart-cluster.html#restart-cluster-rolling">nosso guia</a>.</p><h3>Comando de reindexação</h3><p>Depois de definir o host remoto no arquivo elasticsearch.yml e adicionar os certificados SSL, se necessário, você pode começar a reindexar os dados com o comando abaixo:</p>POST _reindex
{
  "source": {
    "remote": {
      "host": "http://192.168.1.11:9200",
      "username": "elastic",
      "password": "123456",
     "socket_timeout": "1m",
      "connect_timeout": "1m"

    },
    "index": "companydatabase"
  },
  "dest": {
    "index": "my-new-index-000001"
  }
}<p>Ao fazer isso, você pode enfrentar erros de tempo limite, então pode ser útil estabelecer valores generosos para tempos limite em vez de depender de padrões.</p><p>Agora, vamos dar uma olhada em alguns outros erros comuns que você pode encontrar ao reindexar remotamente.</p><h3>Erros comuns ao reindexar remotamente</h3><h4>1. Reindexação não permitida</h4>{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "[192.168.1.11:9200] not whitelisted in reindex.remote.whitelist"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "[192.168.1.11:9200] not whitelisted in reindex.remote.whitelist"
  },
  "status": 400
}<p>Se você encontrar esse erro, isso indica que você não definiu o endereço IP do host remoto ou o DNS do nome do nó no Elasticsearch conforme descrito acima ou esqueceu de reiniciar os serviços do Elasticsearch.</p><p>Para corrigir isso no cluster do Elasticsearch, você precisa adicionar o host remoto a todos os nós do Elasticsearch e reiniciar os serviços do Elasticsearch.</p><h4>2. Exceção de handshake SSL</h4>{
  "error": {
    "root_cause": [
      {
        "type": "s_s_l_handshake_exception",
        "reason": "PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target"
      }
    ],
    "type": "s_s_l_handshake_exception",
    "reason": "PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target",
    "caused_by": {
      "type": "validator_exception",
      "reason": "PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target",
      "caused_by": {
        "type": "sun_cert_path_builder_exception",
        "reason": "unable to find valid certification path to requested target"
      }
    }
  },
  "status": 500
}<p>Este erro significa que você esqueceu de adicionar reindex.ssl.certificate_authorities ao elasticsearch.yml, conforme descrito acima. Para adicioná-lo:</p>#elasticsearch.yml
reindex.ssl.certificate_authorities: "/path/to/ca.pem"<h2>2. Transferindo dados usando snapshots</h2><p>Lembre-se, como mencionado acima, você só pode restaurar um snapshot em um cluster de uma versão igual ou superior e nunca com uma diferença de mais de uma versão principal</p><p>Se precisar aumentar em mais de uma versão principal, você precisará reindexar ou usar o Logstash.</p><p>As seguintes etapas são necessárias para transferir dados por meio de snapshots:</p><p>Etapa 1. Adicionando o plugin do repositório ao primeiro cluster do Elasticsearch – Para transferir dados entre clusters por meio de snapshots, você precisa garantir que o repositório seja acessível tanto pelo cluster novo quanto pelo antigo. Repositórios de armazenamento em nuvem como AWS, Google e Azure geralmente são ideais para isso. Para tirar instantâneos, consulte <a href="https://www.elastic.co/pt/guide/en/elasticsearch/reference/current/snapshot-restore.html">nosso guia</a> e siga os passos descritos.</p><p>Etapa 2. Reinicie o serviço Elasticsearch (reinicialização contínua).</p><p>Etapa 3. Crie um repositório para o primeiro cluster do Elasticsearch.</p><p>Etapa 4 - Adicione o plugin do repositório ao segundo cluster do Elasticsearch.</p><p>Etapa 5 - Adicionar repositório como somente leitura ao segundo cluster do Elasticsearch – Você precisará adicionar um repositório repetindo as mesmas etapas executadas para criar o primeiro cluster do Elasticsearch.</p><p>Observação importante: ao conectar o segundo cluster do Elasticsearch ao mesmo repositório do AWS S3, você deve definir o repositório como um repositório somente leitura:</p>PUT _snapshot/my_s3_repository
{
  "type": "s3",
  "settings": {
    "bucket": "my-analytic-data",
    "endpoint": "s3.eu-de.cloud-object-storage.appdomain.cloud",
    "readonly": "true"
  }
}<p>Isso é importante porque você quer evitar o risco de misturar versões do Elasticsearch dentro do mesmo repositório de snapshots.</p><p>Etapa 6 - Restaurando dados para o segundo cluster do Elasticsearch – Após seguir as etapas acima, você pode restaurar os dados e transferi-los para o novo cluster. Siga as etapas descritas <a href="https://www.elastic.co/pt/guide/en/elasticsearch/reference/current/snapshot-restore.html">neste artigo</a> para restaurar dados no novo cluster. </p><h2>3. Transferindo dados usando Logstash</h2><p>Antes de começar a transferir os dados com o logstash, lembre-se de que você precisará configurar mapeamentos apropriados para todos os índices no novo cluster. Para fazer isso, você precisará criar os índices diretamente ou usar modelos de índice.</p><p>Para transferir dados entre dois clusters do Elasticsearch, você pode configurar um servidor Logstash temporário e usá-lo para transferir seus dados entre dois clusters. Para clusters pequenos, uma instância de 2 GB de RAM deve ser suficiente. Para clusters maiores, você pode usar CPUs de quatro núcleos com 8 GB de RAM.</p><p>Para obter orientações sobre como instalar o Logstash, <a href="https://www.elastic.co/pt/guide/en/logstash/current/installing-logstash.html">clique aqui</a>.</p><h3>Configuração do Logstash para transferência de dados de um cluster para outro</h3><p>Uma configuração básica para copiar um único índice do cluster A para o cluster B é:</p>iinput
{
elasticsearch
      {
        hosts =&gt; ["192.168.1.11:9200"]
        index =&gt; "index_name"
       docinfo =&gt; true      
      }
}

output 
{
  elasticsearch {
        hosts =&gt; "https://192.168.1.12:9200"
        index =&gt; "index_name"
        
  }
}<p>Para um Elasticsearch seguro, você pode usar a configuração abaixo:</p>input
{
  elasticsearch
      {
        hosts =&gt; ["192.168.1.11:9200"]
        index =&gt; "index_name"
        docinfo =&gt; true 
        user =&gt; "elastic"
        password =&gt; "elastic_password"
        ssl =&gt; true
        ssl_certificate_verification =&gt; false
            
      }
}

output 
{
  elasticsearch {
        hosts =&gt; "https://192.168.1.12:9200"
        index =&gt; "index_name"
        user =&gt; "elastic"
        password =&gt; "elastic_password"
        ssl =&gt; true
        ssl_certificate_verification =&gt; false
  }
}<h3>Metadados de índice</h3><p>Os comandos acima gravarão em um único índice nomeado. Se você quiser transferir vários índices e preservar os nomes dos índices, será necessário adicionar a seguinte linha à saída do Logstash:</p>index =&gt; "%{[@metadata][_index]}"<p>Além disso, se você quiser preservar a identificação original do documento, será necessário adicionar:</p>document_id =&gt; "%{[@metadata][_id]}"<p>Tenha em mente que definir o ID do documento tornará a transferência de dados significativamente mais lenta, portanto, preserve o ID original somente se necessário.</p><h2>Sincronização de atualizações</h2><p>Todos os métodos descritos acima levarão um período de tempo relativamente longo, e você poderá descobrir que os dados no cluster original foram atualizados enquanto aguardava a conclusão do processo.</p><p>Existem várias estratégias para permitir a sincronização de quaisquer atualizações que possam ter ocorrido durante o processo de transferência de dados, e você deve pensar sobre essas questões antes de iniciar o processo. Em particular, você precisa pensar sobre:</p><ul><li><p>Qual método você usa para identificar quaisquer dados que foram atualizados/adicionados desde o início do processo de transferência de dados (por exemplo, um campo “last_update_time” nos dados)?</p></li><li><p>Que método você pode usar para transferir o último pedaço de dados?</p></li><li><p>Existe risco de registros serem duplicados? Geralmente, existe, a menos que o método que você está usando defina o ID do documento durante a reindexação para um valor conhecido).</p></li></ul><p>Os diferentes métodos para habilitar a sincronização de atualizações são descritos abaixo.</p><h3>1. Utilização de sistemas de filas</h3><p>Alguns sistemas de ingestão/atualização usam filas que permitem que você “reproduza” modificações de dados recebidas nos últimos x dias. Isso pode fornecer um meio de sincronizar quaisquer alterações realizadas. </p><h3>2. Reindexar remotamente</h3><p>Repita o processo de reindexação para todos os itens em que “last_update_time” &gt; x dias atrás. Você pode fazer isso adicionando um parâmetro “consulta” à solicitação de reindexação.</p><h3>3. Logstash</h3><p>Na entrada do Logstash, você pode adicionar uma consulta para filtrar todos os itens em que “last_update_time” &gt; x dias atrás. No entanto, esse processo causará duplicatas em dados não temporais, a menos que você tenha definido o document_id.</p><h3>4. Instantâneos</h3><p>Não é possível restaurar apenas parte de um índice, então você teria que usar um dos outros métodos de transferência de dados descritos acima (ou um script) para atualizar quaisquer alterações que tenham ocorrido desde que o processo de transferência de dados foi realizado.</p><p>No entanto, a restauração de snapshots é um processo muito mais rápido do que a reindexação/Logstash, então pode ser possível suspender as atualizações por um breve período de tempo enquanto os snapshots são transferidos para evitar o problema completamente.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-migrate-data-versions-clusters</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-migrate-data-versions-clusters</guid>
    <category><![CDATA[Noções básicas]]></category>
    <dc:creator><![CDATA[Kofi Bartlett]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfc041ebca11476c6/6a16f70560084b31b93c4344/01fde3b1d714f12bf8673140c9f2f940d443de31-1440x823.jpg" length="0" type="image/jpeg"/>
    <pubDate>Mon, 14 Apr 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Como automatizar a busca e o upload de sinônimos usando nossa API de Sinônimos.]]></title>
    <description><![CDATA[Descubra como os LLMs podem ser usados para identificar e gerar sinônimos automaticamente, permitindo que os termos sejam carregados programaticamente na API de sinônimos do Elasticsearch.]]></description>
    <content:encoded><![CDATA[<p>Melhorar a qualidade dos resultados de pesquisa é essencial para proporcionar uma experiência de usuário eficiente. Uma forma de otimizar as buscas é expandindo automaticamente os termos pesquisados por meio de sinônimos. Isso permite que as consultas sejam interpretadas de forma mais abrangente, abrangendo variações de idioma e, assim, melhorando a correspondência dos resultados.</p><p>Este blog explora como grandes modelos de linguagem (LLMs) podem ser usados para identificar e gerar sinônimos automaticamente, permitindo que esses termos sejam carregados programaticamente na API de sinônimos do Elasticsearch.</p><h2>Quando usar sinônimos?</h2><p>O uso de sinônimos pode ser uma solução mais rápida e econômica em comparação com a busca vetorial. Sua implementação é mais simples, pois não requer conhecimento profundo de embeddings ou um processo complexo de ingestão de vetores.</p><p>Além disso, o consumo de recursos é menor, uma vez que a busca vetorial exige maior capacidade de armazenamento e memória para indexação e recuperação de dados.</p><p>Outro aspecto importante é a regionalização da busca. Com sinônimos, é possível adaptar os termos de acordo com o idioma e os costumes locais. Isso é útil em situações em que os embeddings podem não corresponder a expressões regionais ou termos específicos de cada país. Por exemplo, algumas palavras ou siglas podem ter significados diferentes dependendo da região, mas são naturalmente tratadas como sinônimos pelos usuários locais. No Brasil, isso é bastante comum. "Abacaxi" e "ananás" são a mesma fruta (abacaxi), mas o segundo termo é mais comumente usado em algumas regiões do Nordeste. Da mesma forma, o conhecido "pão francês" no Sudeste pode ser conhecido como "pão careca" no Nordeste.</p><h2>Como usar LLMs para gerar sinônimos?</h2><p>Para obter sinônimos automaticamente, podemos usar Modelos de Aprendizagem Baseados em Lógica (LLMs), que analisam o contexto de um termo e sugerem variações apropriadas. Essa abordagem permite a expansão dinâmica de sinônimos, garantindo uma busca mais ampla e precisa sem depender de um dicionário fixo.</p><p>Nesta demonstração, usaremos um modelo de linguagem natural (LLM) para gerar sinônimos para produtos de comércio eletrônico. Muitas pesquisas retornam poucos ou nenhum resultado devido a variações nos termos pesquisados. Com sinônimos, podemos resolver esse problema. Por exemplo, uma busca por "smartphone" pode abranger diferentes modelos de celulares, garantindo que os usuários encontrem os produtos que procuram.</p><h3>Pré-requisitos</h3><p>Antes de começarmos, precisamos configurar o ambiente e definir as dependências necessárias. Utilizaremos a solução fornecida pela Elastic para <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/run-elasticsearch-locally.html">executar o Elasticsearch e o Kibana localmente em um contêiner Docker</a>. O código será escrito em Python, versão 3.9.6, com as seguintes dependências:</p>pip install openai==1.59.8 elasticsearch==8.15.1<h3>Criando o índice de produtos</h3><p>Inicialmente, criaremos um índice de produtos sem suporte a sinônimos. Isso nos permitirá validar as consultas e compará-las com um índice que inclui sinônimos.</p><p>Para criar o índice, carregamos em massa um conjunto de dados de produtos usando o seguinte comando no Kibana DevTools:</p>POST _bulk
{"index": {"_index": "products", "_id": 10001}}
{"category": "Electronics", "name": "iPhone 14 Pro"}
{"index": {"_index": "products", "_id": 10007}}
{"category": "Electronics", "name": "MacBook Pro 16-inch"}
{"index": {"_index": "products", "_id": 10013}}
{"category": "Electronics", "name": "Samsung Galaxy Tab S8"}
{"index": {"_index": "products", "_id": 10037}}
{"category": "Electronics", "name": "Apple Watch Series 8"}
{"index": {"_index": "products", "_id": 10049}}
{"category": "Electronics", "name": "Kindle Paperwhite"}
{"index": {"_index": "products", "_id": 10067}}
{"category": "Electronics", "name": "Samsung QLED 4K TV"}
{"index": {"_index": "products", "_id": 10073}}
{"category": "Electronics", "name": "HP Spectre x360 Laptop"}
{"index": {"_index": "products", "_id": 10079}}
{"category": "Electronics", "name": "Apple AirPods Pro"}
{"index": {"_index": "products", "_id": 10115}}
{"category": "Electronics", "name": "Amazon Echo Show 10"}
{"index": {"_index": "products", "_id": 10121}}
{"category": "Electronics", "name": "Apple iPad Air"}
{"index": {"_index": "products", "_id": 10127}}
{"category": "Electronics", "name": "Apple AirPods Max"}
{"index": {"_index": "products", "_id": 10151}}
{"category": "Electronics", "name": "Sony WH-1000XM4 Headphones"}
{"index": {"_index": "products", "_id": 10157}}
{"category": "Electronics", "name": "Google Pixel 6 Pro"}
{"index": {"_index": "products", "_id": 10163}}
{"category": "Electronics", "name": "Apple MacBook Air"}
{"index": {"_index": "products", "_id": 10181}}
{"category": "Electronics", "name": "Google Pixelbook Go"}
{"index": {"_index": "products", "_id": 10187}}
{"category": "Electronics", "name": "Sonos Beam Soundbar"}
{"index": {"_index": "products", "_id": 10199}}
{"category": "Electronics", "name": "Apple TV 4K"}
{"index": {"_index": "products", "_id": 10205}}
{"category": "Electronics", "name": "Samsung Galaxy Watch 4"}
{"index": {"_index": "products", "_id": 10211}}
{"category": "Electronics", "name": "Apple MacBook Pro 16-inch"}
{"index": {"_index": "products", "_id": 10223}}
{"category": "Electronics", "name": "Amazon Echo Dot (4th Gen)"}<h3>Gerando sinônimos com LLM</h3><p>Nesta etapa, utilizaremos um modelo de lógica latente (LLM) para gerar sinônimos dinamicamente. Para atingir esse objetivo, integraremos a API da OpenAI, definindo um modelo e um prompt adequados. O LLM receberá a categoria e o nome do produto, garantindo que os sinônimos sejam contextualmente relevantes.</p>import json
import logging

from openai import OpenAI

def call_gpt(prompt, model):
    try:
        logging.info("generate synonyms by llm...")
        response = client.chat.completions.create(
            model=model,
            messages=[{"role": "user", "content": prompt}],
            temperature=0.7,
            max_tokens=1000
        )
        content = response.choices[0].message.content.strip()
        return content
    except Exception as e:
        logging.error(f"Failed to use model: {e}")
        return None

def generate_synonyms(category, products):
   synonyms = {}

   for product in products:
       prompt = f"You are an expert in generating synonyms for products. Based on the category and product name provided, generate synonyms or related terms. Follow these rules:\n"
       prompt += "1. **Format**: The first word should be the main item (part of the product name, excluding the brand), followed by up to 3 synonyms separated by commas.\n"
       prompt += "2. **Exclude the brand**: Do not include the brand name in the synonyms.\n"
       prompt += "3. **Maximum synonyms**: Generate a maximum of 3 synonyms per product.\n\n"
       prompt += f"The category is: **{category}**, and the product is: **{product}**. Return only the synonyms in the requested format, without additional explanations."

       response = call_gpt(prompt, "gpt-4o")
       synonyms[product] = response

   return synonyms<p>A partir do índice de produtos criado, recuperaremos todos os itens da categoria "Eletrônicos" e enviaremos seus nomes para o LLM. O resultado esperado será algo como:</p>{
  "iPhone 14 Pro": ["iPhone", "smartphone", "mobile", "handset"],
  "MacBook Pro 16-inch": ["MacBook", "Laptop", "Notebook", "Ultrabook"],
  "Samsung Galaxy Tab S8": ["Tab", "Tablet", "Slate", "Pad"],
  "Bose QuietComfort 35 Headphones": ["Headphones", "earphones", "earbuds", "headset"]
}<p>Com os sinônimos gerados, podemos registrá-los no Elasticsearch usando a API de Sinônimos.</p><h3>Gerenciando sinônimos com a API de Sinônimos</h3><p>A API de Sinônimos oferece uma maneira eficiente de gerenciar conjuntos de sinônimos diretamente dentro do sistema. Cada conjunto de sinônimos consiste em regras de sinonímia, onde um grupo de palavras é tratado como equivalente nas buscas.</p><p><strong>Exemplo de criação de um conjunto de sinônimos</strong></p>PUT _synonyms/my-synonyms-set
{
  "synonyms_set": [
    {
      "id": "rule-1",
      "synonyms": "hello, hi"
    },
    {
      "synonyms": "bye, goodbye"
    }
  ]
}<p>
Isso cria um conjunto chamado "meu-conjunto-de-sinônimos", onde "olá" e "oi" são tratados como equivalentes, assim como "tchau" e "adeus".</p><h2>Implementação da criação de sinônimos para o catálogo de produtos.</h2><p>A seguir, está o método responsável por construir um conjunto de sinônimos e inseri-lo no Elasticsearch. As regras de sinônimos são geradas com base no mapeamento de sinônimos sugerido pelo LLM. Cada regra possui um ID, correspondente ao nome do produto no formato slug, e a lista de sinônimos calculada pelo LLM.</p>import json
import logging

from elasticsearch import Elasticsearch
from slugify import slugify

es = Elasticsearch(
    "http://localhost:9200",
    api_key="your_api_key"
)

def mount_synonyms(results):
   synonyms_set = [{"id": slugify(product), "synonyms": synonyms} for product, synonyms in
                   results.items()]

   try:
       response = es.synonyms.put_synonym(id="products-synonyms-set",
                                                 synonyms_set=synonyms_set)

       logging.info(json.dumps(response.body, indent=4))
       return response.body
   except Exception as e:
       logging.error(f"Error create synonyms: {str(e)}")
       return None<p>A seguir, está a carga útil da solicitação para criar o conjunto de sinônimos:</p>{
   "synonyms_set":[
      {
         "id": "iphone-14-pro",
         "synonyms": "iPhone, smartphone, mobile, handset"
      },
      {
         "id": "macbook-pro-16-inch",
         "synonyms": "MacBook, Laptop, Notebook, Computer"
      },
      {
         "id": "samsung-galaxy-tab-s8",
         "synonyms": "Tablet, Slate, Pad, Device"
      },
      {
         "id": "garmin-forerunner-945",
         "synonyms": "Forerunner, smartwatch, fitness watch, GPS watch"
      },
      {
         "id": "bose-quietcomfort-35-headphones",
         "synonyms": "Headphones, Earphones, Headset, Cans"
      }
   ]
}<p>Com o conjunto de sinônimos criado no cluster, podemos prosseguir para a próxima etapa, que é a criação de um novo índice com suporte a sinônimos usando o conjunto definido.</p><p>O código Python completo, com os sinônimos gerados pelo LLM e a criação do conjunto de sinônimos definida pela API de Sinônimos, encontra-se abaixo:</p>import json
import logging

from elasticsearch import Elasticsearch
from openai import OpenAI
from slugify import slugify

logging.basicConfig(level=logging.INFO)

client = OpenAI(
   api_key="your-key",
)

es = Elasticsearch(
    "http://localhost:9200",
    api_key="your_api_key"
)


def call_gpt(prompt, model):
   try:
       logging.info("generate synonyms by llm...")
       response = client.chat.completions.create(
           model=model,
           messages=[{"role": "user", "content": prompt}],
           temperature=0.7,
           max_tokens=1000
       )
       content = response.choices[0].message.content.strip()
       return content
   except Exception as e:
       logging.error(f"Failed to use model: {e}")
       return None


def generate_synonyms(category, products):
   synonyms = {}

   for product in products:
       prompt = f"You are an expert in generating synonyms for products. Based on the category and product name provided, generate synonyms or related terms. Follow these rules:\n"
       prompt += "1. **Format**: The first word should be the main item (part of the product name, excluding the brand), followed by up to 3 synonyms separated by commas.\n"
       prompt += "2. **Exclude the brand**: Do not include the brand name in the synonyms.\n"
       prompt += "3. **Maximum synonyms**: Generate a maximum of 3 synonyms per product.\n\n"
       prompt += f"The category is: **{category}**, and the product is: **{product}**. Return only the synonyms in the requested format, without additional explanations."

       response = call_gpt(prompt, "gpt-4o")
       synonyms[product] = response

   return synonyms


def get_products(category):
   query = {
       "size": 50,
       "_source": ["name"],
       "query": {
           "bool": {
               "filter": [
                   {
                       "term": {
                           "category.keyword": category
                       }
                   }
               ]
           }
       }
   }
   response = es.search(index="products", body=query)

   if response["hits"]["total"]["value"] &gt; 0:
       product_names = [hit["_source"]["name"] for hit in response["hits"]["hits"]]
       return product_names
   else:
       return []


def mount_synonyms(results):
   synonyms_set = [{"id": slugify(product), "synonyms": synonyms} for product, synonyms in
                   results.items()]

   try:
       es_client = get_client_es()
       response = es_client.synonyms.put_synonym(id="products-synonyms-set",
                                                 synonyms_set=synonyms_set)

       logging.info(json.dumps(response.body, indent=4))
       return response.body
   except Exception as e:
       logging.error(f"Erro update synonyms: {str(e)}")
       return None


if __name__ == '__main__':
   category = "Electronics"
   products = get_products("Electronics")
   llm_synonyms = generate_synonyms(category, products)
   mount_synonyms(llm_synonyms)<h3>Criando um índice com suporte a sinônimos</h3><p>Um novo índice será criado onde todos os dados do índice <code>products</code> serão reindexados. Este índice usará o <code>synonyms_filter</code>, que aplica o <code>products-synonyms-set</code> criado anteriormente.</p><p>A seguir, o mapeamento de índice configurado para usar sinônimos:</p>PUT products_02
{
  "settings": {
    "analysis": {
      "filter": {
        "synonyms_filter": {
          "type": "synonym",
          "synonyms_set": "products-synonyms-set",
          "updateable": true
        }
      },
      "analyzer": {
        "synonyms_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "synonyms_filter"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "ID": {
        "type": "long"
      },
      "category": {
        "type": "keyword"
      },
      "name": {
        "type": "text",
        "analyzer": "standard",
        "search_analyzer": "synonyms_analyzer"
      }
    }
  }
}<h3>Reindexando o índice <code>products</code></h3><p>Agora, usaremos a <strong>API Reindex</strong> para migrar os dados do índice <code>products</code> para o novo índice <code>products_02</code> , que inclui suporte a sinônimos. O seguinte código foi executado no Kibana DevTools:
</p>POST _reindex
{
  "source": {
    "index": "products"
  },
  "dest": {
    "index": "products_02"
  }
}<p>Após a migração, o índice <code>products_02</code> será preenchido e estará pronto para validar pesquisas usando o conjunto de sinônimos configurado.</p><h3>Validação da pesquisa com sinônimos</h3><p>Vamos comparar os resultados da pesquisa entre os dois índices. Executaremos a mesma consulta em ambos os índices e validaremos se os sinônimos estão sendo usados para recuperar os resultados.</p><h4>Pesquisar no índice <code>products</code> (sem sinônimos)</h4><p>Usaremos o Kibana para realizar buscas e analisar os resultados. No menu Analytics &gt; Discovery, criaremos uma visualização de dados para visualizar os dados dos índices que criamos.</p><p>Dentro do Discovery, clique em Visualização de Dados e defina um nome e um padrão de índice. Para o índice "<strong>produtos</strong>", usaremos o padrão "<strong>produtos</strong> ". Em seguida, repetiremos o processo para criar uma nova visualização de dados para o índice "<strong>products_02</strong>", usando o padrão "<strong>products_02"</strong> .</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte826fd932cfeb9df/6a17fdffec0f8912aa5a6841/3ad4a6891a3905e96532a312932fdf3a8216aec2-1600x599.png" alt="" /><p>Com as visualizações de dados configuradas, podemos retornar a Analytics &gt; Discovery e iniciar as validações.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltba3729c60068e8a0/6a17fe01e9ea87ba2aa9c82a/422c4b2b51abae6580cad25085d1b8a365fc6b9e-1294x850.png" alt="" /><p>Aqui, após selecionar os produtos DataView e pesquisar pelo termo "tablet", não obtemos resultados, embora saibamos que existem produtos como "Kindle Paperwhite" e "Apple iPad Air".</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2c6a383dd4cb0157/6a17fe02577262671d1bce0c/e4ae3a785fdd93f48d7c7d204185ded149126f2c-1600x862.png" alt="" /><h4>Pesquisar no índice <code>products_02</code> (suporta sinônimos)</h4><p>Ao executar a mesma consulta na visualização de dados "<strong>products_synonyms</strong>", que suporta sinônimos, os produtos foram recuperados com sucesso. Isso demonstra que o conjunto de sinônimos configurado está funcionando corretamente, garantindo que diferentes variações dos termos pesquisados retornem os resultados esperados.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt986b4706e2f70014/6a17fe043e9e454edbba16d3/e609749c39e90d5c82fa846af6124679dd62bcb8-1600x526.png" alt="" /><p>Podemos obter o mesmo resultado executando a mesma consulta diretamente no Kibana DevTools. Basta pesquisar o índice products_02 usando a API de pesquisa do Elasticsearch:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbe829a3c4d7aac60/6a17fe05e8fbce03d73a1bd7/504d0d1f96dcfbceb309063dc0716bcee64ad2f8-1600x870.png" alt="" /><h2>Conclusão</h2><p>A implementação de sinônimos no Elasticsearch melhorou a precisão e a abrangência das buscas no catálogo de produtos. O principal diferencial foi o uso de um <strong>LLM (</strong> Language-Level Model), que gerou sinônimos automaticamente e contextualmente, eliminando a necessidade de listas predefinidas. O modelo analisou nomes e categorias de produtos, garantindo sinônimos relevantes para o comércio eletrônico.</p><p>Além disso, a <strong>API de Sinônimos</strong> simplificou o gerenciamento de dicionários, permitindo que os conjuntos de sinônimos fossem modificados dinamicamente. Com essa abordagem, a busca tornou-se mais flexível e adaptável a diferentes padrões de consulta do usuário.</p><p>Esse processo pode ser continuamente aprimorado com novos dados e ajustes de modelo, garantindo uma experiência de pesquisa cada vez mais eficiente.</p><h2>Referências</h2><p><strong>Executar o Elasticsearch localmente</strong></p><p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/run-elasticsearch-locally.html">https://www.elastic.co/guide/en/elasticsearch/reference/current/run-elasticsearch-locally.html</a></p><p><strong>API de sinônimos</strong></p><p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/synonyms-apis.html">https://www.elastic.co/guide/en/elasticsearch/reference/current/synonyms-apis.html</a></p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-synonyms-automate</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-synonyms-automate</guid>
    <category><![CDATA[Relevância]]></category>
    <category><![CDATA[Noções básicas]]></category>
    <dc:creator><![CDATA[Andre Luiz]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0f0247b9bc1d1ccd/6a17fe07ec0f891c745a6845/05a3cfeaa387561d5334ca3f1609035ddfff7481-1200x628.png" length="0" type="image/png"/>
    <pubDate>Thu, 27 Mar 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Log ao vivo e próspero: Elasticsearch recentemente especializado no modo de índice logsdb]]></title>
    <description><![CDATA[A mais recente inovação do Elasticsearch em gerenciamento de logs, o logsdb, reduz o espaço de armazenamento de dados de log em até 65%, permitindo que as equipes de observabilidade e segurança expandam a visibilidade sem exceder seu orçamento, mantendo todos os dados acessíveis e pesquisáveis.]]></description>
    <content:encoded><![CDATA[<h2>O novo modo de índice do Elasticsearch, o logsdb, reduz as necessidades de armazenamento de logs em até 65%</h2><p>Hoje, anunciamos a disponibilidade geral do novo modo de índice do Elasticsearch, logsdb, que <strong>reduz o espaço de armazenamento de dados de log em até 65%</strong> em comparação com versões recentes do Elasticsearch sem logsdb. Essa melhoria drástica permite que as equipes de observabilidade e segurança expandam a visibilidade sem exceder seu orçamento, mantendo todos os dados imediatamente acessíveis para análise.</p><p>O logsdb otimiza a ordenação dos dados, elimina a duplicação ao reconstruir valores de campos não armazenados em tempo real com <code>synthetic _source</code> e melhora a compressão com algoritmos e codecs avançados, aproveitando o armazenamento em colunas no Elasticsearch para armazenamento e recuperação eficientes de logs.</p><h2>Melhore a análise e reduza custos melhorando a eficiência de armazenamento com o modo de índice logsdb</h2><p>Os logs fornecem sinais essenciais para detectar e corrigir problemas de observabilidade e segurança, e a utilidade está aumentando à medida que os avanços da IA facilitam a análise de dados baseados em texto, portanto, o armazenamento eficiente e o acesso de alto desempenho são mais importantes do que nunca.</p><p>Infelizmente, o crescente volume de logs gerados pela infraestrutura e pelos aplicativos está aumentando os custos, o que dificultam a análise: limitar a coleta, reduzir a retenção ou relegar dados novos a camadas de arquivamento isoladas.</p><p>O Logsdb enfrenta diretamente esses desafios. Com mais eficiência de armazenamento, você pode coletar mais dados e evitar o incômodo de uma filtragem complicada de dados. É possível reter logs por mais tempo para dar suporte à busca de ameaças, resposta a incidentes e requisitos de conformidade. E como todos os dados são sempre pesquisáveis, você pode ter insights rápidos, não importa o tamanho do seu conjunto de dados.</p><h2>Inovação técnica por trás do modo de índice logsdb</h2><p>O modo de índice logsdb reduz muito a pegada de disco dos dados de log com classificação inteligente de índices, synthetic _source e compressão avançada. Implementar isso pode reduzir as necessidades de armazenamento de log em até 65%, em comparação às versões recentes do Elasticsearch sem logsdb. Embora o logsdb atualmente consuma mais CPU durante a indexação, o armazenamento eficiente reduz os custos gerais para a maioria dos clientes. Para clientes que precisam de retenção a longo prazo, esperamos reduções no custo total de propriedade (TCO) de até 50%.</p><p><strong>A classificação de índice inteligente</strong> melhora a eficiência do armazenamento em até 30% e reduz a latência da consulta em alguns conjuntos de dados de registro ao localizar dados semelhantes próximos uns dos outros. Por padrão, ele classifica os índices por host.name e @timestamp. Se seus dados tiverem campos mais adequados, você poderá especificá-los.</p><p><strong>A compactação avançada</strong> reduz significativamente os requisitos de armazenamento para dados com muito texto, como logs, por meio da compactação Zstandard (Zstd), codificação delta, codificação de comprimento de execução e outros codecs inteligentes que são escolhidos automaticamente. Os valores doc, que são armazenados em um formato de coluna otimizado para compactação e desempenho, permitem o armazenamento e a recuperação eficientes de valores de campo para classificação, agregação e script.</p><p><strong>O _source sintético</strong> permite que as organizações reduzam as necessidades de armazenamento em outros 20-40% descartando o campo _source e reconstruindo-o total ou parcialmente sob demanda. Embora o recurso às vezes exija mais computação para indexação e recuperação, os testes mostram que ele oferece melhorias mensuráveis na eficiência líquida. O Synthetic _source foi criado com base em quase dois anos de uso em produção com métricas, com inúmeras melhorias para logs, incluindo suporte para quase todos os tipos de campos.</p><p>As economias de armazenamento resultantes são propagadas pelas fases do ciclo de vida do índice. Uma redução de armazenamento de 65% na camada quente resultará na mesma redução nas camadas quente, fria e congelada, além de diminuir o espaço necessário para armazenar snapshots no armazenamento de buckets.</p><h2>Sem comprometer a visibilidade: mantenha todos os logs para observabilidade e segurança</h2><p>Logs são a fundação da visibilidade em infraestrutura e aplicações, fornecendo o sinal mais simples e essencial para monitoramento e solução de problemas. No entanto, os custos estão aumentando à medida que os volumes de dados de logging crescem. Este desafio está obrigando os clientes a implementar políticas complexas de filtragem e gerenciamento, excluir dados prematuramente e deixar logs relevantes em armazenamentos que exigem um dia ou mais para reidratar antes da análise. Sem um conjunto de dados completo, facilmente pesquisável e acessível, encontrar e resolver problemas é muito mais desafiador.</p><p>O modo de índice do Logsdb se baseia em recursos inovadores do Elasticsearch, como <a href="https://www.elastic.co/pt/elasticsearch/elasticsearch-searchable-snapshots">snapshots pesquisáveis</a> e <a href="https://www.elastic.co/pt/blog/automatic-import-ai-data-integration-builder">importação automática,</a> para abordar esses pontos problemáticos para equipes de operações e segurança:</p><p><strong>Reduza custos: </strong>o Logsdb reduz o espaço de armazenamento de logs em até 65%, permitindo que as organizações reduzam as despesas de armazenamento e, ao mesmo tempo, retenham mais dados. Isso se traduz em economia de custos em todos os níveis de armazenamento — do ativo ao congelado — e maior produtividade para as equipes de observabilidade e segurança que usam esses dados.</p><p><strong>Preserve dados valiosos: </strong>o Logsdb mantém todos os seus dados de log e melhora a eficiência operacional sem depender de ferramentas extras ou filtros complicados. Com recursos como _source sintético, preserve o valor dos dados sem armazenar todo o documento de origem.</p><p><strong>Expanda a visibilidade:</strong> o Logsdb fornece acesso eficiente a todos os dados em uma plataforma, sem silos separados para observabilidade, segurança e dados históricos. Para engenheiros de confiabilidade de site (SREs), ele acelera a resolução de problemas ao permitir a análise de logs juntamente com métricas, rastreamentos e dados comerciais. Da mesma forma, para equipes do centro de operações de segurança (SOC), ele acelera a investigação e a correção ao eliminar pontos cegos.</p><p><strong>Simplifique o acesso aos dados:</strong> o Logsdb permite que as equipes de SRE retenham dados acionáveis de forma eficiente para solução de problemas, tendências e análises. Da mesma forma, as equipes do SOC podem pesquisar rapidamente todos os seus dados para investigação e detecção de ameaças sem incorrer em custos exorbitantes.</p><h2>O Logsdb está pronto para seu ambiente</h2><p>O modo de índice logsdb do Elasticsearch está geralmente disponível para clientes do Elastic Cloud Hosted e Self-Managed a partir da versão 8.17 e é habilitado por padrão para logs no <a href="https://www.elastic.co/pt/elasticsearch/serverless">Elastic Cloud Serverless</a>.</p><p>As capacidades básicas do logsdb (incluindo a classificação inteligente de índices e a compressão avançada) estão disponíveis para organizações com licenças Padrão, Ouro e Platina. As capacidades completas do logsdb que reduzem ainda mais os requisitos de armazenamento (incluindo synthetic _source) estão disponíveis para clientes serverless e organizações com uma licença Empresarial.</p><h2>Elasticsearch logsdb em ação</h2><p>O logsdb permite que você mantenha todos os seus dados de log e melhore a eficiência operacional sem restringir a coleta, descartar ou isolar os dados. Com recursos como classificação inteligente de índices, compactação avançada e synthetic _source, mantenha e analise os dados que você precisa dentro de um orçamento que funcione para você.</p><p>Quer experimentar por si mesmo? <a href="https://cloud.elastic.co/registration">Experimente o Elastic sem custos</a>.</p><p><em>O lançamento e o tempo de amadurecimento de todos os recursos ou funcionalidades descritos neste artigo permanecem a exclusivo critério da Elastic. Os recursos ou funcionalidades não disponíveis no momento poderão não ser entregues ou não chegarem no prazo previsto.</em></p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-logsdb-index-mode</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-logsdb-index-mode</guid>
    <category><![CDATA[Noções básicas]]></category>
    <dc:creator><![CDATA[Mark Settle,George Kobar,Amena Siddiqi]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt982a3c761d66169f/6a17de7c7b54f9788d8b37ff/d3daacafea7a1d78c825a18f8281460c7106d3a5-721x420.png" length="0" type="image/png"/>
    <pubDate>Thu, 12 Dec 2024 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Implementação de busca semântica: Construindo uma busca de receitas com Elasticsearch]]></title>
    <description><![CDATA[Implementação da busca semântica no contexto de sites de comércio eletrônico.]]></description>
    <content:encoded><![CDATA[<h2>Introdução</h2><p>Muitos sites de comércio eletrônico estão interessados em aprimorar a experiência de busca de receitas. A busca semântica, quando aplicada corretamente, permite que os clientes encontrem rapidamente os ingredientes necessários com base em consultas mais naturais, como "algo para o Dia dos Namorados" ou "refeições de Ação de Graças".</p><p>Neste artigo, demonstraremos como usar o Elasticsearch para implementar uma busca semântica que suporte esse tipo de consulta. Vamos configurar um índice para armazenar o catálogo de ingredientes e produtos de um supermercado e demonstrar como esse índice pode ser usado para melhorar as buscas por receitas. Ao longo do artigo, explicaremos como criar essa estrutura de dados e aplicar técnicas de processamento de linguagem natural para fornecer resultados relevantes e alinhados à intenção do cliente.</p><p>Todo o código apresentado neste artigo foi desenvolvido em Python e está disponível no <a href="https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/building-a-recipe-search-with-elasticsearch">GitHub</a>. Você pode acessar o repositório para revisar o código-fonte, fazer ajustes conforme necessário e implementar as soluções diretamente em seu ambiente de desenvolvimento.</p><h2>Iniciando a implementação da busca semântica</h2><p>Para começar a implementar a busca semântica, primeiro precisamos definir o modelo de linguagem natural. A Elastic oferece seu próprio modelo, <a href="https://www.elastic.co/guide/en/machine-learning/8.15/ml-nlp-elser.html"><strong>o ELSER</strong></a>, mas também oferece suporte para a integração de modelos de PNL de diversos fornecedores, como o Hugging Face. Essa flexibilidade permite que você escolha a opção que melhor se adapta às suas necessidades.</p><p>Neste artigo, utilizaremos <strong>o ELSER</strong>, que reduz a complexidade de implantação e gerenciamento de modelos de PNL (Processamento de Linguagem Natural). Além disso, o Elastic oferece o recurso <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/semantic-search-semantic-text.html"><strong>semantic_text</strong></a> , que simplifica bastante o processo. Com o <strong>semantic_text</strong>, todo o processo de geração de embeddings torna-se simples e automatizado. Basta definir um ponto de inferência e especificar o campo que receberá os embeddings no seu mapeamento de índice. Durante a indexação de documentos, os elementos incorporados serão gerados e associados automaticamente ao campo especificado.</p><h3>Etapas de configuração</h3><p>A seguir estão os passos para criar um índice com suporte para pesquisa semântica. Seguindo estas instruções, você terá um índice configurado e pronto para buscas semânticas:</p><ol><li><p><strong>Crie o </strong><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/infer-service-elser.html"><strong>ponto de inferência</strong></a>.</p></li><li><p><a href="https://github.com/andreluiz1987/semantic-search-market/blob/main/infra.py"><strong>Crie o índice</strong></a>, definindo o campo de descrição como semantic_text para que ele possa receber os embeddings.</p></li><li><p><a href="https://github.com/andreluiz1987/semantic-search-market/blob/main/ingestion.py"><strong>Indexe os dados</strong></a> no índice do catálogo de produtos, que armazenará um catálogo de produtos. Este catálogo foi obtido a partir de um conjunto de dados disponível <a href="https://www.kaggle.com/datasets/bhavikjikadara/grocery-store-dataset?select=GroceryDataset.csv">aqui</a>.</p></li></ol><h2>Aplicação da busca semântica em supermercados</h2><p>Agora que temos o índice preenchido com dados de produtos de supermercado, estamos testando e validando consultas para melhorar os resultados da pesquisa usando a busca semântica. Nosso objetivo é proporcionar uma experiência de busca mais inteligente, que compreenda o contexto e a intenção do usuário, oferecendo resultados mais relevantes e precisos.</p><h3>Desafios resolvidos pela busca semântica</h3><p>Com base no catálogo de produtos, vamos explorar como a busca semântica pode transformar a experiência de busca em supermercados, abordando problemas de vocabulário e contexto que a busca lexical tradicional costuma ter dificuldades em resolver.</p><h4><strong>1. Interpretação das intenções culinárias</strong></h4><p><strong>Problema 01</strong>: Um cliente pode pesquisar por "frutos do mar para grelhar", mas um sistema de busca lexical pode não entender completamente a intenção por trás da consulta. Pode ser que o sistema não consiga identificar todos os frutos do mar adequados para grelhar, retornando apenas aqueles que contenham exatamente os termos "frutos do mar" ou "grelhar" no título do produto.</p><p>Primeiramente, realizaremos uma busca lexical e analisaremos os resultados. Em seguida, faremos o mesmo com uma busca semântica, comparando os resultados para o mesmo termo de busca.</p><p><strong>Consulta de pesquisa lexical</strong></p> response = client.search(
        index="grocery-catalog",
        size=5,
        source_excludes="description_embedding",
        query={
            "multi_match": {
                "query": "seafood for grilling",
                "fields": [
                    "name",
                    "description"]
            }
        }
    )<p><strong>Resultados:</strong></p><p>Tipo de pesquisa</p><p>Nome</p><p>Pontuação</p><p>Lexical</p><p>Caranguejo-das-neves Bairdi do Alasca, peixe do noroeste</p><p>10,453125</p><p>Lexical</p><p>Molho Gourmet Original do Sr. Yoshida</p><p>7,2289705</p><p>Lexical</p><p>Pacote Variado de Frutos do Mar Premium - 20 unidades</p><p>7.1924105</p><p>Lexical</p><p>Pargo-vermelho americano - Inteiro, com cabeça, limpo</p><p>6,998647</p><p>Lexical</p><p>Garras e patas de lagosta, capturadas de forma sustentável na natureza.</p><p>6,438654</p><p>A busca lexical retornou alguns frutos do mar adequados para grelhar, como o pargo-vermelho americano e o caranguejo-das-neves-do-Alasca Bairdi da Northwest Fish. No entanto, a busca lexical retornou produtos menos relevantes no topo da lista, como o molho Mr. Yoshida, que não é um produto à base de frutos do mar, mas sim um molho para carne, sugerindo que o algoritmo lexical teve dificuldades em compreender totalmente o contexto de "para grelhar".</p><p><strong>Solução de busca semântica</strong></p><p>Usamos uma consulta que combina o termo "frutos do mar" com contextos de preparo como "grelhar" para retornar uma lista abrangente de opções, como filés de peixe, camarão e vieiras, que são ideais para grelhar — mesmo que as palavras "grelhar" ou "frutos do mar" não apareçam diretamente no nome do produto. Isso garante que os resultados da pesquisa estejam mais alinhados com a intenção do cliente.</p><p><strong>Pesquisa semântica de consulta:</strong></p>es_client.search(
   index="grocery-catalog-elser",
   size=size,
   source_excludes="description_embedding",
   query={
       "semantic": {
           "field": "description_embedding",
           "query": "seafood for grilling"

       }
   })<p>Tipo de pesquisa</p><p>Nome</p><p>Pontuação</p><p>Semântica</p><p>Robalo inteiro, limpo e com cabeça.</p><p>16.175909</p><p>Semântica</p><p>Bacalhau-negro do Alasca (peixe-sable)</p><p>15,855331</p><p>Semântica</p><p>Pargo-vermelho americano - Inteiro, com cabeça</p><p>15,454779</p><p>Semântica</p><p>Caranguejo-das-neves Bairdi do Alasca, peixe do noroeste</p><p>15,855331</p><p>Semântica</p><p>Pargo-vermelho americano - Inteiro, com cabeça</p><p>15,3892355</p><p>A busca semântica não apenas retornou produtos diretamente relacionados ao termo "frutos do mar", mas também compreendeu o contexto de "grelhar", apresentando peixes inteiros e filés adequados para grelhar. O ponto crucial aqui é a precisão dos resultados, que incluíram opções de peixes inteiros, como o robalo e o bacalhau negro do Alasca, ambos comumente usados para grelhar.</p><p><strong>Problema 02 </strong>: Muitos clientes procuram soluções rápidas e fáceis para o jantar depois de um longo dia de trabalho, usando termos como "refeições fáceis para a semana". A busca lexical tradicional pode não capturar completamente o conceito de refeições rápidas, muitas vezes focando apenas em produtos que incluem a palavra "fácil" em seu nome.</p><p>Assim como fizemos no problema anterior, começaremos realizando uma busca lexical. Em seguida, aplicaremos uma solução utilizando busca semântica.</p><p><strong>Consulta de pesquisa lexical</strong></p> response = client.search(
        index="grocery-catalog",
        size=5,   
        source_excludes="description_embedding",
        query={
            "multi_match": {
                "query": "easy weeknight meals",
                "fields": [
                    "name",
                    "description"]
            }
        }
    )<p><strong>Resultados:</strong></p><p>Tipo de pesquisa</p><p>Nome</p><p>Pontuação</p><p>Lexical</p><p>Etiquetas adesivas Avery Easy Peel para endereços, pacote com 4200 unidades</p><p>8.017723</p><p>Lexical</p><p>Refeições portáteis/de emergência com aquecimento automático Omeals 32</p><p>6,592727</p><p>Lexical</p><p>Poke de Atum Albacora em Cubos da Coastal Seafood</p><p>5,836883</p><p>Lexical</p><p>Espuma Hefty Super Weight de 340 g (12 oz)</p><p>5,8116536</p><p>Lexical</p><p>Guardanapos Vanity Fair Everyday, 2 camadas, pacote com 110 unidades</p><p>5,752989</p><p>A busca lexical retornou resultados muito menos relevantes, incluindo itens completamente não relacionados a refeições, como Etiquetas de Endereço Avery Easy Peel e Guardanapos Vanity Fair Everyday. Esses produtos não atendem à necessidade do usuário por refeições rápidas. Embora a busca lexical tenha retornado um produto útil (Omeals Self Heating Emergency Meals), outros resultados, como guardanapos e etiquetas, só correspondiam às palavras "fácil" ou "noite de semana" em suas descrições, sem realmente abordar a intenção do usuário de encontrar uma solução rápida para refeições.</p><p><strong>Solução de busca semântica</strong></p><p>Implementamos uma consulta que entende a intenção por trás de refeições rápidas e fáceis. Associa produtos que podem ser preparados rapidamente, como carnes pré-cozidas, massas congeladas ou kits de refeição, mesmo que não incluam explicitamente a palavra "fácil" no nome. Essa abordagem garante que os clientes encontrem as opções mais adequadas para jantares rápidos durante a semana, atendendo à necessidade de praticidade.</p><p><strong>Pesquisa semântica de consulta</strong></p>es_client.search(
   index="grocery-catalog-elser",
   size=size,
   source_excludes="description_embedding",
   query={
       "semantic": {
           "field": "description_embedding",
           "query": "easy weeknight meals"

       }
   })<p><strong>Resultados:</strong></p><p>Tipo de pesquisa</p><p>Nome</p><p>Pontuação</p><p>Semântica</p><p>Refeições portáteis/de emergência com aquecimento automático Omeals 32</p><p>14.610006</p><p>Semântica</p><p>Nissin, Cup Noodles, Camarão, 70g</p><p>13,751424</p><p>Semântica</p><p>Mistura para Waffles e Panquecas Namaste Sem Glúten</p><p>13,73376</p><p>Semântica</p><p>Batatas Idaho, Batatas Hashbrown Douradas Grelhadas</p><p>12,549422</p><p>Semântica</p><p>Nissin, Cup Noodles, Frango, 24 unidades</p><p>12.034527</p><p>A busca semântica retornou produtos claramente relacionados a refeições rápidas e práticas, como macarrão instantâneo (Cup Noodles), batatas pré-cozidas e misturas para panquecas, que são opções típicas para jantares fáceis durante a semana. Isso demonstra que a busca semântica consegue captar o conceito por trás da frase "refeições fáceis para noites de semana", identificando a intenção do usuário de encontrar refeições rápidas e práticas. Curiosamente, produtos de outras categorias, como "refrigerantes", também podem ser incluídos quando relevantes no contexto (por exemplo, bebidas para acompanhar as refeições).</p><h4><strong>2. Termos regionais e variações de vocabulário</strong></h4><p><strong>Problema</strong>: Um cliente pode pesquisar por "refrigerante", enquanto outro cliente pode usar "refrigerante" para o mesmo produto. A busca lexical tradicional não reconhece que ambos os termos se referem ao mesmo item.</p><p><strong>Consulta de pesquisa lexical</strong></p> response = client.search(
        index="grocery-catalog",
        size=5,
        source_excludes="description_embedding",
        query={
            "multi_match": {
                "query": "refreshing pop drink low sugar",
                "fields": [
                    "name",
                    "description"]
            }
        }
    )<p><strong>Resultados:</strong></p><p>Tipo de pesquisa</p><p>Nome</p><p>Pontuação</p><p>Lexical</p><p>Prime Hydration+ Sticks - Mistura para Bebida Eletrolítica</p><p>14,492869</p><p>Lexical</p><p>Capri Sun, 100% Suco, Pacote Variado</p><p>12.340851</p><p>Lexical</p><p>Bebida energética Joyburst, Frosé Rosé, 12</p><p>11,839179</p><p>Lexical</p><p>Pop-Tarts da Kellogg's, com cobertura de açúcar mascavo e canela.</p><p>9,97788</p><p>Lexical</p><p>Kind Mini Bars, Pacote Variado, 0,7</p><p>9,336912</p><p>A busca lexical concentra-se em correspondências exatas de palavras. Embora tenha retornado produtos como Prime Hydration e Capri Sun, a correspondência direta com o termo "pop" também levou a resultados irrelevantes, como Pop-Tarts da Kellogg's, que é um lanche e não uma bebida. Isso demonstra como a busca lexical pode ser menos eficaz quando um termo possui múltiplos significados ou pode ser ambíguo.</p><p><strong>Solução de busca semântica</strong></p><p>Em consultas semânticas, podemos superar o problema das variações de vocabulário que a busca lexical não consegue resolver. Ao expandir os termos de pesquisa, conseguimos obter resultados baseados no significado contextual, fornecendo respostas mais relevantes e abrangentes.</p><p><strong>Consulta:</strong></p>es_client.search(
   index="grocery-catalog-elser",
   size=size,
   source_excludes="description_embedding",
   query={
       "semantic": {
           "field": "description_embedding",
           "query": "refreshing pop drink low sugar"

       }
   })<p><strong>Resultados:</strong></p><p>Tipo de pesquisa</p><p>Nome</p><p>Pontuação</p><p>Semântica</p><p>Refrigerante Prebiótico Olipop 355ml (12 oz) - Variedade</p><p>14,776867</p><p>Semântica</p><p>Bai Antioxidante Cocofusion, Pacote Variado, 18</p><p>14,663253</p><p>Semântica</p><p>Bebida energética Monster, Zero Ultra, 24</p><p>14,486348</p><p>Semântica</p><p>Joyburst Energy Variedade, 355 ml</p><p>14.007214</p><p>Semântica</p><p>Bebida energética Joyburst, Frosé Rosé, 12</p><p>13,641038</p><p>A busca semântica retorna produtos que correspondem diretamente ao conceito de "refrigerante" como sinônimo de "soda" (como Olipop Prebiotics Soda), mesmo que o termo exato "refrigerante" não esteja presente no nome do produto. A busca compreendeu a intenção do usuário — uma bebida refrescante e com baixo teor de açúcar — e conseguiu retornar produtos relevantes, incluindo opções como refrigerantes prebióticos (Olipop) e bebidas energéticas sem açúcar (Monster Energy Drink).</p><h2>Conclusão</h2><p>A implementação da busca semântica no contexto de supermercados provou ser altamente eficaz na compreensão de consultas complexas como "frutos do mar para grelhar" e "refeições fáceis para a semana". Essa abordagem nos permitiu interpretar a intenção do usuário com mais precisão, retornando produtos altamente relevantes.</p><p>Ao utilizar o Elasticsearch e simplificar o processo com o ELSER, conseguimos aplicar a busca semântica de forma rápida e eficiente, melhorando significativamente os resultados da busca e proporcionando uma experiência de compra mais ágil e direcionada. Isso não apenas otimizou o processo de busca, mas também aumentou a relevância dos resultados oferecidos aos clientes.</p><h2>Referências</h2><p>Modelo ELSER:</p><p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/put-inference-api.html">https://www.elastic.co/guide/en/elasticsearch/reference/current/put-inference-api.html</a></p><p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/infer-service-elser.html">https://www.elastic.co/guide/en/elasticsearch/reference/current/infer-service-elser.html</a></p><p></p><p>Texto semântico:</p><p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/semantic-text.html">https://www.elastic.co/guide/en/elasticsearch/reference/current/semantic-text.html</a></p><p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/semantic-search.html">https://www.elastic.co/guide/en/elasticsearch/reference/current/semantic-search.html</a></p><p></p><p>Conjunto de dados:</p><p><a href="https://www.kaggle.com/datasets/bhavikjikadara/grocery-store-dataset?select=GroceryDataset.csv">https://www.kaggle.com/datasets/bhavikjikadara/grocery-store-dataset?select=GroceryDataset.csv</a></p><p></p><p>Busca semântica:</p><p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/semantic-search.html">https://www.elastic.co/guide/en/elasticsearch/reference/current/semantic-search.html</a></p><p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/semantic-search-semantic-text.html">https://www.elastic.co/guide/en/elasticsearch/reference/current/semantic-search-semantic-text.html</a></p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/semantic-search-elasticsearch-ecommerce</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/semantic-search-elasticsearch-ecommerce</guid>
    <category><![CDATA[Noções básicas]]></category>
    <dc:creator><![CDATA[Andre Luiz]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5c545fc80b6d79d6/6a170214839dfad776dcfd6f/d968e646240cd3ef7c79b5124d562a5f951d812b-1440x840.png" length="0" type="image/png"/>
    <pubDate>Thu, 07 Nov 2024 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>