BugSearch é um motor de pesquisa de páginas indexadas pelo crawler BugSearch.Crawler. O projeto é dividido em duas partes: o lado do Bot (Bot side) e o lado do Cliente (Client side).
Interface gráfica feita por Vinicius Schneider (@1mrschneider) https://github.com/1mrschneider/bug_search_ui
Projeto depreciado desenvolvido com typescript https://github.com/andrrff/ifma-webcrawler
O lado do Bot é onde o crawler pode ser executado a partir de uma lista de links, explorando cada página e verificando recursivamente os links contidos nela. Para persistir os dados, utilizamos duas coleções no MongoDB: uma para armazenar o dicionário de termos e outra para armazenar os EventCrawlers. O modelo do EventCrawler é representado da seguinte forma:
public class EventCrawler
{
public string? _id { get; set; }
public string? Url { get; set; }
public string? Favicon { get; set; }
public string? Title { get; set; }
public string? Description { get; set; }
public string? Body { get; set; }
public string[] Terms { get; set; } = Array.Empty<string>();
public double Pts { get; set; } = 0;
}
O dicionário consiste em pares de chave-valor simples, onde a chave é um termo e o valor é seu identificador (_id), ambos representados como strings.
Todo o processo ocorre por meio de um sistema de mensageria RabbitMQ, onde os eventos são enfileirados. É possível ter várias instâncias do BugSearch.Crawler, criadas via Kubernetes, apontando para um único serviço do RabbitMQ na exchange BugSearch.
Exemplo de uso:
curl -X 'POST' \
'http://localhost:5031/Api/robot' \
-H 'accept: */*' \
-H 'Content-Type: application/json' \
-d '[
"https://www.example.com/"
]'
O lado do Cliente é responsável pela consulta aos sites catalogados. Ele oferece um resumo da quantidade de sites e termos armazenados no banco de dados, bem como um endpoint de prompt para o OpenAI.
Esse endpoint permite pesquisar por sites dentro do MongoDB e possui um algoritmo de pontuação para reorganizar os links a serem exibidos na resposta. Recebe como parâmetros "q" para a query e "l" para o limite/profundidade.
Exemplo de uso:
curl -X 'GET' \
'http://localhost:5088/Search?q=Acidente%20Grave&l=20' \
-H 'accept: text/plain'
Esse endpoint retorna um resumo dos sites catalogados e a quantidade de termos registrados. Não recebe parâmetros.
Exemplo de uso:
curl -X 'GET' \
'http://localhost:5088/Summary' \
-H 'accept: text/plain'
Esse endpoint pode ser chamado em paralelo com o Search e retorna uma resposta gerada por uma IA. Recebe como parâmetro "q".
Exemplo de uso:
curl -X 'GET' \
'http://localhost:5088/Prompt?q=ping' \
-H 'accept: text/plain'
Obs: Todos os serviços do lado do Cliente também estão contidos em containers Docker e são adequados para implantação contínua no AKS (Azure Kubernetes Service).
Aqui estão os exemplos de uso em uma tabela:
Descrição | Comando |
---|---|
Executar o crawler | curl -X 'POST' 'http://localhost:5031/Api/robot' -H 'accept: */*' -H 'Content-Type: application/json' -d '["https://www.example.com/"]' |
Pesquisar | curl -X 'GET' 'http://localhost:5088/Search?q=Acidente%20Grave&l=20' -H 'accept: text/plain' |
Resumo | curl -X 'GET' 'http://localhost:5088/Summary' -H 'accept: text/plain' |
Prompt | curl -X 'GET' 'http://localhost:5088/Prompt?q=ping' -H 'accept: text/plain' |
API:
docker build -t bugsearch-api:latest -f src/BugSearch.Api/Dockerfile .
docker run -d -p 8080:80 -t bugsearch-api:latest
Crawler:
docker build -t bugsearch-crawler:latest -f src/BugSearch.Crawler/Dockerfile .
docker run -d -p 8081:80 -t bugsearch-crawler:latest
MongoDB:
docker run -d -p 27017:27017 --name mongodb -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=senha_admin mongo:4.4.18
RabbitMQ:
docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:3-management
Seq:
docker run -d --restart unless-stopped -p 5341:80 --name seq -e ACCEPT_EULA=Y datalust/seq:latest
Se você deseja contribuir com o projeto BugSearch, sinta-se à vontade para abrir issues e enviar pull requests no repositório do GitHub.
Este projeto está licenciado nos termos da licença APACHE. Consulte o arquivo LICENSE para obter mais informações.