Otimizando buscas com grandes volumes de dados utilizando Scroll e Elasticsearch
Tags: rails, ruby, elasticsearch, programming
Published: 2023-10-04 19:46:58

Em algum momento da sua jornada no mundo da programação, você irá se deparar com algum problema que vai exigir analisar alternativas para resolve-lo, alternativas essas que não sejam as famosas _gambiarras_. 👀

Hoje vim compartilhar um pouco sobre a implementação de pesquisa utilizando o [`SCROLL`](https://www.elastic.co/guide/en/elasticsearch/reference/current/scroll-api.html) no Elasticsearch.

**INTRODUÇÃO:**

Tínhamos uma demanda no meu trabalho onde precisávamos buscar e processar de forma assíncrona um volume grande de dados, já utilizávamos a busca no ES com o [`SEARCH`](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html), porém, devido ao aumento no volume de dados a serem buscados, o processo estava cada vez mais lento, causando erros de timeout e impactando diretamente na rotina de processos da empresa.

O mecanismo de scroll no Elasticsearch é especialmente útil quando você precisa recuperar uma grande quantidade de dados que não cabem em uma única resposta de pesquisa. Ele funciona criando um contexto de pesquisa que inclui todos os dados correspondentes à consulta e permite que você os acesse por meio de páginas de resultados.

**PASSO A PASSO:**

Como já existia uma forma de busca implementada no sistema, precisei adapta-lo para receber a opção de pesquisa via scroll também.

_1. Iniciando uma Pesquisa com Scroll_

Para iniciar uma pesquisa com scroll, você deve emitir uma pesquisa inicial usando a API de pesquisa do Elasticsearch. Nesta pesquisa, você deve especificar os parâmetros, filtros e tamanho da página.

No exemplo abaixo temos o `size: 100`, alguns filtros quaisquer e o parâmetro `scroll: 1m`, o qual está indicando que quero realizar uma busca onde o tempo limite para o scroll expirar será de 1 minuto.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f8b8h4w7qla6zaihhu65.png)

_2. Obtenha o scroll_id e os primeiros resultados_

Após a pesquisa inicial, o Elasticsearch retornará um `scroll_id` e os primeiros dados correspondentes à consulta, no caso do exemplo acima, teremos os primeiros 100.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7obpdx8f4uaj0ddn7dyr.png)

_3. Recuperando resultados subsequentes com o scroll_id_

Agora com o `scroll_id`, usamos esse identificador para recuperar os resultados subsequentes. Ao emitir uma nova pesquisa usando o `scroll_id` obteremos a próxima página de dados (mais 100).

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zj3jyalraoodvd9969mv.png)

- Repita o processo utilizando o identificador `scroll_id` até que não haja mais dados a serem recuperados.
- O `scroll_id` expirará após o tempo limite definido, dentro de cada ação subsequente.

_4. Considerações Finais_

Com a implementação do scroll no Elasticsearch foi possível recuperar grandes volumes de dados de forma controlada e eficaz.
É importante lembrar de ajustar o tempo limite do scroll com base no desempenho do seu cluster e nas necessidades do seu caso de uso específico.
Com a estratégia certa de pesquisa, você poderá aproveitar ao máximo os recursos do Elasticsearch e recuperar seus dados de maneira eficiente e escalável.

_Referências:_

- https://www.elastic.co/guide/en/elasticsearch/reference/current/scroll-api.html
- https://walde.co/2016/07/22/elasticsearch-paginacao/
- https://opster.com/guides/elasticsearch/glossary/elasticsearch-scroll/