You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中NpgsqlTsVector与Unaccent协同实现全文检索及无重音搜索

解决方案:NpgsqlTsVector 结合 Unaccent 实现带重音忽略的全文检索

1. 前置准备:安装 Unaccent 扩展

先确保你的 PostgreSQL 实例已安装 Unaccent 扩展,执行以下 SQL:

CREATE EXTENSION IF NOT EXISTS unaccent;

2. 修改 TSVector 生成逻辑(嵌入 Unaccent 处理)

要让全文检索向量生成时自动去除重音,需调整实体类的 TSVector 映射,让其基于 unaccent() 处理后的字段生成。

C# 实体类与 EF Core 配置

假设你的实体类是 Product,Name 是检索字段,Matches 是映射到数据库的 TSVector 列:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public TsVector Matches { get; set; } // 对应数据库 tsvector 类型
}

// 在 DbContext 的 OnModelCreating 中配置
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Product>()
        .Property(p => p.Matches)
        .HasComputedColumnSql("to_tsvector('portuguese', unaccent(\"Name\"))", stored: true);
    
    // 创建基于处理后向量的 GIN 索引,保证查询性能
    modelBuilder.Entity<Product>()
        .HasIndex(p => p.Matches)
        .HasMethod("GIN");
}

核心改动是把原 to_tsvector('portuguese', "Name") 替换为 to_tsvector('portuguese', unaccent("Name")),并设置为存储列(stored: true)确保索引生效。

3. 调整查询逻辑:搜索词同步做 Unaccent 处理

查询时,需将输入的搜索词先经 unaccent() 处理,再转换为 tsquery,才能和预处理后的 TSVector 匹配:

C# 查询代码示例

public async Task<List<Product>> SearchProducts(string searchTerm)
{
    return await _context.Products
        .Where(p => p.Matches.Matches(EF.Functions.ToTsQuery("portuguese", EF.Functions.Unaccent(searchTerm))))
        .ToListAsync();
}

生成的 SQL 查询示例

修改后的查询会自动生成类似以下的 SQL:

SELECT "p"."Id", "p"."Name", "p"."Matches"
FROM "Products" AS "p"
WHERE "p"."Matches" @@ to_tsquery('portuguese', unaccent(@__searchTerm_0))

4. 效果验证

  • 输入 BLUE MOUSE 时,依然能匹配 WIRELESS BLUE MOUSE(全文检索功能保留)
  • 输入 JOSE 时,会同时返回 JOSE 和 JOSÉ(重音被忽略)

额外说明

  • 必须指定葡萄牙语字典 'portuguese',确保分词、停用词处理符合语言特性
  • 如果需要多个字段参与检索,可在 to_tsvector 中拼接多个 unaccent(字段),例如:
    to_tsvector('portuguese', unaccent("Name") || ' ' || unaccent("Description"))
    

内容的提问来源于stack exchange,提问作者AndreR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 16:55:01