【问题标题】:Npgsql: Correctly performing a full text search using an expression indexNpgsql:使用表达式索引正确执行全文搜索
【发布时间】:2021-01-13 13:26:56
【问题描述】:

Npgsql docs suggest 使用 ToTsVector 基于 expression index 执行全文搜索

.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 的情况下正确查询?

【问题讨论】:

    标签: npgsql


    【解决方案1】:

    首先,您可能想看看另一种方法,即使用 HasGeneratedTsVectorColumn 设置 TsVector 列。

    无论如何,p.Title + " " + p.Description 在被转换为 SQL 之前肯定不会被评估 - 假设 p 引用数据库列就不会发生这种情况。如果您turn on SQL logging,您应该会看到 EF Core 针对您的数据库生成的确切 SQL。为了更加确定查询使用您的表达式索引,您可以在该 SQL 上使用 EXPLAIN 并检查查询计划。

    【讨论】:

    • 我正在尝试抽象全文搜索,而其他 RDBMS 不使用向量列。我有一个直接调用你的方法,但它在不同的程序集中,我认为这可能是 LINQ 告诉我它“无法翻译”的原因。
    • 您的方法所在的程序集不应该对 LINQ 语句的可翻译性产生任何影响...我建议先在一个简单的代码示例中尝试一下,然后让它变得更复杂从那里满足您的目的。否则,您将不得不共享一个可运行的代码示例以进行进一步调查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多