O que é um índice do Elasticsearch?

info-retrieval-blog-720x420-v2.jpeg

O termo índice está bastante sobrecarregado no mundo da tecnologia. Se você perguntasse à maioria dos desenvolvedores o que é um índice, eles poderiam dizer que geralmente se refere a uma estrutura de dados em um banco de dados relacional (RDBMS) associado a uma tabela, o que melhora a velocidade das operações de recuperação de dados.

Mas o que é um índice do Elasticsearch®? Um índice do Elasticsearch é um espaço de nome lógico que contém uma coleção de documentos, onde cada documento é uma coleção de campos — que, por sua vez, são pares de chave-valor que contêm seus dados.

Como um índice do Elasticsearch é diferente de um banco de dados relacional?

Os índices do Elasticsearch não são os mesmos que você encontraria em um banco de dados relacional. Pense em um cluster do Elasticsearch como um banco de dados que pode conter muitos índices que você pode considerar como uma tabela e onde, dentro de cada índice, você tem muitos documentos.   

  • RDBMS => bancos de dados => tabelas => colunas/linhas
  • Elasticsearch => clusters => índices => shards => documentos com pares de chave-valor

Embora o Elasticsearch armazene documentos JSON, o que você insere no índice é incrivelmente flexível. É um processo rápido para começar a usar a grande variedade de integrações e Beats disponíveis. Você também pode ir um pouco além e definir seus próprios processos de ETL usando pipelines de ingestão ou o Logstash®, com a ajuda de seus inúmeros processadores e plugins.

Outra diferença em relação aos bancos de dados relacionais é que você pode importar dados sem a necessidade de qualquer definição de esquema inicial. Os tipos dinâmicos são uma ótima maneira de começar rapidamente ou de levar em conta campos inesperados em documentos. Então, depois de definir as coisas, mude para um esquema fixo para melhorar o desempenho. 

Os campos de tempo de execução são outro recurso interessante que permite fazer esquemas na leitura ou na gravação. Eles podem ser adicionados a um documento existente e usados para derivar um novo campo, ou você pode criar um campo de tempo de execução no momento da consulta. Pense neles como valores calculados usando scripts que podem ser lidos na origem do documento.

Quer ver a diferença em ação? Experimente gratuitamente hoje mesmo com uma conta de avaliação no Elastic Cloud.

Como os dados interagem com a API intuitiva do Elasticsearch

O Elasticsearch fornece uma API baseada em JSON RESTful para interagir com os dados do documento. Você pode indexar, buscar, atualizar e excluir documentos enviando solicitações HTTP para os endpoints do cluster apropriados. Essas operações do tipo CRUD podem ocorrer no nível de um documento individual ou no próprio nível do índice. Se preferir, há também bibliotecas cliente específicas para cada linguagem que você pode usar em vez do REST direto.
O exemplo a seguir cria um documento em um índice chamado playwrights com um document_id de 1 atribuído. Observe que não precisamos criar nenhum esquema ou configuração inicial; simplesmente inserimos nossos dados.

POST /playwrights/_doc/1
{
  "firstname": "William",
  "lastname": "Shakespeare"
}

Podemos ainda adicionar documentos e campos como quisermos, o que não é algo que você poderia fazer facilmente com um banco de dados relacional.

POST /playwrights/_doc/2
{
  "firstname": "Samuel",
  "lastname": "Beckett",
  "year_of_birth": 1906
}

Agora podemos consultar todos os documentos usando o endpoint de busca.

GET /playwrights/_search
{
    "query": {
        "match_all": {}
    }
}

Ou podemos consultar um ano de nascimento específico.

GET /playwrights/_search
{
    "query": {
        “match": {
            “year_of_birth": 1906
        }
    }
}

Além da consulta básica, o Elasticsearch oferece recursos avançados de busca, como correspondência difusa, stemização, pontuação de relevância, realce e tokenização, que divide o texto em partes menores, chamadas de tokens. Na maioria dos casos, esses tokens são palavras individuais, mas existem muitos tokenizers diferentes disponíveis.

Por que os dados desnormalizados são essenciais para uma recuperação de dados mais rápida?

Em bancos de dados relacionais, a normalização geralmente é aplicada para eliminar a redundância e garantir a consistência dos dados. Por exemplo, você pode ter tabelas separadas para clientes, produtos e pedidos. 

No Elasticsearch, a desnormalização é uma prática comum. Em vez de dividir os dados em várias tabelas, você armazena todas as informações relevantes em um único documento JSON. Um documento de pedido conteria as informações do cliente e do produto, em vez de conter chaves estrangeiras referindo-se a índices separados de produtos e clientes. Isso permite uma recuperação de dados mais rápida e eficiente no Elasticsearch durante as operações de busca. Como regra geral, o armazenamento pode ser mais barato do que os custos de computação para a junção de dados.

Como o Elasticsearch garante escalabilidade em sistemas distribuídos?

