📊 ElasticSearch e o Mundo dos Web Crawlers 🕷️

Explorando as Profundezas da Web: ElasticSearch e o Mundo dos Web Crawlers

Quando eu começei a ideia da Aparda, eu pesquisei igual um cachorro e fui atrás das melhores e mais avançadas soluções de pesquisa online. Nessa busca eu me deparei com o ElasticSearch, uma ferramenta poderosa que se tornou essencial nos meus estudos e experimentos.

O que é ElasticSearch? 📊

O ElasticSearch é um mecanismo de busca distribuído, muito eficiente e escalável. Ele permite a indexação e busca rápida em grandes volumes de dados, e isso me chamou muita atenção, na minha cabeça ele vai ser uma ferramenta fundamental pro nosso projeto. (Além de ser OpenSource)

Desafios de um Crawler Eficiente 🕷️

Como eu não sabia NADA de crawlers fui estudar, e como todo bom preguiçoso o primeiro lugar que perguntei foi o famoso GPT, "Qual o escopo de um crawler" e ele não me deu nenhuma resposta boa, mas me falou que podia ser feito em python.

Como eu não sei nada de python fui estudar, mergulhei na construção de um protótipo do meu primeiro web crawler (panthera1). A missão parecia bem simples: puxar algumas informações de uns sites. Mas a realidade bate na gente como o pau um dia bateu no gato-to que não moreu-reu-reu.

Deu TUDO errado, os dados vieram todos com doideira, mal formatados, letras bugadas, barra em todo canto.. um verdadeiro caos, depois de muito estudo e muito prompt consegui fazer o meu primeiro teste de crawler. Ele eenvia informações cruciais para o ElasticSearch por meio da API, proporcionando uma visão abrangente do site indexado e ajudando o elastic a priorizar a busca pra trazer o melhor resultado...

Essa é a estrutura inicial que fiz pra testar o crawler

  • last_crawl: Registro do timestamp do último crawl.
  • title: Tratamento especial para extrair o título do site, corrigindo espaços malucos e acentuações.
  • meta_description: Descrição do site, livre de HTML e formatações malucas.
  • domain: Domínio raiz do site indexado.
  • url: URL completa do site.
  • additional_urls: Todas as URLs internas referenciadas no site, respeitando o Nofollow.
  • headings: Lista de todos os headings do site, do maior para o menor.
  • links: Todas as URLs externas referenciadas no site.
  • images: Detalhes sobre as imagens, incluindo URL, tipo, dimensões e tamanho em KB.
  • body_content: Texto limpo do conteúdo do corpo do site, excluindo Header e Footer.
  • local: Integração com a API do ipinfo para determinar a localização do site.

No entanto, um gigante desafio surge com os bloqueios aos bots em diversos sites. Estou explorando as mais diversas estratégias, como o uso de proxies ou simulação de um navegador com Selenium por exemplo, pra tentar superar esses bloqueios.

Rumo à Autonomia na Busca Online 🚀

O desenvolvimento do crawler é apenas o começo. Sei e tenho em mente que é de suma importância ter uma base própria de resultados, estamos cientes de que essa transição vai demorar e precisa de uma abordagem cuidadosa. Por ora, continuamos utilizando a API do Bing Search, mas já estamos fazendo esses testes pensando no futuro.

A integração com o ElasticSearch abre portas para o search tuning, possibilitando ajustes manuais ou mesmo utilizando Machine Learning para analisar o comportamento do usuário e aprimorar os resultados de busca.

Desbravando o Universo da Inteligência Artificial 🤖

A etapa seguinte nos leva a considerar o uso de inteligência artificial, tanto para sumarizar resultados de forma eficiente quanto para aprimorar a experiência de busca. Uma decisão ainda não tomada é sobre em que fase a IA entra. Será que é agora, durante o processo de crawl? Ou será que ela será implementada posteriormente, como um componente separado? Ainda não sabemos, mas é uma questão que nos motiva.

Elastic Crawler: Uma Alternativa Limitada 🕸️

"Ah Matheus mas o ElasticSearch não possui seu próprio crawler?" Sim, mas todos os testes me levam a crer que é uma opção muito limitada, documentação confusa e com recursos limitados. A falta de informações detalhadas torna a exploração desse recurso um desafio gigante.

Em meio a esse cenário, fica a pergunta: "Existem alternativas ao Python para construir web crawlers eficientes?" Se você conhece outras opções manda ai a ideia pra gente conhecer e testar.

Como Você Pode Contribuir 🤝

