Projetinho simples em Rails API-Only para testar as funcionalidades de Full Text Search do PostgreSQL com a gema PgSearch. Foi desenvolvido junto com o post "Busca em texto otimizada com a Gem pg_search" em meu blog, separado em duas partes:
Depois de baixar este projeto basta ter o Docker instalado e configurado em seu linux e executar os seguintes comandos em distintos terminais:
# em um terminal, dentro da pasta do projeto
$ make up
# em outro terminal, também dentro da pasta do projeto
$ make prepare-db
O comando make up
ocupa o terminal em questão pois exibe, em tempo real, o log do Rails.
Para sair, basta dar CTRL+C (interrompe o rails server
, mas o container continua rodando em
segundo plano). Já o comando make prepare-db
cria o banco de dados com as tabelas necessárias
e popula através do script abaixo que consome RSS do site da
câmara dos deputados.
# script disponível em db/seeds.rb
# É executado em "make prepare-db"
require 'rss'
require 'open-uri'
dynamics = %w[
ADMINISTRACAO-PUBLICA
AGROPECUARIA
ASSISTENCIA-SOCIAL
CIDADES
CIENCIA-E-TECNOLOGIA
COMUNICACAO
CONSUMIDOR
DIREITO-E-JUSTICA
DIREITOS-HUMANOS
ECONOMIA
EDUCACAO-E-CULTURA
INDUSTRIA-E-COMERCIO
MEIO-AMBIENTE
POLITICA
RELACOES-EXTERIORES
SAUDE
SEGURANCA
TRABALHO-E-PREVIDENCIA
TRANSPORTE-E-TRANSITO
TURISMO
]
dynamics.each do |dynamic|
url = URI.open("https://www.camara.leg.br/noticias/rss/dinamico/#{dynamic}")
feed = RSS::Parser.parse(url)
feed.items.each do |item|
Article.create(
title: item.title,
content: item.content_encoded,
created_at: item.pubDate
)
end
end
Você pode testar o desempenho das buscas tanto em requisições completas com cURL, Postman ou qualquer outra ferramenta para consulta de API de sua preferência, quanto pelo console da aplicação invocando diretamente os métodos. Criei algumas consultas de exemplo pelo Postman que podem ser importadas pelo arquivo fts_example.postman_collection.json.
Inclui a execução de testes via método e requisição JSON no Makefile, um com a gema
Benchmark e outro que mede "na mão" com uso de
Process.clock_gettime(Process::CLOCK_MONOTONIC)
.
# em um terminal
$ make up
# em outro terminal para versão com a Gema
$ make benchmark
# em outro terminal para versão sem a Gema
$ make benchmark-manual
Você obter saídas como as que seguem:
########## Method - Gem Benchmark ###########
user system total real
bad 0.314819 0.029698 0.344517 ( 4.853793)
good 0.340305 0.011930 0.352235 ( 0.483992)
########## Request - Gem Benchmark ##########
user system total real
bad 0.399208 0.109991 0.509199 ( 12.725288)
good 0.378955 0.143361 0.522316 ( 4.883817)
######### Method - Manual Benchmark #########
context average total
bad 0.0101s 4.8883s
good 0.0010s 0.4901s
######### Request - Manual Benchmark ########
context average total
bad 0.0253s 12.2896s
good 0.0095s 4.5954s
Copyright 2021 Eugenio Augusto Jimenes. Licenciado sob a licença MIT, consulte o arquivo LICENSE.
Espera-se que todos que interagem nas bases de código deste projeto - lista de problemas/sugestões, forum, email etc - sigam o código de conduta.