Cada índice é identificado por um nome exclusivo e é dividido em um ou mais shards, que são subconjuntos menores do índice que permitem processamento paralelo e armazenamento distribuído em um cluster de nós do Elasticsearch.  Os shards são divididos em principais e réplicas. As réplicas fornecem cópias redundantes dos seus dados para proteger contra falhas de hardware e aumentar a capacidade de atender a solicitações de leitura como a busca ou a recuperação de um documento.

A inclusão de mais nós no cluster proporciona mais capacidade de indexação e busca, algo que não é alcançado com tanta facilidade com um banco de dados relacional.

Voltando ao nosso exemplo de playwrights, se executarmos a linha abaixo, poderemos ver os mapeamentos de tipo que o Elasticsearch inferiu automaticamente e o número de shards e réplicas que o índice atribuiu.

GET /pt/playwrights/

Quais tipos de dados podem ser indexados no Elasticsearch?

O Elasticsearch pode indexar muitos tipos de dados — primeiramente texto, mas também dados numéricos e de geolocalização. Ele também pode armazenar vetores densos que são usados em buscas de similaridade. Vamos ver cada um deles.

Índices invertidos para busca textual/lexical

O Elasticsearch também escolherá a melhor estrutura de dados subjacente a ser usada para um determinado tipo de campo. Por exemplo, o texto seria tokenizado e armazenado em um índice invertido, que é uma estrutura que lista cada token exclusivo que aparece em qualquer documento e identifica todos os documentos em que cada palavra ocorre.

A tabela a seguir mostra a composição geral de um índice invertido. Podemos ver que, se procurássemos o termo “Londres”, descobriríamos que ele ocorre em seis documentos diferentes no índice. É esse índice invertido que nos permite realizar consultas textuais muito rapidamente.

Token

IDs de documento

Londres

1,3,8,12,23,88

Paris

1,12,88

Madri3,8,12
Berlim12,23

Funcionalidades de busca numérica e de geolocalização para uma análise espacial eficiente

Dados numéricos e de geolocalização seriam armazenados em árvores BKD, também conhecidas como índice Block KD-Tree, que é uma estrutura de dados usada em aplicações de engenharia para indexação espacial eficiente e consulta de dados multidimensionais. Ele organiza os pontos de dados em blocos, permitindo buscas de alcance rápido e consultas de vizinho mais próximo em grandes conjuntos de dados, o que faz dele uma ferramenta valiosa para engenheiros que lidam com análise e otimização de dados espaciais.

Busca vetorial/semântica com PLN

Você pode ter ouvido falar sobre busca vetorial, mas o que é isso? Os mecanismos de busca vetorial — conhecidos como bancos de dados vetoriais, busca semântica ou busca de cosseno — encontram os vizinhos mais próximos de uma determinada consulta (vetorizada). O poder da busca vetorial está no fato de que ela descobre documentos similares que não são uma correspondência textual exata, como seria exigido por nosso exemplo de índice invertido acima; em vez disso, ela usa vetores que descrevem algum nível de similaridade. 

A comunidade de processamento de linguagem natural (PLN) desenvolveu uma técnica chamada embedding de texto que codifica palavras e frases como vetores numéricos. Essas representações vetoriais são projetadas para capturar o conteúdo linguístico do texto e podem ser usadas para avaliar a similaridade entre uma consulta e um documento.

Alguns casos de uso comuns para a busca vetorial: 

  • Responder a perguntas
  • Encontrar respostas para perguntas respondidas anteriormente, nas quais a pergunta feita é semelhante, mas não exatamente igual em forma de texto 
  • Fazer recomendações — por exemplo, uma aplicação de música que encontra músicas semelhantes com base nas suas preferências  

Todos esses casos de uso utilizam vetores com dezenas de milhares de dimensões, fornecendo  uma representação abrangente dos dados para uma avaliação de similaridade precisa e recomendações direcionadas. 

O Elasticsearch oferece suporte para a busca vetorial por meio do tipo de documento dense_vector e sua capacidade de executar buscas de similaridade entre o vetor no documento e o termo de busca depois de convertido em vetor. 

Para aqueles que desejam se aprofundar um pouco mais na IA generativa, também oferecemos o ESRE (Elasticsearch Relevance Engine™), projetado para alimentar aplicações de busca baseadas em inteligência artificial. O ESRE oferece aos desenvolvedores um conjunto completo de sofisticados algoritmos de recuperação e a capacidade de integração com grandes modelos de linguagem.

Experimente!

Como você pode ver, os índices do Elasticsearch percorreram um longo caminho desde que o cofundador e diretor de tecnologia da Elastic, Shay Banon, criou pela primeira vez um mecanismo de busca de receitas para sua esposa. Há muito mais para descobrir, e um ótima maneira de começar é criando uma conta de avaliação no Elastic Cloud: você estará com a mão na massa em questão de minutos. Além disso, confira o webinar de introdução ao Elasticsearch.

Publicado originalmente em 24 de fevereiro de 2013; atualizado em 17 de julho de 2023.