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 异常。
我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 异常。