如果底层表已被索引,我们为什么需要全文索引

问题描述:

比方说,我们有一个Employees表,其中有Note字段上的全文索引。 我们可以通过这样的搜索查询该表:SELECT ID FROM Employees WHERE CONTAINS(Note, 'scout')如果底层表已被索引,我们为什么需要全文索引

然而,如果我们创建为SELECT ID, Note FROM Employees简单的东西的EmployeesView,我们无法查询与SELECT ID FROM EmployeesView WHERE CONTAINS(Note, 'scout')

该查询该视图将提高以下错误:

Cannot use a CONTAINS or FREETEXT predicate on table or indexed view 'EmployeesView' because it is not full-text indexed.

我想了解为什么它是不可能的,以便对其基础表上运行FTS像它对于其他常规指标?

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

注#2我们的数据库比所提供的例子更复杂。我们有许多视图使用相同的全文索引表,一些可以被索引,而另一些则不可以,因为模式绑定限制。如果每个视图都相同,我也认为它有点奇怪(并且存在巨大的磁盘空间浪费)以将FTI添加到每个视图中。

对于我自己的问题(我不会接受它),这不是真正的答案,但对于任何正在寻找解决方法的人来说,您可以在视图上使用全文搜索而无需在其上创建FTI,

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')) 
可以通过使用内表和视图之间JOIN做