Sometimes it is not enough to know if two strings are equals or not. Instead, we need to get an idea of how different they are. For example, ant and aunt are two different words. However, not as different as ant and antidote. The “edit distance” between ant and aunt is smaller than the “edit […]
Phrase Queries and Positional Indexes in C#
This is another post about how to implement a basic Search Engine. Previously, I explained: how to produce an inverted index using C# to support queries. how to improve the tokenization process, implementing the Porter Stemming Algorithm. how to improve the querying process supporting boolean queries. In this post, I will share how to implement […]
Processing boolean queries on inverted indexes in C#
In the first post of this series, I explained how to produce an inverted index using C#. In the second post, I explained how to improve the tokenization process, using the Porter Stemming Algorithm. Now, I will share how to process boolean queries. Inverted Index? Within a document collection, I assume that each document has […]
Implementing the Porter Stemming Algorithm in C#
In a previous post, I started an elementary search library using C#. Now, I will improve it adding a Porter Stemming filter to the indexing and searching processes. The resulting source code is available on my Github. Note: I’ve been learning about it from the “Introduction to Information Retrieval” book. Stemming? From the “Introduction to […]
A First Take at Building an Inverted Index and Querying Using C#
In this post, I would like to share my first attempt to create a (still) elementary search library. The source code is available on my GitHub. I am learning how to do it from the “Introduction to Information Retrieval” book (which is part of my current reading list). Also, all my code is inspired by […]
O verdadeiro motivo para evitar dívidas técnicas
Quando você deixa de escolher bons nomes para namespaces, classes, métodos ou variáveis, você faz com que o programador que precisará dar manutenção nesse código (talvez, você mesmo) precise de mais tempo para o entender. Criando classes e métodos grandes, pouco coesos, você, além de deixar o código mais difícil de entender, torna o versionamento […]
Quatro práticas equivocadas que dificultam a modernização de sistemas corporativos legados
Pode parecer estranho, mas software também envelhece. Por isso, precisamos estar preparados para seu processo de modernização. Afinal, uma abordagem inadequada pode custar muito caro e até mesmo colocar tudo a perder. Programs, like people, get old. We can’t prevent aging, but we can understand its causes, take steps to limits its effects . . […]
Compilação “ahead-of-time” (ReadyToRun) no .NET Core 3
Em um post anterior, falamos dos potenciais ganhos de performance resultantes da opção de compilação em camadas, fornecida pelo JIT. Na prática, o JIT compila um mesmo código, múltiplas vezes, gerando, em cada nova compilação, um código ainda melhor que o anterior. Além dessa nova opção, há também a alternativa de pedirmos que o compilador gere […]
O que significa “Serverless Architecture”? BaaS? FaaS?
Serverless Architecture é tema recorrente em eventos e discussões sobre tendências em arquitetura de software. Entretanto, como ocorre com outros trending topics, é cercado de informações desencontradas. O termo serverless, sozinho, induz à confusão. Diferente do que pode ser entendido em um primeiro momento, arquiteturas Serverless não implicam na inexistência de um servidor. Pelo contrário, há processos e […]
Usando “Specification Pattern” para respeitar o “Open/Closed Principle”
Como implementar regras de negócio que podem mudar com o passar do tempo sem violar o “Open/Closed Principle” do SOLID? Afinal, a violação desse princípio deixaria os códigos difíceis de manter além de implicar na escritas de testes que “quebrariam” pelos motivos errados. Na programação orientada a objeto, o princípio do aberto/fechado estabelece que “entidades de software (classes, […]