Postgresql 和 .Net Core 2.1 中的全文搜索问题

Problems with Full Text Search in Postgresql & .Net Core 2.1

我post这个问题是因为我还没有发现类似的问题。我正在尝试确保在 .net 核心应用程序中进行全文搜索,并且根据 npgsql 文档我有: 1) 型号

 public class User
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Surname { get; set; }
        public long License { get; set; }
        public NpgsqlTsVector SearchVector { get; set; }
    }

2) 数据库上下文:

  modelBuilder.Entity<User>()
       .HasIndex(p => p.SearchVector)
       .ForNpgsqlHasMethod("GIN");

3) 迁移:

 migrationBuilder.Sql(
            @"CREATE TRIGGER user_search_vector_update BEFORE INSERT OR UPDATE 
            ON ""Users"" FOR EACH ROW EXECUTE PROCEDURE
            ts`enter code here`vector_update_trigger(""SearchVector"", 'pg_catalog.english', ""Name"", ""Surname"");");

现在,我正在尝试在我的应用程序中使用 FTS,其中搜索方法来自 header 'phase'(字符串)。

[HttpGet]
    public async Task<IActionResult> Search([FromHeader] string phase)
    {
        NpgsqlTsQuery tsVestor = EF.Functions.ToTsQuery("english", phase);
        var response = Ok(_context.Users.Where(c => c.SearchVector.Matches(phase)).ToList());
        return response;
    }

我得到了:

NotSupportedException:不支持指定的方法。 Microsoft.EntityFrameworkCore.NpgsqlFullTextSearchDbFunctionsExtensions.ToTsQuery(DbFunctions _, string config, string query) in NpgsqlFullTextSearchDbFunctionsExtensions.cs

我也尝试通过 Header 词位和注释行发送:

NpgsqlTsQuery tsVestor = EF.Functions.ToTsQuery("english", phase);

但我得到:PostgresException:42883:运算符不存在:tsvector @@ text

有人知道我做错了什么吗?

编辑 ---- :

好的,我找到了我的问题的答案。从字符串转换为 NpgsqlTsQuery 必须在 Matches 方法内:

 public async Task<IActionResult> SearchUsers([FromHeader] string phase)
    {
        return Ok(_context.Users.Where(c => c.SearchVector.Matches(EF.Functions.ToTsQuery(phase))));
    }

将此转换放在 Matches 方法之外抛出 "NotSupportedException",并将纯文本作为函数参数抛出 42883 Exeception。

现在,我做错了什么很清楚了。

正如@sonofforester 所建议的那样,我回答了我自己的问题:

从字符串转换为 NpgsqlTsQuery 必须在 Matches 方法内:

public async Task<IActionResult> SearchUsers([FromHeader] string phase)
{
    return Ok(_context.Users.Where(c => c.SearchVector.Matches(EF.Functions.ToTsQuery(phase))));
}

将此对话置于 Matches 方法之外引发 "NotSupportedException",并将纯文本作为函数参数引发 42883 异常。