如何使用Npgsql与Entity Framework Core为tsvector字段设置权重?
PostgreSQL EF Core 全文搜索加权列配置
问题背景
我在使用Entity Framework Core为PostgreSQL表配置全文搜索,已经通过HasGeneratedTsVectorColumn方法成功创建了自动生成的tsvector列并建立GIN索引,代码如下:
entity.HasGeneratedTsVectorColumn( p => p.SearchVector, "english", p => new { p.Title, p.Description, p.Tags }) .HasIndex(p => p.SearchVector) .HasMethod("GIN");
现在需要给不同字段设置权重(让Title权重高于Description和Tags),实现类似以下PostgreSQL语句的效果:
ALTER TABLE books ADD COLUMN full_text_search_weighted TSVECTOR GENERATED ALWAYS AS ( setweight(to_tsvector('english', coalesce(title, '')), 'A') || setweight(to_tsvector('english', coalesce(description, '')), 'B') || setweight(to_tsvector('english', coalesce(tags, '')), 'C') ) STORED;
想确认是否可以通过C#、Npgsql和EF Core实现,还是必须编写完全自定义的迁移。
解决方案
不需要编写完全自定义的迁移,直接使用EF Core的HasComputedColumnSql方法即可实现需求,最终迁移代码如下:
entity.Property(p => p.WeightedSearchVector) .HasComputedColumnSql( "setweight(to_tsvector('english', coalesce(title, '')), 'A') || ' '|| setweight(to_tsvector('english', coalesce(description, '')), 'B') || ' '|| setweight(to_tsvector('english', coalesce(tags, '')), 'C')", stored: true); entity.HasIndex(e => e.WeightedSearchVector).HasMethod("GIN");
内容的提问来源于stack exchange,提问作者Dan O'Leary
相关产品推荐
相关产品推荐

