【问题标题】:Why do we need Full Text index on view if the underlying table is already indexed如果基础表已经被索引,为什么我们需要查看全文索引
【发布时间】:2017-09-27 16:10:16
【问题描述】:

假设我们有一个Employees 表,在Note 字段上有一个全文索引。 我们可以使用这样的查询来搜索该表:SELECT ID FROM Employees WHERE CONTAINS(Note, 'scout')

但是,如果我们使用像 SELECT ID, Note FROM Employees 这样简单的东西创建一个 EmployeesView,我们将无法使用 SELECT ID FROM EmployeesView WHERE CONTAINS(Note, 'scout') 查询该视图

该查询会引发以下错误:

不能对表或索引视图“EmployeesView”使用 CONTAINS 或 FREETEXT 谓词,因为它不是全文索引。

我想了解为什么视图不能像对其他常规索引那样针对其基础表运行 FTS?

注意 #1 这个问题不是关于如何在视图上创建全文索引,因为这已经是 answered。这个问题是为了理解为什么我们必须这样做。

注意 #2 我们的数据库比提供的示例更复杂。我们有许多使用同一个全文索引表的视图,有些可以被索引,而有些则不能,因为模式绑定限制。我还认为,如果每个视图都相同,则向每个视图添加 FTI 有点奇怪(并且会浪费大量磁盘空间)。

【问题讨论】:

    标签: sql-server full-text-search sql-server-2016


    【解决方案1】:

    这并不是我自己问题的真正答案(我不会接受),但对于正在寻找一种变通解决方案以允许您在视图上使用全文搜索而不在其上创建 FTI 的任何人,您可以通过在表和视图之间使用 INNER JOIN 来做到这一点:

    SELECT * FROM EmployeesView INNER JOIN Employees ON EmployeesView.ID = Employees.ID
    WHERE CONTAINS(Employees.Note, 'scout')
    

    或使用WHERE IN 子句:

    SELECT * FROM EmployeesView
    WHERE ID IN (SELECT ID FROM Employees WHERE CONTAINS(Note, 'scout'))
    

    【讨论】:

      猜你喜欢
      • 2020-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-13
      • 1970-01-01
      • 2021-03-20
      • 2014-08-29
      • 1970-01-01
      相关资源
      最近更新 更多