EF Core 2.1中的全文搜索?

15

我打算使用全文搜索,但不是完全清楚如何在EF Core 2.1中启用它。

看起来EF Core 2.1可能已经实现了部分全文搜索的支持,但我没有找到任何关于如何使用它的教程。

我的理解是我必须为其中一列添加全文索引。

所以如果我有这个表

public class Company {
    public string Name {get; set;}
}

public class CompanyConfig : IEntityTypeConfiguration<Company>
{
  public void Configure(EntityTypeBuilder<Company> builder)
        {
            builder.HasKey(x => x.Id);
            builder.Property(x => x.Name).HasMaxLength(100).IsRequired();
        }

}

我该如何向我的Name属性添加全文索引?


1
我认为你无法使用普通的Linq样式查询来进行全文搜索。你需要做类似这样的事情:context.Entity.FromSql("SELECT * FROM TableName WHERE CONTAINS(ColumnName, @p0)", "your text") - DavidG
它可以帮助您 https://github.com/aspnet/EntityFrameworkCore/issues/1590 - Vivek Nuna
@DavidG - 那样会进行全文搜索,但我仍然需要创建全文索引,对吗?我该如何使用EF Code First来实现呢? - chobo2
1
@viveknuna - 我看到了那个链接,但我不清楚全文搜索和FreeText谓词之间的区别,这并没有帮助我。它也没有给出如何使用此FreeText谓词的示例。 - chobo2
1个回答

17

目前需要使用迁移中的SQL函数手动添加它们。暂未开发完全文本索引功能,至于EF Core 2.1,详见此问题追踪器 https://github.com/aspnet/EntityFrameworkCore/issues/11488

总之,在EF Core 2.1中,我们通过LINQ的FreeText谓词提供了全文搜索的初始支持,但这仅适用于已进行索引的数据库。EF Core和SQL Server提供程序没有任何方式来配置模型,以便可以生成正确的SQL来定义索引,包括迁移或EnsureCreated。

下面是从https://github.com/aspnet/EntityFrameworkCore/commit/2a6ccad8821f9360ae753bce41d63811185b8912测试中提取出的FreeText的C# Linq查询示例:

using (var context = CreateContext())
{
    var result = await context
        .Employees
        .Where(c => EF.Functions.FreeText(c.Title, "Representative"))
        .ToListAsync(); 

        Assert.Equal(result.First().EmployeeID, 1u);

        Assert.Equal(
            @"SELECT [c].[EmployeeID], [c].[City], [c].[Country], [c].[FirstName], [c].[ReportsTo], [c].[Title] FROM [Employees] AS [c] WHERE FREETEXT([c].[Title], N'Representative')",
                    Sql,
                    ignoreLineEndingDifferences: true,
                    ignoreWhiteSpaceDifferences: true);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接