Npgsql:使用表达式索引正确执行全文搜索
Npgsql: Correctly performing a full text search using an expression index
Npgsql 文档suggest performing a full text search based on an expression index 使用 ToTsVector
.Where(p => EF.Functions.ToTsVector("english", p.Title + " " + p.Description).Matches("Npgsql"))
据我了解,表达式索引要求查询使用与创建索引相同的表达式,即 "Name" || ' ' || "Description"
。
但是在我看来,p.Title + " " + p.Description
在被翻译成 SQL 之前被评估,因为 ToTsVector 采用纯字符串
public static NpgsqlTsVector ToTsVector(this DbFunctions _, string config, string document);
是我错了还是索引不会被利用?如果我是正确的,有没有办法在不使用原始 SQL 的情况下正确查询?
首先,您可能想看看另一种方法,即使用 HasGeneratedTsVectorColumn 设置 TsVector 列。
无论如何,p.Title + " " + p.Description
在被翻译成 SQL 之前绝对不会被评估——假设 p
指的是一个数据库列,那是不可能发生的。如果您 turn on SQL logging,您应该会看到 EF Core 针对您的数据库生成的确切 SQL。为了更加确定查询使用了您的表达式索引,您可以在该 SQL 上使用 EXPLAIN 并检查查询计划。
Npgsql 文档suggest performing a full text search based on an expression index 使用 ToTsVector
.Where(p => EF.Functions.ToTsVector("english", p.Title + " " + p.Description).Matches("Npgsql"))
据我了解,表达式索引要求查询使用与创建索引相同的表达式,即 "Name" || ' ' || "Description"
。
但是在我看来,p.Title + " " + p.Description
在被翻译成 SQL 之前被评估,因为 ToTsVector 采用纯字符串
public static NpgsqlTsVector ToTsVector(this DbFunctions _, string config, string document);
是我错了还是索引不会被利用?如果我是正确的,有没有办法在不使用原始 SQL 的情况下正确查询?
首先,您可能想看看另一种方法,即使用 HasGeneratedTsVectorColumn 设置 TsVector 列。
无论如何,p.Title + " " + p.Description
在被翻译成 SQL 之前绝对不会被评估——假设 p
指的是一个数据库列,那是不可能发生的。如果您 turn on SQL logging,您应该会看到 EF Core 针对您的数据库生成的确切 SQL。为了更加确定查询使用了您的表达式索引,您可以在该 SQL 上使用 EXPLAIN 并检查查询计划。