perf(search): trigram indexes for sender/domain filters (#17)
CI / backend (push) Successful in 50s
CI / frontend (push) Successful in 14s
Deploy Staging / deploy (push) Successful in 29s
Security / secrets (push) Successful in 4s
Security / dependencies (push) Successful in 58s
CI / backend (pull_request) Successful in 53s
CI / frontend (pull_request) Successful in 15s
Security / secrets (pull_request) Successful in 4s
Security / dependencies (pull_request) Successful in 56s

This commit was merged in pull request #17.
This commit is contained in:
2026-07-02 01:55:59 +02:00
parent c0c1777d3f
commit 06b050a5ed
4 changed files with 834 additions and 0 deletions
@@ -75,6 +75,16 @@ public class AppDbContext : DbContext, IAppDbContext
"setweight(to_tsvector('english', coalesce(\"BodyText\",'')), 'B')",
stored: true);
modelBuilder.Entity<Email>().HasIndex(e => e.SearchVector).HasMethod("GIN");
// Trigram GIN indexes so the sender/domain `.Contains()` filters in SearchService
// (which translate to `LIKE '%x%'`, non-sargable on a btree) become index-accelerated.
// Needs pg_trgm (enabled by the EnablePgTrgm migration).
modelBuilder.Entity<Sender>().HasIndex(s => s.Address)
.HasMethod("gin").HasOperators("gin_trgm_ops");
modelBuilder.Entity<Sender>().HasIndex(s => s.DisplayName)
.HasMethod("gin").HasOperators("gin_trgm_ops");
modelBuilder.Entity<MailDomain>().HasIndex(d => d.Name)
.HasMethod("gin").HasOperators("gin_trgm_ops");
}
else
{