如果底层表已被索引,我们为什么需要全文索引
问题描述:
比方说,我们有一个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做