0

LIKE在 SQL Server 中,使用 EF Core 5 和 PredicateBuilder创建不区分大小写、不区分重音的查询相对简单。

例如:

  • 用户正在尝试使用标准北美键盘在数据库中查找客户(即重音输入有点痛苦)。
  • 搜索helene应该匹配Mme. Hélène Laurendeau。重要的是我们可以匹配一个子字符串,而不仅仅是一个前缀或后缀。

假设我们有一个Customer具有 property的实体Name,以下代码段将按预期工作:

var predicate = PredicateBuilder
                 .New<Customer>(c => EF.Functions.Collate(c.Name, 
                                                          "Latin1_general_CI_AI")
                                                 .Contains("helen"));

var customers = context.Customers.AsExpandable().Where(predicate);

我们如何在 PostgreSQL(10 或更高版本)中执行相同的查询?

我们刚刚从 SQL Server 进行了快速(基本上是 1:1)迁移,并正在尝试更新我们的代码以确保可以进行一般迁移。这个问题没有考虑到可能的查询速度问题(有关更多信息,请参阅链接。)

4

1 回答 1

1

假设您新创建的 Postgres 数据库是 UTF8(我相信它是默认的)

  1. 确保unaccent已安装。如果不,CREATE EXTENSION unaccent;
  2. 更新您predicate的如下:
var predicate = PredicateBuilder
                  .New<Customer>(c => EF.Functions.ILike(EF.Functions.Unaccent(c.Name),
                                                        "%helen%"));

  1. 利润!:)

注意:可以整理关于 SO 和其他来源的各种问题的答案以得出这个结论,但我一直无法找到一个有意义的地方,可以很容易地找到对此解决方案发表评论。另外,我不认为引入全文搜索是这个问题的答案,但如果我弄错了,我很乐意更新它。

这个答案是迄今为止我见过的最好和最完整的答案,并强烈鼓励人们在有时间的时候深入研究它。但是,如果您尝试从 SQL Server 迁移到 Postgres 作为原型,那么这个答案应该可以为您节省很多痛苦和时间 :)

lowercase一些答案建议在列的/ -ed 版本上创建索引,unaccent但这并不直接起作用,因为unaccentis not IMMUTABLE。您可以根据需要包装它们,然后将它们编入索引(链接中的示例。)

此外,尝试通过EF.Functions(在服务器上创建它之后)直接传递排序规则似乎也不起作用,但也许我在那里缺少关于 Postgres 的东西。

可以调整个别列排序规则

一些相关问题包括:

其他来源:

于 2021-01-26T09:48:54.827 回答