Convido você a experimentar o Aparda, explorar as funcionalidades e fornecer feedback valioso. Estamos na versão mais básica um Beta se assim podemos chamar.. e seu envolvimento é crucial para moldarmos o futuro da busca online brasileira.

Deixa um comentário ai ou me manda um e-mail em matheus@aparda.com. Sua opinião é muito importante pro o aprimoramento contínuo da plataforma.

Use o Aparda e faça parte. 🚀

Referências:

O primeiro passo é ler o artigo que introduziu o Google ao mundo. Este documento é uma referência fundamental no campo de crawlers de web e motores de busca.

http://infolab.stanford.edu/~backrub/google.html

Python, sendo a linguagem usada nos primeiros crawlers do Google, é uma escolha adequada para o desenvolvimento de crawlers de web.

Ao construir crawlers, a limitação não está na velocidade da linguagem de programação, mas sim na espera por respostas da rede. Portanto, uma linguagem "mais rápida" não vai trazer benefícios significativos. A melhor abordagem para melhorar a eficiência do crawling não é mudar a linguagem, mas sim usar um cluster de crawlers distribuídos. Isso vai aumentar significativamente a velocidade e a abrangência do processo de crawling.

A inteligência artificial pode ser usada após o processo de crawling para gerar sumários das páginas, gerar listas de sinônimos e listar todas as entidades nomeadas reconhecidas. Esses processos podem enriquecer os dados coletados, tornando a busca mais eficiente. Em vez de buscar correspondência direta no texto original da página, pode ser mais eficaz e útil buscar similaridade nos textos gerados pela IA.

Finalmente, tenho dúvias sobre o uso do ElasticSearch, ele é uma ferramenta poderosa que abstrai muitas das complexidades envolvidas no armazenamento, indexação e recuperação de grandes volumes de dados. Embora isso seja vantajoso em termos de facilidade de uso, é limitador na compreensão dos processos subjacentes e na customização destes para suas necessidades: indexar a web inteira.

Por exemplo, o ElasticSearch usa o BM25, um algoritmo de ranking sofisticado, para determinar a relevância dos documentos em relação a uma consulta. No entanto, ele faz isso de forma opaca, sem permitir que o usuário explore e entenda plenamente todas as nuances e complexidades desse algoritmo. Para construir um motor de busca que seja verdadeiramente personalizado e otimizado, é crucial entender e possivelmente modificar tais algoritmos de acordo com suas necessidades.

Compreender como armazenar e indexar muitos terabytes de dados de forma eficiente é fundamental no desenvolvimento de sistemas de busca. O ElasticSearch gerencia essas tarefas de maneira eficaz, mas também mantém os detalhes internos ocultos, como a estrutura de índices e o gerenciamento de arquivos. Esse conhecimento oculto pode ser essencial para otimizar o desempenho e a eficácia de um sistema de busca, especialmente quando lidamos com requisitos específicos ou desafios únicos de indexar toda a Web.

Muito obrigado pelo seu comentário! Concordo, inicialmente, foi desafiador compreender como utilizar o ElasticEnterprise para essa finalidade. A resposta veio através de experimentos, testes e MUITOS questionamentos ao Carlos (nome carinhoso que dou ao chatGPT), onde percebi que o machine learning oferece a possibilidade de "recompensar" ou "punir" sites dentro do algoritmo. Isso abre portas para aprimorar a qualificação das buscas de maneira inovadora. Ao indexar o TabNews (para fins de teste), percebi que a busca inicialmente direcionava para um artigo específico, deixando o próprio site do TabNews para a segunda posição. No entanto, conseguimos ajustar a precisão da busca, aplicando boosts em campos específicos como "domain", "headings" e "title". Essa abordagem possibilita que resultados específicos ganhem destaque na busca, proporcionando uma experiência mais refinada. Uma ideia futura envolve a implementação de machine learning para analisar o tempo que o usuário gasta em uma página e em qual resultado ele clica. Se o usuário demorar mais de 5 segundos e tende a clicar no terceiro ou quarto resultado, podemos atribuir um boost a esse resultado, indicando que é mais relevante do que o primeiro. Além disso, podemos explorar a criação de um sistema de pontuação (Scores) para aprimorar ainda mais essa abordagem. Agradeço novamente por compartilhar essas ideias e sugestões! Vamos estar sempre em busca de inovações para oferecer a melhor experiência de busca possível. 🚀

Show de bola! Acho que precisamos de mais search engines independentes e nos livrar do oligopólio.

