如果基础表已经编入索引,为什么我们需要在视图上使用全文索引

时间:2017-09-27 16:10:16

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

我们假设我们在Employees字段上有一个Note表,其中包含全文索引。  我们可以使用如下查询搜索该表:SELECT ID FROM Employees WHERE CONTAINS(Note, 'scout')

但是,如果我们使用EmployeesView这样简单的内容创建SELECT ID, Note FROM Employees,我们就无法使用SELECT ID FROM EmployeesView WHERE CONTAINS(Note, 'scout')

查询该视图

该查询会引发以下错误:

  

不能在表或索引视图上使用CONTAINS或FREETEXT谓词' EmployeesView'因为它不是全文索引。

我想理解为什么视图对其基础表运行FTS是不可能的,就像对其他常规索引一样?

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

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

1 个答案:

答案 0 :(得分: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'))