Nosso motor de busca
#2 | filtrando as URL’s

Continuação de — https://medium.com/@devton/e660e7786e21


o código fonte pode ser baixado no meu github

Agora com o crawler funcionando precisamos salvar esses links em algum lugar, nesse vamos utilizar o PostgreSQL como o banco principal. ☺ [Link de um vídeo legalzinho pra quem pensou no MySQL]

Antes de salvar uma URL vamos aplicar um filtro, assim podemos deixar de lado os links que o conteúdo não é relevante para o nosso sistema, por exemplo.

www.example.com/produtos -> tem conteúdo relevante
www.example.com/como-funciona -> não tem conteúdo relevante

Para conseguir filtrar os links vamos criar uma tabela chamada negative_expressions que vai guardar as expressões que permite identificar se um link é valido.

código da migração para o modelo NegativeExpression
- arquivo spec/models/negative_expression_spec.rb

basicamente a gente passa uma URL e ele nos diz se existe alguma expressão negativa no banco para aquela URL.

NegativeExpression.url_match? 'http://www.example.com/bad_url'
#=> true
- arquivo app/models/negative_expression.rb

pronto agora conseguimos verificar se uma url é valida ou não, você pode testar direto no console do rails.

- rails console
irb> NegativeExpression.create({
domains: ['example.com'],
expressions: ['/page_1', '/bad_page_\d']
})
irb> NegativeExpression.url_match? 'http://example.com/page_2'
#=> false
irb> NegativeExpression.url_match? 'http://example.com/page_1'
#=> true
irb> NegativeExpression.url_match? 'http://example.com/bad_page_20'
#=> true

Sobre não fazer o match direto no ruby, aqui vai um benchmark que eu fiz fazendo essa comparação

           user     system   total    real
PostgreSQL 0.030000 0.010000 0.040000 ( 0.759193)
Ruby 2.360000 0.050000 2.410000 ( 2.529758)
você pode ver o código do benchmark aqui

Pronto ☺

No próximo post iremos criar a tabela e mais alguns serviços que irão ajudar na hora de salvar os links no nosso banco.

continua…

Show your support

Clapping shows how much you appreciated Antônio Roberto’s story.