Sobre opções para fazer um crawler, sinto que preciso dizer que qualquer linguagem serve! Sério, qualquer linguagem que permita que você faça uma request http e que você consiga fazer o parsing do conteúdo, serve. Mas o ponto principal é que nem todas são ideais, todas servem, mas não necessariamente devem ser utilizadas.

Uma search engine precisa, em média, mais de 2TB de dados (uma pesquisa que fiz a um bom tempo atrás, não consigo afirmar com certeza) para conseguir servir buscas decentemente. E isso é só o começo, você vai precisar muito mais do que isso e manter todo esse índice atualizado. Logo, ou você tem um processo muito otimizado e rápido, ou você vai gastar dinheiro em compute e tempo.

Então, voltando as ferramentas, recomendo escolher uma linguagem baseada nessas nescessidades, até por que nenhuma tem uma biblioteca "Google" já pronta pra você. Minha opinião: descarte Selenium imediatamente, gasta muito recursos e não vale a pena, escolha Rust/Go ou qualquer linguagem minimamente rápida (infelizmente python não é) para o desenvolvimento.

Isso é só minha visão, então estude e veja o posicionamento dos outros para ver possíveis caminhos. Espero que tenha ajudado.

PS: para evitar ser barrado como bot sei que a Cloudflare tem uma página sobre como se inserir no programa de search engines e ter um "passo livre" fazendo web crawls.

Depende muito dos dados que você está indexando, da forma com que você está indexando, e da própria search engine. Por exemplo: tenho num elasticsearch (não é um cluster, apenas um nó master) um indice de cidades em todo o mundo, com 3MM+ de cidades. O nome da cidade é indexado com diversas variações, usando a estratégia n-gram para fazer o autocomplete e outra estratégias. então uma cidade chamada `crato` é indexada internamente com as seguintes variacoes: ``` cra crat crato c(a-z)a cr(a-z) ... ``` ou seja, para tornar mais rapida a busca, você indexa diversos termos que apontam para um só documento (cidade). Isso deixa o storage relativamente grande em relação a base de dados original. Nesse caso, a minha tabela de cidades no banco de dados tem ~1.5GB, enquanto o elasticsearch ocupa ~8GB. Acho 2TB um número muito alto, que só é atingido com uma quantidade muito grande de dados.
Show, valeu demais pelas dicas, vou dar uma estudada e tentar entender melhor sobre as linguagens que você me mandou, sobre o cloudflare muito obrigado também hehehe..

Elasticsearch é uma das ferramentas mais fodas que existem, show de bola seu artigo.

Amei o ES.. muito trampo pra instalar aqui pra testar mas dps que consegui a primeira vez foi muito facil...

Nao sei se eu cheguei tarde no post, mas existe uma outra alternativa legal para o elasticsearch https://www.meilisearch.com/.

Eu ja usei o ES em producao (mais especificicamente o OpenSearch da aws), eu ainda nao usei esse meilisearch mas ele me parece melhor, vi uns benchmarks e ele performava melhor, sendo que a DX dele tambem me parece melhor, as queries se assemelham mais a outras ferramentas ja usadas.

Claro que existem outras coisas para se colocar na balanca, ate pq o seu desafio eh gigante entao quanto menos incertezas melhor rs

Matheus nunca é tarde pra essas coisas hehehe, estou beeem no inicio do projeto então vou testar tudo que vier, valeu mesmo pela dica..
Entao, uso o ES desde o 1.5, e te falo que ele eh apenas uma api lara o apache lucene (ao menos conta o seu criador). Por baixo dos panos roda o apahe lucene, ele que faz a magia das buscas, o ES eh apenas uma api, um wrapper para o lucene. Hoje acredito que usem o seu proprio algoritmo.

Atualmente ando trabalhando com Elasticsearch também, juntamente com IA.

recomendo que dê uma olhada nesse exemplo de RAG com elastic search: https://www.elastic.co/search-labs/blog/articles/privacy-first-ai-search-langchain-elasticsearch

Uma das coisas interessantes também para se fazer com IA é a geração de Tags e classificadores durante o crawl. Algo também que deve ser levado em consideração é a técnica de fingerprint para que não haja documentos duplicados nos seus índices.

Por fim uma das formas de melhorar os resultados obtidos do elastic, é por meio do similarity search. Onde você indexa também um vetor com os embeddings do documento. Em seguida durante o search você procura através do embedding.

A técnica anterior pode ser melhorada utilizando conceitos como HyDE e RRF

Kalleby valeu demais a dica, vou ler sim e entender melhor sobre o que você colocou ai de Fingerprint e Similarity search, ainda estou bem naquele comecinho, começando a desvendar mas todas essas dicas são bem vindas demais..