Uma implementação simples de mecanismo de pesquisa.
Fins de estudo, principalmente para compreender os detalhes de implementação de como os motores de busca são feitos, compensações de desempenho e estrutura.
A ideia é fazer uma aplicação isomórfica da UI para o sistema de banco de dados.
O aplicativo pode ser implantado usando o docker ou o binário lançado no github.
./searchzin -c <path-to-config>.yml
Depois disso, você pode consultar http://localhost:8080
para ver a página de pesquisa.
A configuração pode ser feita pelo arquivo de configuração localizado por padrão em /etc/searchzin/config.yml
ou fornecendo chaves de configuração no formato -C key=value
, o segundo formulário substitui o primeiro.
Padrões de configuração:
port : 8080 # Service port
path :
log : /var/log/searchzin # Log directory
data : /var/lib/searchzin # Data directory
Toda a estrutura do projeto é feita em golang, utilizando o framework gin
.
As dependências são gerenciadas usando dep
.
A maior parte da cadeia de ferramentas do projeto é gerenciada pelo Makefile
, os alvos importantes são:
install
: Instale as dependências necessárias e os ganchos gitreadme
: Executa a inclusão de arquivos README.md
lint
: executa linting e formatação do códigotest
: Bem, compile e execute testes de unidadebuild
: Cria uma pasta distribuível linux
em dist
run
: executa o código usando go run
run-dev
: Cria e executa um contêiner dockerrelease
: Cria uma imagem docker de lançamentopublish
: publica a imagem docker no dockerhub usando o conteúdo do arquivo VERSION
como a versãopublish-latest
: publica a imagem docker no dockerhub com a tag latest
watch
: Executa lint
e test
na modificação do arquivofunc-test
: Executa testes funcionais dentro da pasta de features
Existem 6 componentes principais neste mecanismo de pesquisa:
Cada componente tem uma responsabilidade clara no sistema, e todos trabalham juntos para responder às dúvidas e solicitações de indexação de documentos.
É responsável por armazenar e fornecer identificações aos documentos recém-criados. As restrições são:
id
sid
sem colisões para persistênciassd
ou hdd
Armazena um índice reverso de "termos" e documentos
terms
para documentar relações de conjuntokey
para consultas com aproximação de palavras-chaveDado um novo documento, ele o compreende e salva tanto no banco de dados de índice quanto no banco de dados de documentos.
Analisa a entrada do usuário e a transforma em um plano de consulta usando uma estrutura de dados semelhante a uma árvore.
lucene
Dada uma árvore de consulta, otimiza-a estando atento às restrições e ao ambiente em que será executada.
Após ter um plano estruturado a consulta recupera os dados efetivos do banco de dados index
, etapa esta realizada pelo executor.
Essa linguagem de consulta é fortemente baseada na do lucene, para simplificar o design e entender quais compensações foram feitas.
O cenário de teste atual que será utilizado será a indexação de podcasts por nome, conteúdo e tags.
O uso básico pode ser encontrado em searchzin-example
.
searchzin está disponível sob a licença do MIT.