如何使用Npgsql 5新增的表达式索引语法拼接多个ts_vector?
1. Npgsql 5 表达式索引支持ts_vector拼接
完全可以实现,你不需要再手动写原生SQL创建索引,直接在OnModelCreating中通过EF Core的表达式定义索引即可,示例代码如下:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<SomeTable>() .HasIndex(x => EF.Functions.ToTsVector("russian", x.Name) .Concat(EF.Functions.ToTsVector("english", x.Name)) .Concat(EF.Functions.ToTsVector("simple", x.Name)) ) .HasMethod("GIN") .HasName("Name_TsVector"); }
执行迁移生成的SQL和你之前手动写的逻辑完全一致,没有额外差异。
2. 多语言统一ts_vector配置方案
你可以通过PostgreSQL的自定义文本搜索配置实现,不需要每次拼接多个ts_vector,维护成本更低,性能也更好。操作步骤如下:
- 第一步创建自定义搜索配置,整合多语言字典规则:
-- 创建自定义配置,基于simple配置复制生成 CREATE TEXT SEARCH CONFIGURATION multilingual (COPY = simple); -- 为不同词类型配置多语言分词规则,这里同时加了英语、俄语词干提取和simple规则 ALTER TEXT SEARCH CONFIGURATION multilingual ADD MAPPING FOR asciiword, word WITH english_stem, russian_stem, simple;
- 第二步直接用自定义配置创建索引和查询即可:
-- 创建索引只需要调用一次to_tsvector CREATE INDEX "Name_TsVector" ON "SomeTable" USING GIN (to_tsvector('multilingual', "Name")); -- 查询时也统一用同一个配置 SELECT * FROM "SomeTable" WHERE to_tsvector('multilingual', "Name") @@ to_tsquery('multilingual', '你的搜索关键词');
后续如果需要调整支持的语言,只需要修改multilingual这个自定义搜索配置的映射规则即可,不需要改动索引或业务查询代码。
内容的提问来源于stack exchange,提问作者Virall
相关产品推荐
相关产品推荐

